Người đóng gói là mộtcông cụ tạo ảnh VM nguồn mởtừHashicorp. Nó giúp bạn tự động hóa quá trình tạo hình ảnh máy ảo trên đám mây và môi trường ảo hóa tại chỗ.
Nói một cách đơn giản, bất kỳ bước thủ công nào bạn thực hiện để tạo hình ảnh máy ảo đều có thểtự động thông qua mẫu cấu hình Packer đơn giản. Bạn khai báo trạng thái của hình ảnh VM mà bạn cần và Packer xây dựng nó cho bạn.
Mục lục trốn
1. Trường hợp sử dụng gói
2.Cài đặt gói
3.Xây dựng hình ảnh VM (AWS AMI) bằng Trình đóng gói
4. Tham khảo mẫu Packer
5.Giải thích về mẫu HCL của Packer
6.Tạo AWS AMI bằng mẫu HCL của Packer
7. Xây dựng trình đóng gói gỡ lỗi
Nhật ký xây dựng 8.Packer
9. Mẫu trình đóng gói thử nghiệm đơn vị
10. Các lỗi có thể xảy ra của Packer
11.Một vài lời khuyên về người đóng gói
12.Kết luận
Trường hợp sử dụng máy đóng gói
Sau đây là các trường hợp sử dụng chính của Packer.
- Tạo hình ảnh vàng:Với trình đóng gói, bạn có thể tạo mẫu các cấu hình cần thiết cho hình ảnh VM vàng có thể được sử dụng trong các tổ chức.
- Bản vá VM hàng tháng:Bạn có thể tích hợp Packer vào quy trình vá hình ảnh VM hàng tháng của mình.
- Cơ sở hạ tầng bất biến:Nếu bạn muốn tạo mộtcơ sở hạ tầng bất biếnbằng cách sử dụng hình ảnh VM làm thành phần lạ có thể triển khai, bạn có thể sử dụng Packer trong quy trình CI/CD của mình.
Về cơ bản, tất cả các trường hợp sử dụng trên đều là một phần củaĐường dẫn CI hoặc đường dẫn mã IaaCtrong đó mọi mẫu Packer đều được kiểm soát phiên bản. Ngay cảphát triển hoặc cập nhật mẫu đóng góiphải trải qua tất cả các bài kiểm tra CI trước khi được triển khai trong môi trường dự án.
Hướng dẫn đóng gói cho người mới bắt đầu
Trong hướng dẫn dành cho người mới bắt đầu sử dụng Packer này, bạn sẽ tìm hiểu những điều sau.
- Các khối xây dựng cơ bản của Packer.
- Quy trình làm việc của nhà đóng gói
- Cài đặt gói
- Tìm hiểu mẫu HCL của Packer.
- Tạo AWS AMI bằng Packer
Hãy bắt đầu với thiết lập Packer.
Trình đóng gói cài đặt
Bạn có thể cài đặt Packer trên máy trạm cục bộ hoặc trên phiên bản đám mây. Trong dự án thực tế, việc cài đặt Packer sẽ là một phần củaJenkinstác nhân hoặc bất kỳ công cụ nào là một phần của quy trình CI/CD.
Ghi chú:Nếu bạn đang thiết lập Packer trên máy trạm của mình cho mục đích gỡ lỗi hoặc thử nghiệm, bạn cần có quyền truy cập AWS và khóa bí mật để Packer tương tác với các dịch vụ AWS. Đảm bảo bạn đã đặt khóa truy cập AWS trên tệp
~/.aws/thông tin xác thực
. Không bắt buộc phải có tệp thông tin xác thực. Bạn cũng có thể chuyển thông tin xác thực AWS bằng cách sử dụng khai báo biến đóng gói.
Bước 1:Tải xuống tệp thực thi Packer mới nhất từ trang tải xuống Packer.https://www.packer.io/downloads.html. Nó có sẵn cho Windows, Linux và các nền tảng Unix khác.
Đối với Linux, bạn có thể cài đặt Packer từ trình quản lý gói tương ứng hoặc bạn có thể lấy liên kết tải xuống từ nút tải xuống và tải xuống bằng cách sử dụngquên
.
Ví dụ: Trong Ubuntu
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpgecho "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $ (lsb_release -cs) chính" | sudo tee /etc/apt/sources.list.d/hashicorp.listsudo apt update && sudo apt install pack
Bước 2:Xác minh cài đặt trình đóng gói bằng cách thực hiện lệnh đóng gói.
phiên bản đóng gói
Bạn sẽ thấy đầu ra như hình dưới đây.
Xây dựng hình ảnh VM (AWS AMI) bằng Packer
Xây dựng hình ảnh VM bằng Packer là một quá trình đơn giản. Quy trình làm việc có phần giống vớixây dựng máy ảo bằng Vagrant
Hãy xem sơ đồ quy trình làm việc của Packer cấp cao sau đây.
Hãy chia nhỏ quá trình.
- Khai báo tất cả các cấu hình VM cần thiết bằng HCL (ngôn ngữ cấu hình Hashicorp) hoặc tệp JSON. Hãy gọi nó làMẫu đóng gói.
- Để xây dựng hình ảnh VM, hãy thực thi Trình đóng gói bằng mẫu Trình đóng gói..
- Packer xác thực nhà cung cấp đám mây từ xa và khởi chạy máy chủ. Nếu bạn thực thi Packer từ môi trường đám mây, nó sẽ tận dụng tài khoản dịch vụ đám mây để xác thực.
- Packer thực hiện kết nối từ xa tới máy chủ (SSH hoặc Winrm).
- Sau đó, nó sẽ định cấu hình máy chủ dựa trên nhà cung cấp mà bạn đã chỉ định trong mẫu Packer (Shell script, Ansible, Chef, v.v.).
- Đăng ký AMI
- Xóa phiên bản đang chạy.
Tham khảo mẫu trình đóng gói
Tất cả mã được sử dụng trong bài viết này được lưu trữ trên mộtKho lưu trữ Github Mẫu Packer.Bạn có thể sao chép hoặc phân nhánh nó để giữ nó làm tài liệu tham khảo. Hoặc bạn có thể sử dụng mẫu trực tiếp từpacker-aws-shell
thư mục
bản sao git https://github.com/techiescamp/packer-templates
Xin vui lòng đóng góp cho repo với nhiều mẫu hơn.
Giải thích về mẫu HCL của trình đóng gói
Ghi chú:Từ phiên bản
v1.7
Packer sử dụng các mẫu định dạng HCL. Hỗ trợ JSON cũng có ở đó. Tuy nhiên, bạn nên thay đổi sang định dạng HCL vì các tính năng mới được phát triển sẽ không được thêm vào mẫu dựa trên JSON. Nếu dự án hoặc tổ chức hiện tại của bạn sử dụng mẫu JSON, bạn có thể chuyển đổi chúng thành mẫu HCL. Nhìn thấyNâng cấp JSON lên HCLđể biết thêm thông tin.
Chúng ta hãy xem chi tiết mẫu HCL Packer.
Đây là cấu trúc mẫu trình đóng gói cấp cao.
Mẫu HCL có một vài khối. Hãyhiểu từng khối với cấu hình mẫutrước khi chúng tôi tạo AMI bằng Packer
Biến
Sử dụng khối biến, bạn có thể khai báo các tham số Packer mặc định dưới dạng biến. Các biến được khai báo có thể được ghi đè từ dòng lệnh trong quá trình xây dựng trình đóng gói.
Bạn có thể sử dụng các biến đóng gói cho cấu hình động khi sử dụng với các công cụ CI như Jenkins.
Hãy hiểu các tình huống khác nhau để sử dụng biến đổi.
Sử dụng biến trong mẫu
Cácbiến
khối chứa tất cả các biến mặc định trong một mẫu. Một ví dụ đã được biểu diễn ở dưới.
biến "ami_id" { type = chuỗi mặc định = "ami-6f68cf0f"}
Các biến được khai báo có thể được truy cập trong các phần khác của mẫu bằng cách sử dụng"${var.app_name}"
cú pháp. Một ví dụ đã được biểu diễn ở dưới.
source_ami = "${var.ami_id}"
Sử dụng biến môi trường trong mẫu
Packer cho phép bạn sử dụng các biến môi trường hệ thống. Trước tiên, bạn cần khai báo các biến môi trường trong phần biến để sử dụng chúng trong các phần khác của mẫu.
Giả sử bạn muốn sử dụngSCRIPT_PATH
biến môi trường chứa đường dẫn đến tập lệnh shell phải được sử dụng trong trình cung cấp shell. Bạn có thể khai báo biến đó như hình dưới đây.
biến "script_path" { mặc định = env("SCRIPT_PATH")}
Sau đó, bạn có thể sử dụngscript_path
biến trong khối được cung cấp như hiển thị bên dưới.
nhà cung cấp "shell" { script = "${var.script_path}/demo-script.sh" }
Sử dụng biến dòng lệnh
Tất cả các biến được khai báo trong khối biến có thể được ghi đè trong thời gian chạy Packer bằng cách sử dụng-đã từng là
một lá cờ theo sau là giá trị biến.
Ví dụ,
xây dựng trình đóng gói -var 'app_name=httpd' ami.pkr.hcl
Ghi chú:Trong ví dụ trên,
ami.pkr.hcl
là tập tin mẫu đóng gói.
Sử dụng tệp HCL
Bạn cũng có thể sử dụng tệp HCL để vĩnh viễn hóa tất cả các biến trong mẫu. Giả sử chúng ta có một tệp biến có tênvars.packer.hcl
, bạn có thể thêm các biến như hình dưới đây.
app_name = "httpd"ami_id = "ami-6f68cf0f"
Và trong quá trình xây dựng trình đóng gói, bạn có thể chuyển tệp này như hiển thị bên dưới.
xây dựng trình đóng gói -var-file="vars.packer.hcl"
Sử dụng tệp JSON
Bạn cũng có thể liệt kê tất cả các biến trong tệp JSON và chuyển nó trong quá trình xây dựng trình đóng gói như hiển thị bên dưới.
bản dựng trình đóng gói -var-file=variables.json ami.pkr.hcl
người dân địa phương
Các biến cục bộ cũng là các biến nhưng chúng không thể bị ghi đè. Nó nằm trong phạm vi mẫu Packer.
người dân địa phương {app_name = "httpd"}
Bạn có thể nội suy một biến với một biến cục bộ như dưới đây.
người dân địa phương { ami_name = "${var.app_name}-prodcution"}
Nếu bạn muốn vượt qua bất kỳthông tin nhạy cảm trong một biến, bạn có thể chuyển đổi nó thành giá trị cục bộ rồi đánh dấu nó là nhạy cảm. Bằng cách này, giá trị sẽ không được in ở bất kỳ đâu trong nhật ký bản dựng Packer.
local "secret_key" { key = "${var.secret_key}" nhạy cảm = true}
Nguồn
Packer hoạt động dựa trên khái niệm plugin xây dựng. Đối với mỗi nhà cung cấp đám mây, đều có các plugin xây dựng cụ thể tương tác với API của nhà cung cấp đám mây để tạo hình ảnh.
Trong khối này, chúng tôi đề cập đến chi tiết plugin của trình tạo. Ví dụ: nếu bạn muốn xây dựng AWS AMI, bạn có thể chỉ địnhamazon-ebs
như một plugin xây dựng. Bạn phải cung cấp tất cả các tham số bắt buộc liên quan đếnamazon-ebs
plugin xây dựng.
Ngoài ra, trong khối mã sau, bạn có thể thấy rằng chúng tôi đang gọi${var.ami_id}
được khai báo trong khối biến.
Kiểm tratài liệu plugin xây dựng chính thứcđể biết về danh sách các nhà xây dựng được hỗ trợ.
nguồn "amazon-ebs" "httpd" { ami_name = "PACKER-DEMO-${local.app_name}" instance_type = "t2.micro" vùng = "eu-west-1" source_ami = "${var.ami_id}" ssh_username = tags "ec2-user" = { Env = "DEMO" Name = "PACKER-DEMO-${var.app_name}" }}
xây dựng
Trong khối này, chúng tôi khai báo tất cả các nhà cung cấp và bộ xử lý hậu kỳ.
xây dựng { nguồn = ["source.amazon-ebs.httpd"] nhà cung cấp "shell" { script = "script.sh" }}
Hoa hồng
Khối cung cấp là một phần củaxây dựng
khối. Ở đây bạn có thể đề cập đến cách bạn muốn định cấu hình hình ảnh VM. Bạn có thểchạy tập lệnh shell, Playbook Ansible, Kiểm tra sách dạy nấu ăn, v.v. Xemtrang cung cấpcho tất cả các nhà cung cấp được hỗ trợ.
Kịch bản hoặcansible-playbook
phải có trong thư mục nơi bạn có mẫu Packer.
nhà cung cấp "shell" { script = "script.sh" }
Ngoài ra, còn có một trình cung cấp tệp mà bạn có thể sử dụng để sao chép các tệp từ máy đóng gói sang AMI.
Ví dụ,
nhà cung cấp "file"{ source = "/build/artifact/code.jar" Destination = "/app/code.jar"}
Một loại ngôn ngữ lập trình
Bộ xử lý hậu kỳ không phải là một khối bắt buộc. Trong khối này, chúng ta có thể chỉ định những việc cần làm sau khi tạo Hình ảnh. Ví dụ: bạn có thể thực thi tập lệnh shell cục bộ để tạo một tệp có tất cả chi tiết hình ảnh.
bộ xử lý hậu "shell-local" { inline = ["echo foo"] }
Ngoài ra, bạn có thể sử dụng bộ xử lý hậu kỳ của bảng kê khai để lấy thông tin chi tiết về AMI trongbảng kê khai.json
tài liệu.
bộ xử lý hậu "tệp kê khai" { out = "manifest.json" Strip_path = true }
Tạo AWS AMI bằng mẫu HCL của Packer
Bây giờ hãy xem cách tạo AMI bằng mẫu Packer HCL.
Ghi chú:Tôi đã đưa ra một ví dụ cơ bản với cấu hình tối thiểu để bạn hiểu. Khi nói đến việc triển khai Packer trong dự án thời gian thực, có thể cần nhiều tùy chỉnh hơn về các biến, sơ đồ đặt tên, trình cắm trình xây dựng, v.v.
Đây là những gì mẫu này làm.
- Người đóng góitriển khai một phiên bản ec2 RHELdựa trên id AMI
ami-01e78c5619c5e68b4
bên trongeu-tây-1
vùng đất. - Thực thi tập lệnh shelltrên phiên bản RHEL từ
script.sh
tập lệnh được cung cấp trong thư mục mẫu - Đăng ký AMIvới tên được cho trong mẫu.
- Xóa máy đang chạy.
Hãy cùng bắt tay vào thực hiện một ví dụ thực tế.
Bước 1:Tạo một thư mục có tên “packer-vm
“.
mkdir packer-vm
Bước 2:Bên trongpacker-vm
thư mục, tạo một tập tin có tên “vm.pkr.hcl
” và sao chép mẫu HCL sau.
Nếu chúng ta tập hợp tất cả các khối mà tôi đã giải thích ở phần trên lại với nhau, chúng ta sẽ có Mẫu HCL sau.
biến "ami_id" { type = string default = "ami-01e78c5619c5e68b4"}biến "app_name" { type = string default = "httpd"}locals { app_name = "httpd"}source "amazon-ebs" "httpd" { ami_name = "PACKER-DEMO-${local.app_name}" instance_type = "t2.micro" Region = "us-west-2" source_ami = "${var.ami_id}" ssh_username = "ec2-user" tags = { Env = "DEMO" Tên = "PACKER-DEMO-${var.app_name}" }}build { nguồn = ["source.amazon-ebs.httpd"] nhà cung cấp "shell" { script = "script/script.sh" } bài đăng -bộ xử lý "shell-local" { inline = ["echo foo"] }}
Bước 3:Tạo một thư mục có tênkịch bản
bên trongpacker-vm
thư mục và cd vào thư mục script.
tập lệnh mkdir && tập lệnh cd
Bước 3:Tạo tên tập tinscript.sh
và sao chép tập lệnh shell sau vào nó. Nó chỉ cập nhật repo yum và cài đặthttpd
. Tại đây, bạn có thể thêm tất cả các tập lệnh shell mà bạn muốn thực thi trong quá trình tạo AMI.
#!/bin/bashsudo yum -y cập nhậtudo yum cài đặt -y httpd
Bước 4:[Rất quan trọng] Bây giờ chúng ta đã có tất cả các tệp được yêu cầu, hãy hiểu xác thực trình đóng gói được yêu cầu.
Nếu bạn đang chạy Packer trên máy trạm của mình với mục đích kiểm tra hoặc gỡ lỗi, bạncần có quyền truy cập AWS và khóa bí mật để Packer tương tác với các dịch vụ AWS. Đảm bảo bạn đã đặt khóa truy cập AWS trên tệp~/.aws/thông tin xác thực
.
Ngoài ra, bạn có thể chuyển khóa AWS trong khối nguồn, như hiển thị bên dưới. Nó làkhông phải là một thực hành được khuyến khích. Vô tình bạn có thể cam kết điều này với một kho lưu trữ mã nguồn.
nguồn "amazon-ebs" "example" { access_key = "ASDFASDFASDFJQWEKONNOASDF" secret_key = "SDFQ324876134HJKLASDBJKASDJFHBAJSDFJKHASKDG"}
Nếu bạn đang chạy Packer từ mộtPhiên bản AWS ec2, hãy đảm bảo bạn thêm mộtVai trò IAM có quyềnđể tương tác với các dịch vụ AWS ec2. Tôi đã thêm JSON chính sách IAM bắt buộc vào Github. Nhìn thấyJSON chính sách IAM của trình đóng gói
Bước 5:Bây giờ, hãy xác thực mẫu Packer HCL trước khi chúng tôi xây dựng nó. Xác nhận là rất quan trọng trong quá trình CI.
trình đóng gói xác thực vm.pkr.hcl
Bước 6:Chạy bản dựng trình đóng gói bằng lệnh sau.
trình đóng gói xây dựng vm.pkr.hcl
Lệnh trên chạy trong gần 3 – 5 phút.
Nếu bạn kiểm tra danh sách AMI của mình, bạn sẽ thấy AMI có tênGÓI-DEMO-httpd
.
Bản dựng trình gỡ lỗi
Có những trường hợp bạn có thể cần gỡ lỗi bản dựng trình đóng gói.
Cờ -debug cho phép bạn gỡ lỗi bản dựng AMI.
Ví dụ,
xây dựng trình đóng gói -debug vm.pkr.hcl
Khi bạn chạy trình đóng gói ở chế độ gỡ lỗi, Bạn cần phê duyệt từng bước của trình đóng gói theo cách thủ công như trong hình bên dưới.
Bạn cũng có thểssh vào phiên bản ec2được Packer tạo bằng khóa ssh tạm thời hoặc cặp khóa ssh được cung cấp trong cấu hình trình đóng gói.
Nếu bạn không chỉ định khóa ssh trong cấu hình trình đóng gói, nó sẽ tạo khóa ssh tạm thời và đặt nó vào cùng thư mục nơi bạn chạy lệnh đóng gói.
Để bạn có thể sử dụng địa chỉ IP và khóa ssh tạm thời để đăng nhập vào máy đóng gói VM để gỡ lỗi.
Nhật ký xây dựng trình đóng gói
Một cách khác để gỡ lỗi bản dựng trình đóng gói là thông qua nhật ký chi tiết của trình đóng gói.
Để lấy nhật ký bản dựng, bạn cần đặt biến môi trường sau trước khi chạy lệnh đóng gói bản dựng.
xuất PACKER_LOG=1xuất PACKER_LOG_PATH="/path/to/packer.log"
Thay thế/path/to/packer.log
với đường dẫn đăng nhập cần thiết. nếu bạn chỉ chỉ định packer.log, thì trình đóng gói sẽ tạo tệp nhật ký trong thư mục nơi lệnh Packer đang được thực thi.
Để duy trì biến môi trường này, hãy thêm nó vào$HOME/.bashrc
tập tin hoặc thêm nó dưới dạng tập lệnh trong/etc/profile.d
thư mục.
Mẫu trình đóng gói thử nghiệm đơn vị
Các mẫu trình đóng gói phải được coi như bất kỳ mẫu nào khácCơ sở hạ tầng dưới dạng mãliên quan đến việc thử nghiệm.
Bạn có thể viết các bài kiểm tra Packer bằng cách sử dụngKiểm tra kiểm tra.
Khi triển khai trình đóng gói trong quy trình sản xuất, hãy đảm bảo bạn viết các bài kiểm tra cần thiết như một phần của quy trình CI/CD của mình.
Thủ tục thanh toánkho lưu trữ nàyđể tham khảo việc kiểm tra nhà đóng gói.
Lỗi có thể xảy ra của trình đóng gói
Bạn có thể gặp lỗi ssh sau khi làm việc trên AMI dựa trên AWS. Một nguyên nhân có thể của vấn đề là sự hỗ trợ choed25519
loại khóa ssh cho khóa ssh tạm thời. Để khắc phục sự cố này, bạn cần nâng cấp Packer lên phiên bản mới nhất hỗ trợed25519
.
amazon-ebs: Lỗi chờ SSH: Packer gặp lỗi xác thực khi cố gắng kết nối qua SSH. Điều này có thể xảy ra nếu tên người dùng/mật khẩu của bạn sai. Bạn có thể muốn kiểm tra kỹ thông tin đăng nhập của mình như một phần của quá trình gỡ lỗi.
Một số mẹo đóng gói
Mẹo 1:Bạn có thể ghi lại đầu ra của ID hình ảnh trong tệp kê khai.json. Sau đó, bạn có thể phân tích cú pháp tệp JSON để lấy ID hình ảnh chính xác.
Mẹo 2:Sử dụng cờ -debug để đăng nhập vào máy chủ do Packer tạo để khắc phục sự cố thay vì chạy bản dựng trình đóng gói mỗi khi bạn có thay đổi trong tập lệnh cung cấp.
Phần kết luận
Trong nàyhướng dẫn đóng gói cho người mới bắt đầu,Tôi đã trình bày những điều cơ bản về tạo hình ảnh bằng Packer.
Có nhiều tùy chỉnh hơn mà bạn có thể thực hiện trong các mẫu Paker của mình khi nói đến một dự án thời gian thực.
Một lần nữa, điều đó phụ thuộc vào những gì bạn muốn đạt được khi sử dụng packer.
Bạn có thể đang sử dụng Jenkins cho quy trình xây dựng hình ảnh hoặc có thể là các tiện ích tùy chỉnh.
Dù bằng cách nào, hãy để lại nhận xét và cho tôi biết cách bạn quản lý hình ảnh trong dự án của mình.
Ngoài ra, nó là một trong những công cụ dành cho devops mà mọi kỹ sư devops nên biết. Tôi đã giải thích điều này trongkỹ năng kỹ sư devopshướng dẫn.