Terraform của HashiCorp là một công cụ phối hợp cho phép bạn thể hiện các phiên bản Linode và các tài nguyên khác bằng mã khai báo bên trong các tệp cấu hình, thay vì tạo thủ công các tài nguyên đó thông qua Linode Manager hoặc API. Thực hành này được gọi là Cơ sở hạ tầng dưới dạng Mã và Terraform là một ví dụ phổ biến về phương pháp này. Quy trình làm việc cơ bản khi sử dụng Terraform là:
- Viết các tệp cấu hình trên máy tính của bạn trong đó bạn khai báo các thành phần cơ sở hạ tầng mà bạn muốn tạo.
- Yêu cầu Terraform phân tích cấu hình của bạn và sau đó tạo cơ sở hạ tầng tương ứng.
Nhiệm vụ chính của Terraform là tạo, sửa đổi và hủy máy chủ và các tài nguyên khác. Terraform thường không cấu hình phần mềm máy chủ của bạn. Cấu hình phần mềm của bạn có thể được thực hiện bằng các tập lệnh mà bạn tải lên và thực thi trên máy chủ mới của mình hoặc thông qua các công cụ quản lý cấu hình hoặc triển khai container.
Nhà cung cấp Linode
Terraform là một công cụ phối hợp chung có thể giao tiếp với một số nền tảng đám mây khác nhau. Các tích hợp này được gọi là nhà cung cấp . Nhà cung cấp Terraform cho Linode đã chính thức được phát hành vào tháng 10 năm 2018.
Ghi chú: Nhà cung cấp Linode dựa trên APIv4 của Linode , do đó cần có mã thông báo truy cập API để sử dụng. Xem Sử dụng Terraform để cung cấp môi trường Linode để biết hướng dẫn về cách nhận mã thông báo API và cài đặt Terraform và nhà cung cấp Linode trên máy tính của bạn.
Nhà cung cấp Linode có thể được sử dụng để tạo các phiên bản Linode, Hình ảnh, bản ghi miền, Khối lưu trữ khối, StackScript và các tài nguyên khác. Tài liệu chính thức của nhà cung cấp Linode của Terraform nêu chi tiết từng tài nguyên có thể được quản lý.
Ghi chú: Nhà cung cấp Linode của Terraform đã được cập nhật và hiện yêu cầu Terraform phiên bản 0.12 trở lên. Để tìm hiểu cách nâng cấp an toàn lên Terraform phiên bản 0.12 trở lên, hãy xem tài liệu chính thức của Terraform . Xem nhật ký thay đổi của Terraform v0.12 để biết danh sách đầy đủ các tính năng mới và ghi chú về sự không tương thích của phiên bản.
Cơ sở hạ tầng như Mã
Việc Terraform thể hiện tài nguyên của bạn trong các tệp cấu hình được gọi là Cơ sở hạ tầng dưới dạng Mã (IAC). Những lợi ích của phương pháp này và việc sử dụng Terraform bao gồm:
- Kiểm soát phiên bản cơ sở hạ tầng của bạn. Vì tài nguyên của bạn được khai báo trong mã, bạn có thể theo dõi các thay đổi đối với mã đó theo thời gian trong các hệ thống kiểm soát phiên bản như Git.
- Giảm thiểu lỗi của con người. Phân tích của Terraform về các tệp cấu hình của bạn sẽ tạo ra cùng một kết quả mỗi lần tạo tài nguyên đã khai báo của bạn. Ngoài ra, việc yêu cầu Terraform áp dụng cùng một cấu hình nhiều lần sẽ không dẫn đến việc tạo thêm tài nguyên, vì Terraform theo dõi các thay đổi mà nó thực hiện theo thời gian.
- Cộng tác tốt hơn giữa các thành viên trong nhóm. Các chương trình phụ trợ của Terraform cho phép nhiều thành viên trong nhóm làm việc an toàn trên cùng một cấu hình Terraform cùng lúc.
Ngôn ngữ cấu hình HashiCorp
Các tệp cấu hình của Terraform có thể được viết bằng Ngôn ngữ cấu hình HashiCorp (HCL) hoặc JSON. HCL là ngôn ngữ cấu hình do HashiCorp biên soạn để sử dụng với các sản phẩm của mình và được thiết kế để con người có thể đọc được và thân thiện với máy. Bạn nên sử dụng HCL thay vì JSON cho các triển khai Terraform của mình.
Các phần tiếp theo sẽ minh họa các khái niệm cốt lõi của Terraform với các ví dụ được viết bằng HCL. Để có đánh giá đầy đủ hơn về cú pháp HCL, hãy xem Giới thiệu về Ngôn ngữ cấu hình HashiCorp (HCL) .
Tài nguyên
Sau đây là một ví dụ đơn giản về cấu hình Terraform hoàn chỉnh trong HCL:
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
provider "linode" {
token = "your-linode-api-token"
}
resource "linode_instance" "example_instance" {
label = "example_instance_label"
image = "linode/ubuntu18.04"
region = "us-central"
type = "g6-standard-1"
authorized_keys = ["ssh-rsa AAAA...Gw== user@example.local"]
root_pass = "your-root-password"
}
Ghi chú: Khóa SSH trong ví dụ này đã được cắt bớt để ngắn gọn hơn.
Tệp Terraform mẫu này, với phần mở rộng tệp Terraform .tf
, biểu diễn việc tạo một phiên bản Linode duy nhất có nhãn example_instance_label
. Tệp ví dụ này được thêm tiền tố là một provider
khối bắt buộc, khối này thiết lập nhà cung cấp Linode và bạn phải liệt kê ở đâu đó trong cấu hình của mình.
Khối provider
được theo sau bởi một khai báo tài nguyên . Khai báo tài nguyên tương ứng với các thành phần của cơ sở hạ tầng Linode của bạn: Linode instances, Block Storage Volumes, v.v.
Tài nguyên có thể chấp nhận các đối số region
và type
là các đối số bắt buộc cho linode_instance
tài nguyên. Mật khẩu gốc phải được chỉ định cho mọi Linode, nhưng root_pass
đối số Terraform là tùy chọn; nếu không chỉ định, mật khẩu ngẫu nhiên sẽ được tạo.
Ghi chú: Chuỗi example_instance
theo sau linode_instance
khai báo loại tài nguyên là tên Terraform dành cho tài nguyên. Bạn không thể khai báo nhiều hơn một tài nguyên Terraform có cùng tên và loại tài nguyên.Đối label
số chỉ định nhãn cho phiên bản Linode trong Linode Manager. Tên này độc lập với tên Terraform cho tài nguyên (mặc dù bạn có thể gán cùng một giá trị cho cả hai). Tên Terraform chỉ được ghi lại trong trạng thái của Terraform và không được truyền đến API Linode. Nhãn cho các phiên bản Linode trong cùng một tài khoản Linode phải là duy nhất.
Nguồn dữ liệu
Trong Terraform, nguồn dữ liệu đại diện cho các giá trị chỉ đọc có thể được truy xuất và sau đó sử dụng ở nơi khác trong cấu hình Terraform. Sử dụng Linode Provider cho phép người dùng truy cập vào một số Nguồn dữ liệu cụ thể của Linode có thể được sử dụng cho mục đích này.
Nguồn dữ liệu được truy cập bằng cách khai báo một data
khối chứa bất kỳ thông tin nào được yêu cầu. Sau khi khối dữ liệu được khai báo, nguồn dữ liệu cung cấp quyền truy cập vào một số thuộc tính có thể được gọi như một phần của cấu hình terraform. Trong ví dụ dưới đây, linode_account
nguồn dữ liệu được gọi trong data
khối và được sử dụng sau đó trong output
khối để xuất email
thuộc tính:
...
data "linode_account" "account" {}
output "linode_account_email" {
value = "${data.linode_account.account.email}"
}
Phụ thuộc
Tài nguyên Terraform có thể phụ thuộc lẫn nhau. Khi một tài nguyên phụ thuộc vào tài nguyên khác, nó sẽ được tạo sau tài nguyên mà nó phụ thuộc, ngay cả khi nó được liệt kê trước tài nguyên khác trong tệp cấu hình của bạn.
Đoạn mã sau đây mở rộng ví dụ trước. Nó khai báo một tên miền mới với bản ghi A nhắm mục tiêu đến địa chỉ IP của phiên bản Linode:
terraform {
...
}
provider "linode" {
# ...
}
resource "linode_instance" "example_instance" {
# ...
}
resource "linode_domain" "example_domain" {
domain = "example.com"
soa_email = "example@example.com"
type = "master"
}
resource "linode_domain_record" "example_domain_record" {
domain_id = linode_domain.example_domain.id
name = "www"
record_type = "A"
target = linode_instance.example_instance.ip_address
}
Bản ghi miền domain_id
và đối số sử dụng cú pháp nội suytarget
của HCL để lấy ID của tài nguyên miền và IP của phiên bản Linode. Terraform tạo ra sự phụ thuộc ngầm định vào tài nguyên và cho tài nguyên. Do đó, bản ghi miền sẽ không được tạo cho đến khi phiên bản Linode và tên miền được tạo.example_instanceexample_domainexample_domain_record
Ghi chú: Cũng có thể khai báo các phụ thuộc rõ ràng .
Biến đầu vào
Ví dụ trước đó đã mã hóa cứng dữ liệu nhạy cảm trong cấu hình của bạn, bao gồm mã thông báo API và mật khẩu gốc của bạn. Để tránh thực hành này, Terraform cho phép bạn cung cấp các giá trị cho các đối số tài nguyên của mình trong các biến đầu vào . Các biến này được khai báo và tham chiếu trong cấu hình Terraform của bạn (sử dụng cú pháp nội suy) và các giá trị cho các biến đó được gán trong một tệp riêng.
Biến đầu vào cũng có thể được sử dụng cho dữ liệu không nhạy cảm. Các tệp ví dụ sau sẽ sử dụng các biến cho các đối số token
và nhạy cảm và các đối số và root_pass
không nhạy cảm :authorized_keysregion
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
provider "linode" {
token = var.token
}
resource "linode_instance" "example_instance" {
label = "example_instance_label"
image = "linode/ubuntu18.04"
region = var.region
type = "g6-standard-1"
authorized_keys = [var.ssh_key]
root_pass = var.root_pass
}
variable "token" {}
variable "root_pass" {}
variable "ssh_key" {}
variable "region" {
default = "us-southeast"
}
token = "your-linode-api-token"
root_pass = "your-root-password"
ssh_key = "ssh-rsa AAAA...Gw== user@example.local"
Ghi chú: Đặt tất cả các tệp của dự án Terraform vào cùng một thư mục. Terraform sẽ tự động tải các giá trị biến đầu vào từ bất kỳ tệp nào có tên terraform.tfvars
hoặc kết thúc bằng .auto.tfvars
.
Biến region
không được gán giá trị cụ thể, do đó nó sẽ sử dụng giá trị mặc định được cung cấp trong khai báo biến. Xem Giới thiệu về Ngôn ngữ cấu hình HashiCorp để biết thông tin chi tiết hơn về các biến đầu vào.
Giao diện dòng lệnh Terraform
Bạn tương tác với Terraform thông qua giao diện dòng lệnh của nó. Sau khi bạn đã tạo các tệp cấu hình trong dự án Terraform của mình, bạn cần chạy lệnh init
từ thư mục của dự án:
terraform init
Lệnh này sẽ tải xuống plugin nhà cung cấp Linode và thực hiện các hành động khác cần thiết để khởi tạo dự án của bạn. Bạn có thể chạy lệnh này nhiều lần, nhưng nhìn chung bạn chỉ cần chạy lại nếu bạn thêm một nhà cung cấp khác vào dự án của mình.
Lên kế hoạch và áp dụng
Sau khi bạn đã khai báo tài nguyên của mình trong các tệp cấu hình, bạn tạo chúng bằng cách chạy apply
lệnh Terraform từ thư mục dự án của bạn. Tuy nhiên, bạn nên luôn xác minh rằng Terraform sẽ tạo tài nguyên theo cách bạn mong đợi trước khi thực hiện bất kỳ thay đổi thực tế nào đối với cơ sở hạ tầng của bạn. Để thực hiện việc này, trước tiên bạn có thể chạy plan
lệnh:
terraform plan
Lệnh này sẽ tạo báo cáo nêu chi tiết những hành động mà Terraform sẽ thực hiện để thiết lập tài nguyên Linode của bạn.
Nếu bạn hài lòng với báo cáo này, hãy chạy apply
:
terraform apply
Lệnh này sẽ yêu cầu bạn xác nhận rằng bạn muốn tiếp tục. Khi Terraform hoàn tất việc áp dụng cấu hình của bạn, nó sẽ hiển thị báo cáo về những hành động đã thực hiện.
Tình trạng
Khi Terraform phân tích và áp dụng cấu hình của bạn, nó sẽ tạo ra một biểu diễn nội bộ của cơ sở hạ tầng mà nó đã tạo và sử dụng nó để theo dõi những thay đổi đã thực hiện. Thông tin trạng thái này được ghi lại trong JSON trong một tệp cục bộ được đặt tên theo mặc định, nhưng nó cũng có thể được lưu trữ trong các chương trình phụ trợterraform.tfstate
khác .
Quan trọng: Dữ liệu cơ sở hạ tầng nhạy cảm của bạn (như mật khẩu và mã thông báo) được hiển thị dưới dạng văn bản thuần túy trong terraform.tfstate
tệp của bạn. Xem lại Quản lý bí mật với Terraform để biết hướng dẫn về cách bảo mật các bí mật này.
Các lệnh khác
Có các lệnh hữu ích khác, như terraform show
, báo cáo phiên bản có thể đọc được của trạng thái Terraform của bạn. Danh sách đầy đủ các lệnh Terraform có trong tài liệu Terraform chính thức.
Người cung cấp
Ngoài các khai báo tài nguyên, cấu hình Terraform có thể bao gồm provisioner . Bạn khai báo provisioner để chạy các tập lệnh và lệnh trong môi trường phát triển cục bộ hoặc trên các máy chủ do Terraform quản lý. Các hành động này được thực hiện khi bạn áp dụng cấu hình Terraform của mình.
Ví dụ sau đây tải lên một tập lệnh thiết lập vào một phiên bản Linode mới tạo và sau đó thực thi nó. Mẫu này có thể được sử dụng để khởi động phiên bản mới hoặc ghi danh nó vào quản lý cấu hình:
resource "linode_instance" "example_instance" {
# ...
connection {
type = "ssh"
user = "root"
password = var.root_pass
host = self.ip_address
}
provisioner "file" {
source = "setup_script.sh"
destination = "/tmp/setup_script.sh"
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/setup_script.sh",
"/tmp/setup_script.sh",
]
}
}
Khi một đơn vị cung cấp được chỉ định, đơn vị đó cũng phải bao gồm việc bổ sung một khối kết nối lồng trong khối tài nguyên để mô tả cách Terraform sẽ kết nối với tài nguyên từ xa.
Hầu hết các provisioner được khai báo bên trong một khai báo tài nguyên. Khi nhiều provisioner được khai báo bên trong một tài nguyên, chúng được thực thi theo thứ tự được liệt kê. Để biết danh sách đầy đủ các provisioner , hãy xem tài liệu Terraform chính thức.
Ghi chú: Linode StackScripts cũng có thể được sử dụng để thiết lập một phiên bản Linode mới. Một điểm khác biệt giữa việc sử dụng StackScripts và các file
provisioner remote-exec
là các provisioner đó sẽ chạy và hoàn tất đồng bộ trước khi Terraform tiếp tục áp dụng kế hoạch của bạn, trong khi StackScript sẽ chạy song song trong khi Terraform tạo phần còn lại của các tài nguyên còn lại của bạn. Do đó, Terraform có thể hoàn tất ứng dụng của mình trước khi StackScript chạy xong.
Các mô-đun
Terraform cho phép bạn sắp xếp cấu hình của mình thành các cấu trúc có thể tái sử dụng được gọi là mô-đun . Điều này hữu ích nếu bạn cần tạo nhiều phiên bản của cùng một cụm máy chủ. Xem Tạo Mô-đun Terraform để biết thêm thông tin về việc tạo và sử dụng mô-đun.
Phần cuối
Theo mặc định, Terraform duy trì trạng thái của nó trong thư mục dự án của bạn. Terraform cũng hỗ trợ lưu trữ trạng thái của bạn trong các backend không cục bộ . Các lợi ích của việc đưa trạng thái của bạn vào một backend khác bao gồm:
- Cộng tác tốt hơn với nhóm của bạn. Backend cho phép bạn chia sẻ cùng trạng thái với các thành viên khác trong nhóm có quyền truy cập vào backend.
- Bảo mật tốt hơn. Thông tin trạng thái được lưu trữ và truy xuất từ phần phụ trợ chỉ được lưu trong bộ nhớ trên máy tính của bạn.
- Hoạt động từ xa. Khi làm việc với cơ sở hạ tầng lớn,
terraform apply
có thể mất nhiều thời gian để hoàn thành. Một số backend cho phép bạn chạyapply
từ xa, thay vì trên máy tính của bạn.
Các loại chương trình phụ trợ có sẵn được liệt kê trong tài liệu chính thức của Terraform.
Nhập khẩu
Có thể nhập cơ sở hạ tầng Linode được tạo bên ngoài Terraform vào gói Terraform của bạn. Xem lại Nhập cơ sở hạ tầng hiện có vào Terraform để biết hướng dẫn về chủ đề này.
Các bước tiếp theo
Để bắt đầu cài đặt Terraform và tạo dự án đầu tiên, hãy đọc hướng dẫn Sử dụng Terraform để cung cấp môi trường Linode của chúng tôi .
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.
Nguồn: https://www.linode.com/docs/guides/beginners-guide-to-terraform/