Giới thiệu về Packer
Packer là một công cụ mã nguồn mở do HashiCorp duy trì, được sử dụng để tạo hình ảnh máy. Hình ảnh máy cung cấp hệ điều hành, ứng dụng, cấu hình ứng dụng và tệp dữ liệu mà phiên bản máy ảo sẽ chạy sau khi được triển khai. Packer có thể được sử dụng kết hợp với các công cụ quản lý cấu hình phổ biến như Chef, Puppet hoặc Ansible để cài đặt phần mềm vào Linode của bạn và đưa các cấu hình đó vào hình ảnh của bạn.
Mẫu Packer lưu trữ các tham số cấu hình được sử dụng để xây dựng hình ảnh. Điều này chuẩn hóa quy trình xây dựng hình ảnh và đảm bảo rằng mọi người sử dụng tệp mẫu đó sẽ luôn tạo ra một hình ảnh giống hệt nhau. Ví dụ, điều này có thể giúp nhóm của bạn duy trì cơ sở hạ tầng không thay đổi trong đường ống phân phối liên tục của bạn .
Trình xây dựng Linode Packer
Trong hệ sinh thái của Packer, các nhà xây dựng có trách nhiệm xây dựng một hệ thống và tạo ra hình ảnh từ hệ thống đó. Packer có nhiều loại nhà xây dựng khác nhau, mỗi loại được sử dụng để tạo hình ảnh cho một nền tảng cụ thể.
Trình xây dựng Linode tích hợp Packer với nền tảng Linode. Điều này cho phép Packer triển khai Linode tạm thời trên tài khoản của bạn (sử dụng mã thông báo APIv4), cấu hình hệ thống trên Linode theo các tham số trong tệp mẫu được cung cấp, sau đó tạo hình ảnh dựa trên Linode đó. Về cơ bản, đây là cách thuận tiện để tự động tạo Linode Images trên tài khoản của bạn, có thể được sử dụng để triển khai nhanh chóng các Linode mới.
Trước khi bạn bắt đầu
Hướng dẫn này sẽ hướng dẫn bạn quy trình cài đặt Packer, tạo tệp mẫu, xây dựng hình ảnh và sau đó triển khai hình ảnh đó lên Linode mới. Đi xa hơn, hướng dẫn này cũng sẽ đề cập đến cách sử dụng công cụ Ansible với Packer. Trước khi bắt đầu, hãy xem lại những điều sau:
- Đảm bảo bạn có quyền truy cập vào cURL trên máy tính của mình.
- Tạo mã thông báo truy cập Linode API v4 có quyền đọc/ghi cho cả Linode và Images . Bạn có thể làm theo phần Nhận mã thông báo truy cập của hướng dẫn Bắt đầu với Linode API nếu bạn chưa có.
- Tùy chọn: Đặt một biến được đặt tên
TOKEN
trong môi trường shell của bạn bằng cách chạy lệnh sau. Thay thế x bằng mã thông báo API của riêng bạn.
export TOKEN=x
Ghi chú: Một số lệnh ví dụ được cung cấp trong hướng dẫn này sẽ sử dụng biến này. Nếu bạn không đặt biến này, bạn sẽ cần phải sửa đổi các lệnh này bằng cách thay thế $TOKEN
bằng mã thông báo API của bạn.
Cài đặt Packer
Các hướng dẫn sau đây sẽ cài đặt phiên bản Packer mới nhất trên Mac, Ubuntu hoặc CentOS. Để biết thêm các phương pháp cài đặt, bao gồm cài đặt trên các hệ điều hành khác hoặc biên dịch từ nguồn, hãy xem tài liệu chính thức của Packer và trang web Tải xuống Packer .
Máy Mac
Để cài đặt Packer trên Mac, Homebrew sẽ được sử dụng. Chạy các lệnh sau trên terminal của bạn:
brew tap hashicorp/tap
brew install hashicorp/tap/packer
Ubuntu
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install packer
CentOS/RHEL
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install packer
Xác minh cài đặt
Xác minh Packer đã được cài đặt thành công bằng cách chạy lệnh packer --version
. Lệnh này sẽ xuất ra số phiên bản cho lần cài đặt Packer này. Để tham khảo, hướng dẫn này đã được thử nghiệm lần cuối bằng phiên bản 1.7.2.
Xây dựng một mẫu cho Packer
Bây giờ Packer đã được cài đặt, bạn có thể tạo một mẫu Packer . Mẫu là một tệp chứa các cấu hình cần thiết để xây dựng một hình ảnh máy. Mẫu có thể được định dạng theo JSON hoặc HCL2 (Ngôn ngữ cấu hình Hashicorp). Kể từ Packer v1.7.0, định dạng mẫu HCL2 được ưu tiên và do đó sẽ được sử dụng trong các ví dụ trong hướng dẫn này.
Ghi chú: Các bước trong phần này sẽ phát sinh chi phí liên quan đến việc triển khai Linode 1GB (Nanode). Linode sẽ chỉ được triển khai trong khoảng thời gian cần thiết để tạo và chụp nhanh hình ảnh của bạn và sau đó sẽ bị xóa. Xem hướng dẫn Thanh toán và Lập hóa đơn của chúng tôi để biết chi tiết về cách thức hoạt động của tính năng lập hóa đơn theo giờ.
Tạo tệp mẫu
Tạo một tệp có tên example.pkr.hcl
. Tệp có thể được lưu trữ ở bất kỳ đâu, mặc dù bạn có thể muốn tạo một thư mục có tên packer
trong thư mục gốc của mình, nơi bạn có thể lưu trữ tất cả các tệp mẫu của mình. Chỉnh sửa tệp này và nhập hoặc dán nội dung sau:
variable "linode_api_token" {
type = string
default = ""
}
source "linode" "example" {
image = "linode/debian10"
image_description = "This image was created using Packer."
image_label = "packer-debian-10"
instance_label = "temp-packer-debian-10"
instance_type = "g6-nanode-1"
linode_token = "${var.linode_api_token}"
region = "us-east"
ssh_username = "root"
}
build {
sources = ["source.linode.example"]
}
Hiểu về khối mẫu
Tệp mẫu định dạng HCL2 thường chứa một số khối . Một khối có thể định nghĩa một biến, chỉ định các tham số chính xác cho plugin xây dựng hoặc phác thảo những gì sẽ xảy ra khi mẫu được xây dựng. Sau đây là một số khối sẽ được sử dụng trong hầu hết các mẫu:
Khối biến đổi
Một variable
khối chứa một biến do người dùng định nghĩa cùng với bất kỳ tham số hoặc giá trị bổ sung nào. Có thể có nhiều khối biến trong một mẫu để định nghĩa nhiều biến. Giá trị của một biến có thể được sử dụng ở nơi khác trong mẫu thông qua cú pháp ${var.variable_name}
, trong đó tên_biến là tên được đặt cho biến.
Ví dụ này chỉ chứa một biến: linode_api_token
. Giá trị của biến này được cố ý để trống ( default = ""
). Thay vì đặt biến trong mẫu, nó sẽ được đặt thông qua dòng lệnh khi chạy lệnh packer build
: packer build -var linode_api_token=x example.pkr.hcl
, trong đó x là mã thông báo API của bạn.
Tìm hiểu thêm về các biến mẫu Packer trên trang Biến của tài liệu Packer.
Khối nguồn (Trình xây dựng Linode)
Một source
khối xác định các tham số cho một plugin xây dựng. Các nguồn này sau đó có thể được sử dụng trong build
khối. Nhiều nguồn có thể được xác định trong một mẫu, cho phép bạn có khả năng tạo nhiều hình ảnh cho nhiều nền tảng. Danh sách đầy đủ các trình xây dựng có sẵn có thể được tìm thấy trên trang Trình xây dựng của tài liệu Packer.
Dòng bắt đầu của mỗi source
khối sẽ chứa plugin xây dựng được sử dụng cũng như tên được đặt cho nguồn cụ thể này trong mẫu. Ví dụ, dòng bắt đầu cho nguồn trong ví dụ này ( source "linode" "example" {
) chỉ định rằng trình xây dựng Linode sẽ được sử dụng và nguồn này sẽ được đặt tên là “example”.
Các tham số cho Linode Builder
Ví dụ này sử dụng trình xây dựng Linode Packer làm nguồn. Mỗi tham số trong source
khối được nêu trên trang Linode Builder trong tài liệu của Packer.
image
: ID của hình ảnh “starter” để sử dụng. Đây có thể là một trong những hình ảnh Linode chính thức hoặc bất kỳ hình ảnh tùy chỉnh riêng tư nào trên tài khoản của bạn. Trong ví dụ này, chúng tôi sẽ sử dụng linode/debian10
để chỉ định hình ảnh Linode Debian 10 chính thức. Bạn có thể xem tất cả các hình ảnh có sẵn cho mình bằng cách chạy lệnh curl sau:
curl -H "Authorization: Bearer $TOKEN" https://api.linode.com/v4/images
image_label
(tùy chọn): Nhãn cho hình ảnh tùy chỉnh mới mà mẫu này sẽ tạo ra.
image_description
(tùy chọn): Mô tả ngắn gọn cho hình ảnh tùy chỉnh mới.
instance_label
(tùy chọn): Nhãn cho Linode tạm thời mà Packer sẽ triển khai để tạo hình ảnh mới.
instance_type
ID của loại phiên bản cho Linode tạm thời này. Mẫu này chỉ định g6-nanode-1
, là ID cho Linode 1GB (Nanode). Trong hầu hết các trường hợp, Nanode sẽ hoạt động tốt để tạo hình ảnh vì nó đi kèm với 25GB dung lượng đĩa. Bạn có thể xem tất cả các loại Linode bằng cách chạy lệnh curl sau:
curl https://api.linode.com/v4/linode/types
linode_token
: Mã thông báo truy cập cá nhân API Linode được sử dụng để cung cấp cho Packer quyền truy cập vào tài khoản của bạn. Mã này được đặt ${var.linode_api_token}
trong mẫu vì chúng ta sẽ sử dụng biến dòng lệnh để cung cấp mã thông báo này thay vì lưu trực tiếp trong mẫu.
region
: ID của trung tâm dữ liệu. Trong mẫu này, ID của trung tâm dữ liệu Newark được sử dụng: us-east
. Bạn có thể xem tất cả các vùng bằng cách chạy lệnh curl sau:
curl https://api.linode.com/v4/regions
Khối xây dựng
Khối này build
cho Packer biết phải làm gì khi mẫu được xây dựng. Khối này sẽ tham chiếu a source
và tùy chọn chỉ định a provisioner
hoặc post-processor
.
Xây dựng hình ảnh
Sau khi tệp mẫu được lưu với các thông số mong muốn, giờ đây bạn đã sẵn sàng để xây dựng hình ảnh.
1.Trước tiên, hãy xác thực mẫu bằng cách chạy packer validate
lệnh bên dưới. Nếu bạn không đặt TOKEN làm biến trong môi trường shell của mình, hãy thay thế $TOKEN bằng mã thông báo API Linode của riêng bạn. Nếu thành công, sẽ không có lỗi nào được đưa ra.
packer validate -var linode_api_token=$TOKEN example.pkr.hcl
Ghi chú: Để tìm hiểu cách lưu trữ và sử dụng mã thông báo API v4 một cách an toàn, hãy xem phần Vault trong tài liệu của Packer.
2.Xây dựng hình ảnh bằng cách chạy packer build
lệnh bên dưới. Giống như trong bước cuối cùng, nếu bạn không đặt TOKEN làm biến trong môi trường shell của mình, hãy thay thế $TOKEN bằng mã thông báo API Linode của riêng bạn. Quá trình này có thể mất vài phút để hoàn tất.packer build -var linode_api_token=$TOKEN example.pkr.hcl
Đầu ra của lệnh này sẽ phác thảo từng quy trình mà Packer trải qua. Khi hoàn tất, dòng cuối cùng sẽ cung cấp cho bạn ID cho hình ảnh tùy chỉnh mới.
Triển khai Linode với Image mới
Sau khi quá trình xây dựng Packer hoàn tất, một Custom Image mới sẽ xuất hiện trên tài khoản của bạn. Có thể triển khai Image này theo một số cách sau:
Cloud Manager: Sử dụng Cloud Manager để triển khai Ảnh tùy chỉnh bằng cách làm theo hướng dẫn Triển khai Ảnh cho Phiên bản tính toán mới .
Linode CLI: Sử dụng Linode CLI thông qua dòng lệnh bằng cách làm theo hướng dẫn Sử dụng Linode CLI . Hướng dẫn Linode Instances cung cấp các lệnh ví dụ. Lệnh bên dưới sẽ triển khai một Linode mới trong trung tâm dữ liệu Newark. Thay mypassword bằng mật khẩu gốc mà bạn muốn sử dụng và linode/debian10 bằng ID của image mới của bạn.
linode-cli linodes create --root_pass mypassword --region us-east --image linode/debian10
Linode APIv4: Sử dụng Linode API để tạo Linode mới theo chương trình bằng cách xem lại tài liệu được nêu trong API > Linode Instances > Linode Create . Lệnh curl ví dụ sau sẽ triển khai Linode 1GB (Nanode) đến trung tâm dữ liệu Newark. Đảm bảo bạn thay thế mọi tham số cần thiết, bao gồm thay thế linode/debain10
bằng ID của Custom Image và chỉ định của riêng bạn root_pass
và label
.
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-X POST -d '{
"image": "private/7550080",
"root_pass": "aComplexP@ssword",
"booted": true,
"label": "my-example-label",
"type": "g6-nanode-1",
"region": "us-east"
}' \
https://api.linode.com/v4/linode/instances
Tiến xa hơn với Ansible
Packer là công cụ cực kỳ mạnh mẽ và có thể tùy chỉnh để tạo hình ảnh. Mẫu đầu tiên được nêu trong hướng dẫn này là một ví dụ tối giản và không thể hiện hết tiềm năng thực sự của Packer. Để tiến xa hơn, phần này sẽ đề cập đến việc tích hợp Packer với Ansible. Ansible là một trong nhiều tùy chọn khác nhau có sẵn để tùy chỉnh hình ảnh trong Packer.
Ansible là một công cụ tự động hóa để cung cấp, cấu hình và quản lý máy chủ. Trước khi tiếp tục, hãy làm theo hướng dẫn Bắt đầu với Ansible – Cài đặt và thiết lập cơ bản để cài đặt Ansible và làm quen với các khái niệm cơ bản của Ansible.
Tạo Playbook Ansible
Playbook Ansible phác thảo các tác vụ và tập lệnh sẽ chạy khi cung cấp máy chủ. Bạn sẽ tạo một playbook thêm tài khoản người dùng giới hạn trên Linode trước khi Packer tạo hình ảnh cuối cùng.
1.Sử dụng tiện ích mkpasswd (có sẵn trên nhiều hệ thống Linux) để tạo mật khẩu băm. Tiện ích này sẽ được sử dụng khi cấu hình mô-đun người dùng của Ansible cho tài khoản người dùng giới hạn của bạn.
mkpasswd --method=sha-512
Bạn sẽ được nhắc nhập mật khẩu dạng văn bản thuần túy và tiện ích sẽ trả về mã băm của mật khẩu.
2.Tạo tệp playbook với nội dung sau. Thay username bằng tên người dùng bạn muốn thêm và thay thế password
bằng băm mật khẩu được tạo ở bước trước.
---
- hosts: all
remote_user: root
vars:
NORMAL_USER_NAME: 'username'
tasks:
- name: "Create a secondary, non-root user"
user: name={{ NORMAL_USER_NAME }}
password='$6$eebkauNy4h$peyyL1MTN7F4JKG44R27TTmbXlloDUsjPir/ATJue2bL0u8FBk0VuUvrpsMq6rSSOCm8VSip0QHN8bDaD/M/k/'
shell=/bin/bash
- name: Add remote authorized key to allow future passwordless logins
authorized_key: user={{ NORMAL_USER_NAME }} key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
- name: Add normal user to sudoers
lineinfile: dest=/etc/sudoers
regexp="{{ NORMAL_USER_NAME }} ALL"
line="{{ NORMAL_USER_NAME }}"
Sổ tay hướng dẫn này cũng sẽ thêm khóa SSH công khai được lưu trữ trên máy tính cục bộ của bạn. Nếu khóa công khai bạn muốn sử dụng được lưu trữ ở vị trí khác ngoài ~/.ssh/id_rsa.pub
, bạn có thể cập nhật giá trị đó. Cuối cùng, sổ tay hướng dẫn sẽ thêm người dùng hệ thống mới vào tệp sudoers
.
Sửa đổi hoặc tạo một tệp mẫu mới
Chỉnh sửa tệp mẫu hiện tại của bạn hoặc tạo tệp mẫu mới với nội dung sau. Cụ thể, bạn sẽ thêm một provisioner
khối trong build
khối, thiết lập ansible
là loại nhà cung cấp và cung cấp vị trí của tệp playbook mà bạn đã tạo.
variable "linode_api_token" {
type = string
default = ""
}
source "linode" "ansible-example" {
image = "linode/debian10"
image_description = "This image was created using Packer."
image_label = "packer-advanced-debian-10"
instance_label = "temp-packer-debian-10"
instance_type = "g6-nanode-1"
linode_token = "${var.linode_api_token}"
region = "us-east"
ssh_username = "root"
}
build {
sources = ["source.linode.ansible-example"]
provisioner "ansible" {
playbook_file = "./limited_user_account.yml"
}
}
Hiểu về Khối cung cấp
Một provisioner cho phép bạn cấu hình thêm hệ thống của mình bằng cách hoàn thành các tác vụ quản trị hệ thống thông thường, như thêm người dùng, cài đặt và cấu hình phần mềm, v.v. Ví dụ sử dụng trình cung cấp Ansible tích hợp của Packer và thực thi các tác vụ được xác định trong limited_user_account.yml
playbook cục bộ. Điều này có nghĩa là ảnh Linode của bạn cũng sẽ chứa bất kỳ thứ gì được thực thi bởi playbook. Packer hỗ trợ một số provisioner khác, như Chef, Salt và shell script. Tìm hiểu thêm về các provisioner của Packer trên trang Provisioner của tài liệu Packer.
Xây dựng và triển khai hình ảnh
Thực hiện theo các phần trước để xây dựng hình ảnh và triển khai hình ảnh . Khi một Linode mới được triển khai bằng hình ảnh mới tạo, bạn sẽ có thể đăng nhập vào Linode đó qua ssh bằng cách chạy lệnh sau. Thay thế username bằng tên người dùng bạn đã chỉ định trong playbook Ansible và thay thế 192.0.2.0 bằng địa chỉ IPv4 của Linode mới của bạn.
ssh username@192.0.2.0
Các bước tiếp theo
Nếu bạn muốn tìm hiểu cách sử dụng Terraform để triển khai Linodes bằng hình ảnh do Packer tạo, bạn có thể làm theo hướng dẫn Terraform của chúng tôi để bắt đầu:
- Hướng dẫn cho người mới bắt đầu sử dụng Terraform
- Tạo một mô-đun Terraform
- Sử dụng Terraform để cung cấp môi trường Linode
- Giới thiệu về Ngôn ngữ cấu hình HashiCorp (HCL)
Nguồn: https://www.linode.com/docs/guides/how-to-use-linode-packer-builder/