Cả Packer và Terraform tools của HashiCorp đều nổi bật với khả năng tự động hóa cơ sở hạ tầng đáng chú ý. Mặc dù có một số điểm trùng lặp, các công cụ này có các tính năng riêng biệt và bổ sung cho nhau. Điều này khiến chúng trở thành một cặp hiệu quả, với Packer được sử dụng để tạo hình ảnh mà Terraform sau đó triển khai như một cơ sở hạ tầng hoàn chỉnh.
Tìm hiểu thêm về Packer trong hướng dẫn Sử dụng Linode Packer Builder để tạo hình ảnh tùy chỉnh . Khám phá cách bạn có thể tận dụng Terraform trong Hướng dẫn dành cho người mới bắt đầu về Terraform .
Trong hướng dẫn này, hãy tìm hiểu cách sử dụng Packer và Terraform cùng nhau để triển khai các phiên bản Linode. Hướng dẫn sử dụng nhà cung cấp Linode Terraform để triển khai nhiều phiên bản dựa trên hình ảnh Linode được xây dựng bằng Packer.
Trước khi bạn bắt đầu
- Nếu bạn chưa thực hiện, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo Compute Instance của chúng tôi .
- Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Compute của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, cấu hình tên máy chủ, tạo tài khoản người dùng giới hạn và tăng cường quyền truy cập SSH.
Ghi chú: Hướng dẫn này được viết cho người dùng không phải root. Các lệnh yêu cầu quyền nâng cao được thêm tiền tố sudo
. Nếu bạn không quen với sudo
lệnh này, hãy xem hướng dẫn Người dùng và Nhóm .
Cách cài đặt các điều kiện tiên quyết
Để bắt đầu, hãy cài đặt cả Packer và Terraform trên cùng một hệ thống. Dưới đây bạn có thể tìm thấy các liên kết đến hướng dẫn cài đặt cho hai công cụ này, cũng như các bước bao gồm hầu hết các hệ điều hành Linux.
Cài đặt Packer
Quá trình cài đặt Packer thay đổi đáng kể tùy thuộc vào hệ điều hành của bạn. Tham khảo hướng dẫn cài đặt chính thức để biết hướng dẫn nếu hệ thống của bạn không được đề cập ở đây.
Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
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
AlmaLinux / CentOS Stream / Rocky Linux
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
Fedora
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo
sudo dnf -y install packer
Sau đó, hãy xác minh cài đặt của bạn và hiển thị phiên bản đã cài đặt bằng lệnh sau:
packer --version
Cài đặt Terraform
Quá trình cài đặt Terraform cũng khác nhau tùy thuộc vào hệ điều hành của bạn. Tham khảo tài liệu chính thức của HashiCorp về cách cài đặt Terraform CLI cho các hệ thống không được đề cập ở đây. Bạn cũng có thể tham khảo phần về cách cài đặt Terraform trong hướng dẫn của chúng tôi Sử dụng Terraform để cung cấp môi trường Linode .Debian / Ubuntu
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
AlmaLinux / CentOS Stream / Rocky Linux
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
Fedora
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo
sudo dnf -y install terraform
Sau đó, hãy xác minh cài đặt của bạn bằng:
terraform -version
Terraform v1.3.3
on linux_amd64
Làm thế nào để xây dựng một hình ảnh Packer
Packer tự động tạo ra các hình ảnh máy. Những hình ảnh này hữu ích khi bạn muốn hợp lý hóa quy trình cung cấp cơ sở hạ tầng của mình. Những hình ảnh như vậy cung cấp cho bạn cơ sở nhất quán để triển khai các phiên bản.
Hơn nữa, hình ảnh hiệu quả hơn nhiều. Thay vì thực hiện một loạt các cài đặt và lệnh với mỗi phiên bản được cung cấp, công cụ cung cấp có thể triển khai hình ảnh đã sẵn sàng.
Các ví dụ trong hướng dẫn này sử dụng hình ảnh Linode được xây dựng bằng Packer. Linode có trình xây dựng dành cho Packer, cho phép bạn ghép các hình ảnh cụ thể cho một phiên bản Linode.
Để thực hiện, hãy làm theo hướng dẫn của chúng tôi về Sử dụng Linode Packer Builder để Tạo Hình ảnh Tùy chỉnh . Cuối cùng, bạn sẽ có hình ảnh do Packer xây dựng trên tài khoản Linode của mình.
Các bước còn lại trong hướng dẫn này sẽ hoạt động bất kể bạn xây dựng loại hình ảnh nào theo hướng dẫn được liên kết ở trên. Tuy nhiên, hình ảnh Packer được sử dụng trong các ví dụ sau có nhãn packer-linode-image-1
, chạy trên cơ sở Ubuntu 20.04 và đã cài đặt NGINX.
Cách cấu hình Terraform
Terraform tập trung vào việc tự động hóa quy trình cung cấp, cho phép bạn triển khai cơ sở hạ tầng hoàn toàn từ mã.
Để tìm hiểu thêm về việc triển khai các phiên bản Linode với Terraform, hãy xem hướng dẫn của chúng tôi về cách sử dụng Terraform để cung cấp môi trường Linode .
Hướng dẫn này bao gồm một loạt các bước tương tự, nhưng cụ thể là trình bày cách bạn có thể làm việc với hình ảnh Linode tùy chỉnh.
Trước khi tiếp tục, hãy tạo một thư mục cho các tập lệnh Terraform của bạn và thay đổi thư mục đó thành thư mục làm việc của bạn. Hướng dẫn này sử dụng thư linode-terraform
mục trong thư mục home của người dùng hiện tại:
mkdir ~/linode-terraform
cd ~/linode-terraform
Phần còn lại của hướng dẫn giả định rằng bạn đang làm việc ngoài thư mục này.
Thiết lập nhà cung cấp Linode
Các nhà cung cấp của Terraform hoạt động như các bản tóm tắt của API, cung cấp cho Terraform một giao diện để làm việc với nhiều tài nguyên khác nhau trên nền tảng lưu trữ.
Linode có nhà cung cấp Terraform riêng, bạn có thể tìm hiểu thêm tại trang đăng ký nhà cung cấp Terraform .
Để sử dụng nhà cung cấp, bạn chỉ cần một vài khối ngắn trong tập lệnh Terraform.
Tạo một tệp Terraform mới có tên là packer-linode.tf
, đóng vai trò là cơ sở cho dự án Terraform của hướng dẫn này:
nano packer-linode.tf
Cung cấp nội dung hiển thị ở đây:
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.29.3"
}
}
}
provider "linode" {
token = var.token
}
Khối này terraform
bắt đầu dự án bằng cách chỉ ra các nhà cung cấp bắt buộc (ví dụ: Linode). provider
Sau đó, khối này bắt đầu nhà cung cấp Linode. token
Đối số cho phép nhà cung cấp xác thực kết nối của mình với API Linode.
Khi hoàn tất, nhấn Ctrl+ Xđể thoát nano, Yđể lưu và Enterđể xác nhận.
Gán các biến Terraform
Ở trên, bạn có thể thấy giá token
trị cho nhà cung cấp Linode sử dụng var.token
biến. Mặc dù không bắt buộc, nhưng các biến làm cho các tập lệnh Terraform dễ thích ứng và dễ quản lý hơn nhiều.
Hướng dẫn này xử lý các biến bằng hai tệp.
1.Đầu tiên, tạo một variables.tf
tập tin:
nano variables.tf
Bây giờ hãy điền nội dung như bên dưới. Tệp này định nghĩa tất cả các biến cho dự án Terraform. Một số biến này có giá trị mặc định, Terraform sẽ tự động sử dụng nếu không được chỉ định theo cách khác. Các biến khác cần được chỉ định, bạn có thể xem trong tệp tiếp theo.
variable "token" {
description = "The Linode API Personal Access Token."
}
variable "password" {
description = "The root password for the Linode instances."
}
variable "ssh_key" {
description = "The location of an SSH key file for use on the Linode instances."
default = "~/.ssh/id_rsa.pub"
}
variable "node_count" {
description = "The number of instances to create."
default = 1
}
variable "region" {
description = "The name of the region in which to deploy instances."
default = "us-east"
}
variable "image_id" {
description = "The ID for the Linode image to be used in provisioning the instances"
default = "linode/ubuntu20.04"
}
Khi hoàn tất, nhấn Ctrl+ Xđể thoát nano, Yđể lưu và Enterđể xác nhận.
2.Bây giờ hãy tạo một terraform.tfvars
tập tin:
nano terraform.tfvars
Tệp này, với phần .tfvars
kết thúc, là nơi gán các giá trị biến. Cung cấp cho tệp nội dung bên dưới, thay thế các giá trị trong dấu ngoặc nhọn ( <...>
) bằng các giá trị thực tế của bạn:
token = "<LinodeApiToken>"
password = "<RootPassword>"
node_count = 2
image_id = "private/<LinodeImageId>"
Cần <LinodeApiToken>
phải là mã thông báo API được liên kết với tài khoản Linode của bạn. Bạn có thể làm theo hướng dẫn Nhận mã thông báo truy cập API của chúng tôi để tạo mã thông báo truy cập cá nhân. Hãy đảm bảo cấp cho mã thông báo quyền “Đọc/Ghi”.
Ở trên, bạn có thể thấy giá trị của private/<LinodeImageId>
cho image_id
. Giá trị này phải khớp với ID hình ảnh cho hình ảnh Linode mà bạn đã tạo bằng Packer. Tất cả hình ảnh Linode tùy chỉnh đều được mở đầu bằng private/
và kết thúc bằng ID của hình ảnh. Trong các ví dụ này, private/17691867
được coi là ID cho hình ảnh Linode được xây dựng bằng Packer.
Có hai cách chính để lấy ID hình ảnh của bạn:
- ID hình ảnh Linode xuất hiện ở cuối đầu ra khi bạn sử dụng Packer để tạo hình ảnh. Ví dụ, trong hướng dẫn về cách tạo hình ảnh Linode bằng Packer được liên kết ở trên, bạn có thể tìm thấy đầu ra:
==> Builds finished. The artifacts of successful builds are: --> linode.example-linode-image: Linode image: packer-linode-image-1 (private/17691867)
- API Linode có điểm cuối để liệt kê các hình ảnh có sẵn. Danh sách bao gồm các hình ảnh tùy chỉnh của bạn nếu bạn gọi nó bằng mã thông báo API của mình.Bạn có thể sử dụng lệnh cURL để liệt kê tất cả hình ảnh có sẵn cho bạn, công khai và riêng tư. Thay thế
$LINODE_API_TOKEN
bằng mã thông báo API Linode của bạn:curl -H "Authorization: Bearer $LINODE_API_TOKEN" \https://api.linode.com/v4/images
Đầu ra có thể quá tải trong dòng lệnh, vì vậy bạn có thể muốn sử dụng một công cụ khác để làm đẹp phản hồi JSON. Điều này đã được thực hiện với kết quả hiển thị ở đây:{ "pages": 1, "data": [{ "id": "private/17691867", "label": "packer-linode-image-1", "description": "Example Packer Linode Image", // [...]
Khi hoàn tất, nhấn + Xđể thoát nano, Yđể lưu và Enterđể xác nhận.
Định nghĩa tài nguyên Linode
Bước tiếp theo đối với tập lệnh Terraform là xác định tài nguyên thực tế cần cung cấp. Trong trường hợp này, tập lệnh cần cung cấp các phiên bản Linode, có thể thực hiện bằng cách sử dụng tài linode_instance
nguyên.
Mở packer-linode.tf
tệp đã tạo trước đó và thêm thông tin chi tiết hiển thị ở đây vào cuối:
resource "linode_instance" "packer_linode_instance" {
count = var.node_count
image = var.image_id
label = "packer-image-linode-${count.index + 1}"
group = "packer-image-instances"
region = var.region
type = "g6-standard-1"
authorized_keys = [ chomp(file(var.ssh_key)) ]
root_pass = var.password
connection {
type = "ssh"
user = "root"
password = var.password
host = self.ip_address
}
provisioner "remote-exec" {
inline = [
# Update the system.
"apt-get update -qq",
# Disable password authentication; users can only connect with an SSH key.
"sed -i '/PasswordAuthentication/d' /etc/ssh/sshd_config",
"echo \"PasswordAuthentication no\" >> /etc/ssh/sshd_config",
# Check to make sure NGINX is running.
"systemctl status nginx --no-pager"
]
}
}
Và với điều đó, dự án Terraform đã sẵn sàng cung cấp hai phiên bản Linode dựa trên hình ảnh do Packer xây dựng của bạn. Hầu hết các chi tiết cấu hình cho khối resource
được quản lý bằng các biến. Vì vậy, bạn không cần phải loay hoay với nhiều resource
khối để điều chỉnh những thứ như số lượng phiên bản cần cung cấp.
Provisioner remote-exec
, và cụ thể là inline
danh sách bên trong nó, là nơi mà phần lớn tùy chỉnh xuất hiện. Khối này định nghĩa các lệnh shell được thực thi trên phiên bản mới được cung cấp. Các lệnh ở đây tương đối đơn giản, nhưng provisioner này có thể cung cấp cho bạn quyền kiểm soát chi tiết các hoạt động trên phiên bản.
Cách cung cấp Packer Image với Terraform
Từ đây, chỉ cần một số lệnh Terraform là bạn có thể cung cấp và quản lý các phiên bản Linode từ hình ảnh do Packer xây dựng.
Đầu tiên, Terraform cần chạy một số khởi tạo xung quanh tập lệnh. Điều này cài đặt bất kỳ điều kiện tiên quyết nào, cụ thể là linode
nhà cung cấp trong ví dụ này và thiết lập tệp khóa của Terraform.
terraform init
Chạy lệnh của Terraform plan
cũng là một cách thực hành tốt. Tại đây, Terraform kiểm tra tập lệnh của bạn để tìm lỗi ngay lập tức và cung cấp phác thảo về các tài nguyên dự kiến để triển khai. Bạn có thể coi đó là một lần chạy thử nhẹ.
terraform plan
Xem lại kế hoạch và khi đã sẵn sàng, hãy cung cấp các phiên bản của bạn bằng lệnh apply
. Việc này có thể mất vài phút để xử lý, tùy thuộc vào hệ thống của bạn và số lượng phiên bản được triển khai.
terraform apply
linode_instance.packer_linode_instance[0] (remote-exec): Connected!
linode_instance.packer_linode_instance[0] (remote-exec): ● nginx.service - A high performance web server and a reverse proxy server
linode_instance.packer_linode_instance[0] (remote-exec): Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
linode_instance.packer_linode_instance[0] (remote-exec): Active: active (running) since Thu 2022-10-27 15:56:42 UTC; 9s ago
[...]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Trong tương lai, bất cứ khi nào bạn muốn xóa các phiên bản được tạo bằng Terraform, bạn có thể sử dụng lệnh destroy
từ trong thư mục tập lệnh Terraform của mình.
terraform destroy
Tương tự như apply
lệnh, bạn sẽ có bản xem trước các phiên bản và được yêu cầu xác nhận trước khi các phiên bản đó bị hủy.
Phần kết luận
Hướng dẫn này phác thảo cách sử dụng Terraform để triển khai các phiên bản Linode được xây dựng bằng hình ảnh Packer. Sự sắp xếp này cung cấp một thiết lập hiệu quả để cung cấp và quản lý các phiên bản Linode. Terraform hợp lý hóa quy trình cung cấp cơ sở hạ tầng và thậm chí còn hiệu quả hơn khi sử dụng các hình ảnh được xây dựng sẵn từ Packer.
Ví dụ được đề cập trong hướng dẫn này khá đơn giản. Nhưng thiết lập có thể dễ dàng được điều chỉnh và mở rộng để triển khai cơ sở hạ tầng mạnh mẽ và phức tạp hơn.
Thông tin thêm
Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.
- Terraform – HashiCorp Học: Cung cấp cơ sở hạ tầng với Packer
- Packer – Các trường hợp sử dụng: Tích hợp với Terraform
Nguồn: https://www.linode.com/docs/guides/deploy-packer-image-with-terraform/