Terraform cho phép bạn biểu diễn Cơ sở hạ tầng dưới dạng Mã (IaC). Bạn có thể sử dụng nó để quản lý cơ sở hạ tầng, tăng tốc triển khai và chia sẻ các tệp cấu hình cơ sở hạ tầng của bạn trong một nhóm. Trong hướng dẫn này, bạn sẽ sử dụng Terraform để tạo NodeBalancer phân phối lưu lượng giữa hai Linode.
Quan trọng: Cấu hình và lệnh được sử dụng trong hướng dẫn này sẽ dẫn đến việc nhiều tài nguyên có thể thanh toán được thêm vào tài khoản của bạn. Hãy đảm bảo theo dõi chặt chẽ tài khoản của bạn trong Linode Cloud Manager để tránh các khoản phí không mong muốn. Xem hướng dẫn Thanh toán và Hóa đơn để biết thêm chi tiết.Nếu bạn muốn ngừng tính phí cho các tài nguyên được tạo trong hướng dẫn này, hãy xóa chúng khi bạn hoàn thành công việc.
Trước khi bạn bắt đầu
- Bạn nên cài đặt Terraform trong môi trường phát triển của mình và có kiến thức thực tế về cấu hình tài nguyên Terraform và nhà cung cấp Linode . Để biết thêm thông tin về cách cài đặt và sử dụng Terraform, hãy xem hướng dẫn Sử dụng Terraform để cung cấp môi trường Linode của chúng tôi .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ác ví dụ trong hướng dẫn này được viết để tương thích với Terraform phiên bản 0.11 và sẽ được cập nhật trong tương lai gần.
- Terraform yêu cầu mã thông báo truy cập API. Làm theo hướng dẫn Bắt đầu với API Linode để lấy mã thông báo.
- Tạo một
terraform_nodebalancer
thư mục trên máy tính của bạn cho dự án Terraform mà bạn sẽ tạo trong hướng dẫn này. Tất cả các tệp bạn tạo trong hướng dẫn này phải được đặt trong thư mục này và bạn phải chạy tất cả các lệnh từ thư mục này. Dự án mới này không được tạo bên trong thư mục dự án Terraform khác, bao gồm cả thư mục mà bạn có thể đã tạo khi làm theo Sử dụng Terraform để cung cấp môi trường Linode trước đó .
Tạo tệp cấu hình Terraform
Tạo một khối nhà cung cấp
Bước đầu tiên cần thực hiện khi tạo tệp cấu hình Terraform là tạo khối nhà cung cấp . Khối này cho Terraform biết nhà cung cấp nào cần sử dụng. Giá trị cấu hình duy nhất mà nhà cung cấp Linode cần là mã thông báo truy cập API.
Tạo một tệp có tên nodebalancer.tf
trong thư mục dự án Terraform của bạn. Bạn sẽ thêm vào tệp này trong suốt hướng dẫn. Thêm các khối nhà cung cấp vào tệp:
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
provider "linode" {
token = var.token
}
Khối nhà cung cấp này sử dụng nội suy biến để truy cập giá trị của mã thông báo API của bạn. Bạn sẽ tạo các biến đầu vào trong một variables.tf
tệp riêng sau trong phần Xác định biến Terraform của hướng dẫn này. Bất kỳ biến đầu vào nào bạn xác định trong variables.tf
tệp đều có sẵn từ var
từ điển bằng ký hiệu dấu chấm. Bạn sẽ sử dụng nội suy biến và tham chiếu các biến bằng ký hiệu dấu chấm trong suốt hướng dẫn này.
Tạo một tài nguyên NodeBalancer
Tạo tài nguyên NodeBalancer trong nodebalancer.tf
tệp:
...
resource "linode_nodebalancer" "example-nodebalancer" {
label = "examplenodebalancer"
region = var.region
}
...
Tài linode_nodebalancer
nguyên cung cấp hai nhãn. Nhãn đầu tiên, example-nodebalancer
, được Terraform sử dụng nội bộ. Nhãn thứ hai, examplenodebalancer
, được sử dụng để tham chiếu NodeBalancer của bạn trong các công cụ như Manager và Linode CLI. Vùng cho NodeBalancer này được cung cấp với biến region
.
Tạo tài nguyên cấu hình NodeBalancer
Ngoài tài nguyên NodeBalancer, bạn phải cung cấp ít nhất một tài nguyên Cấu hình NodeBalancer. Tài nguyên này định nghĩa các cổng, giao thức, kiểm tra tình trạng và độ bám dính của phiên, cùng với các tùy chọn khác mà NodeBalancer có thể sử dụng. Đối với ví dụ này, bạn sẽ tạo cấu hình NodeBalancer để truy cập HTTP trên cổng 80, nhưng bạn cũng có thể tạo cấu hình để truy cập HTTPS trên cổng 443 nếu bạn có chứng chỉ SSL/TLS :
...
resource "linode_nodebalancer_config" "example-nodebalancer-config" {
nodebalancer_id = linode_nodebalancer.example-nodebalancer.id
port = 80
protocol = "http"
check = "http_body"
check_path = "/healthcheck/"
check_body = "healthcheck"
check_attempts = 30
check_timeout = 25
check_interval = 30
stickiness = "http_cookie"
algorithm = "roundrobin"
}
...
Tài nguyên NodeBalancer Config yêu cầu một NodeBalancer ID, được điền vào dòng đầu tiên bằng biến linode_nodebalancer.example-nodebalancer.id
. Vì nodebalancer_id
đối số tham chiếu đến một NodeBalancer chưa được tạo, bạn có thể sử dụng biến này làm trình giữ chỗ để tham chiếu đến NodeBalancer ID. Terraform sẽ tự động biết để tạo tài nguyên NodeBalancer trước khi tạo bất kỳ tài nguyên nào khác tham chiếu đến tài nguyên đó. Theo cách này, bạn có thể tạo cơ sở hạ tầng phức tạp tham chiếu đến các phần của chính nó mà không cần phải lo lắng về thứ tự xuất hiện của các tài nguyên trong cấu hình Terraform hoặc liệu các tài nguyên đó đã tồn tại hay chưa.
Về phần cài đặt, kiểm tra tình trạng được đặt thành http_body
, nghĩa là kiểm tra tình trạng sẽ tìm chuỗi được đặt bởi check_body
trong phần thân của trang được đặt tại check_path
. NodeBalancer sẽ đưa một nút ra khỏi vòng quay sau 30 lần kiểm tra không thành công. Mỗi lần kiểm tra sẽ đợi phản hồi trong 25 giây trước khi được coi là lỗi, với 30 giây giữa các lần kiểm tra. Ngoài ra, cài đặt độ dính của phiên đã được đặt thành http_cookie
. Điều này nghĩa là người dùng sẽ tiếp tục được gửi đến cùng một máy chủ bằng cách sử dụng cookie phiên. Thuật toán đã được đặt thành roundrobin
, thuật toán này sẽ sắp xếp người dùng đồng đều trên các nút phụ trợ của bạn dựa trên máy chủ nào được truy cập lần cuối.
Ghi chú: Xem lại Hướng dẫn tham khảo NodeBalancer để biết danh sách đầy đủ các tùy chọn cấu hình NodeBalancer.
Tạo tài nguyên NodeBalancer
Phần thứ ba của quá trình thiết lập NodeBalancer trong Terraform là tạo tài nguyên NodeBalancer. Tài nguyên này chứa thông tin về từng Node và cách chúng liên quan đến tài nguyên NodeBalancer và NodeBalancer Configuration.
...
resource "linode_nodebalancer_node" "example-nodebalancer-node" {
count = var.node_count
nodebalancer_id = linode_nodebalancer.example-nodebalancer.id
config_id = linode_nodebalancer_config.example-nodebalancer-config.id
label = "example-node-${count.index + 1}"
address = "${element(linode_instance.example-instance.*.private_ip_address, count.index)}:80"
mode = "accept"
}
...
Đối số của tài nguyên này count
sẽ được điền bằng node_count
biến đầu vào mà bạn sẽ định nghĩa sau trong hướng dẫn này. count
Đối số cho Terraform biết rằng nó sẽ cung cấp node_count
số lượng Node.
Vì việc cung cấp nhiều hơn một nút sẽ tạo ra một vòng lặp trong quy trình Terraform, trong đó bước tạo nút được lặp lại, bạn có thể sử dụng biến count.index
để theo dõi Terraform đang ở lần lặp nào trong vòng lặp. Nội suy {count.index + 1}
trong đối số của nút label
cho Terraform biết rằng bạn muốn mỗi nút được gắn nhãn tuần tự và vì count.index
bắt đầu từ số không, bạn muốn số lượng bắt đầu từ một.
linode_instance.example-instance.*.private_ip_address
tham chiếu đến các địa chỉ IP riêng của các phiên bản Linode chưa được tạo. Ở bước tiếp theo, các tài nguyên Phiên bản Linode sẽ được gắn nhãn example-instance
. Terraform có quyền truy cập vào một số thuộc tính cho mỗi tài nguyên mà nó tạo ra và private_ip_address
là một trong những thuộc tính khả dụng từ tài nguyên Phiên bản Linode. Vì sẽ có hai phiên bản Linode được tạo trong cùng một bước, Terraform nhóm các tập hợp thuộc tính này trong một danh sách. element()
Hàm này cho phép bạn lấy một mục duy nhất từ danh sách dựa trên chỉ mục mục. Ở đây, thay vì cung cấp một số được mã hóa cứng cho chỉ mục, bạn có thể cung cấp count.index
. Theo cách này, NodeBalancer đầu tiên sẽ tham chiếu đến địa chỉ IP riêng của phiên bản Linode đầu tiên và NodeBalancer thứ hai sẽ tham chiếu đến địa chỉ IP riêng của phiên bản thứ hai.
Tạo một tài nguyên Linode Instance
Bây giờ bạn đã cấu hình NodeBalancer, bạn cần cung cấp cho nó một tài nguyên Linode Instance. Tài nguyên này sẽ cho phép Terraform biết những instance nào cần tạo để đáp ứng nhu cầu của ví dụ NodeBalancer của chúng ta.
...
resource "linode_instance" "example-instance" {
count = var.node_count
label = "example-instance-${count.index + 1}"
group = "nodebalancer-example"
tags = ["nodebalancer-example"]
region = var.region
type = "g6-nanode-1"
image = "linode/ubuntu18.10"
authorized_keys = [chomp(file(var.ssh_key))]
root_pass = random_string.password.result
private_ip = true
provisioner "remote-exec" {
inline = [
# install NGINX
"export PATH=$PATH:/usr/bin",
"apt-get -q update",
"mkdir -p /var/www/html/",
"mkdir -p /var/www/html/healthcheck",
"echo healthcheck > /var/www/html/healthcheck/index.html",
"echo node ${count.index + 1} > /var/www/html/index.html",
"apt-get -q -y install nginx",
]
connection {
type = "ssh"
user = "root"
password = random_string.password.result
host = self.ip_address
}
}
}
...
Tài nguyên trên sử dụng cùng một count
đối số như tài nguyên NodeBalancer Node đã được cấu hình ở bước trước. Ngoài ra, label
đối số đang được tăng tuần tự theo cách tương tự như NodeBalancer Node.
Đối authorized_keys
số được cung cấp là biến đầu vào khóa SSH sẽ được định nghĩa sau trong hướng dẫn này. Nó được truyền cho hàm file()
, đọc nội dung của tệp thành chuỗi. Chuỗi đó sau đó được truyền cho chomp()
hàm, xóa bất kỳ khoảng trắng thừa nào.
root_pass
được cung cấp kết quả của random_string
tài nguyên sẽ được xác định sau trong hướng dẫn này.
Điều cuối cùng cần lưu ý trong tài nguyên Linode Instance này là remote-exec
khối Provisioner. Khối này chứa hai thành phần khác, inline
danh sách và connection
khối. inline
là danh sách các lệnh mà Terraform sẽ thực thi trên Linode instance sau khi Linode instance đã khởi động. Trong ví dụ này, các lệnh nội tuyến sẽ: cập nhật Linode instance, tạo cấu trúc thư mục cần thiết cho NGINX, tạo tệp kiểm tra tình trạng và index.html
tệp tổng quát hơn, và cài đặt NGINX.
Khối connection
giải thích cho Terraform cách nó có thể truy cập vào phiên bản Linode để chạy các lệnh do inline
danh sách cung cấp. Trong trường hợp này, Terraform sẽ có thể truy cập qua SSH, đăng nhập với tư cách là root
người dùng.
Tạo một đầu ra
Bước cuối cùng bạn sẽ thực hiện khi tạo nodebalancer.tf
là thêm đầu ra. Terraform sẽ thêm thông tin này vào cuối đầu ra của nó trong terminal. Đầu ra có thể là bất kỳ thông tin nào từ cấu hình của bạn mà bạn muốn hiển thị. Dưới đây là một ví dụ sẽ hiển thị địa chỉ IP công khai của NodeBalancer:
...
output "nodebalancer_ip_address" {
value = linode_nodebalancer.example-nodebalancer.ipv4
}
Xác định các biến Terraform
Bây giờ bạn sẽ khai báo tất cả các biến cần thiết cho cấu hình Terraform của bạn trong một variables.tf
tệp.
1.Tạo một tệp có tên là variables.tf
. Tệp này sẽ tạo các biến được tham chiếu trong cấu hình NodeBalancer và Nodes của bạn. Bạn sẽ cung cấp giá trị cho các biến trong một bước khác.
variable "token" {
description = "Your APIv4 Access Token"
}
variable "region" {
description = "The data center where your NodeBalancer and Nodes will reside. E.g., 'us-east'."
default = "us-west"
}
variable "node_count" {
description = "The amount of backend Nodes to create."
}
variable "ssh_key" {
description = "The local file location of the SSH key that will be transferred to each Linode."
default = "~/.ssh/id_rsa.pub"
}
resource "random_string" "password" {
length = 32
special = true
upper = true
lower = true
number = true
}
Terraform cho phép mỗi biến có mô tả và giá trị mặc định riêng. Các biến này sẽ có giá trị được điền thông qua việc sử dụng tệp terraform.tfvars
mà bạn sẽ tạo ở bước tiếp theo. Việc tách định nghĩa biến khỏi giá trị của chúng giúp ngăn dữ liệu nhạy cảm xâm nhập vào mã Terraform của bạn, nếu bạn chọn đưa mã của mình vào hệ thống kiểm soát phiên bản như Git.Ngoài các biến bạn đã định nghĩa ở trên, còn có một random_string
tài nguyên có nhãn password
. Tài nguyên này được cung cấp bởi nhà cung cấp Random và sẽ tạo ra một chuỗi ngẫu nhiên gồm 32 ký tự, bao gồm các ký tự viết hoa, ký tự viết thường và số. Chuỗi này sẽ là mật khẩu gốc cho các Nodes phụ trợ của bạn. Nếu bạn muốn kiểm soát chính xác mật khẩu của mình, bạn có thể định nghĩa mật khẩu tại đây variables.tf
và đặt giá trị cho mật khẩu đó terraform.tfvars
trong bước tiếp theo.
2.Tạo terraform.tfvars
tệp và cung cấp giá trị cho các biến token
, region
, và node_count
. Ví dụ này sử dụng us-east
trung tâm dữ liệu và node_count
là hai.
token = "your_api_token"
region = "us-east"
node_count = 2
Khi Terraform chạy, nó sẽ tìm kiếm một tệp có tên terraform.tfvars
, hoặc các tệp có phần mở rộng *.auto.tfvars
, và điền các giá trị đó vào các biến Terraform. Nếu khóa SSH của bạn nằm ở vị trí tệp khác với giá trị mặc định, tức là không tồn tại tại ~/.ssh/id_rsa.pub
, thì bạn sẽ cần thêm giá trị đó vào terraform.tfvars
.
Ghi chú: Nếu bạn muốn sử dụng giá trị mặc định của biến đầu vào được xác định trong variables.tf
tệp, bạn có thể bỏ qua việc cung cấp giá trị cho biến đó trong terraform.tfvars
tệp.
Bạn có thể thoải mái thay đổi bất kỳ giá trị nào trong terraform.tfvars
tệp theo ý thích của mình. Để biết danh sách ID trung tâm dữ liệu, bạn có thể sử dụng lệnh cURL để truy vấn API:
curl https://api.linode.com/v4/regions
Khởi tạo, lập kế hoạch và áp dụng trạng thái Terraform
Vì hướng dẫn này sử dụng hai nhà cung cấp (Linode và Random) mà bạn có thể chưa cài đặt trên môi trường phát triển cục bộ của mình, nên bạn sẽ cần chạy init
lệnh để cài đặt chúng.
terraform init
Bạn sẽ thấy thông báo Terraform đã được khởi tạo thành công.
Để xem lại kế hoạch hành động của Terraform được xác định trong nodebalancer.tf
tệp, hãy chạy plan
lệnh:
terraform plan
Bạn sẽ thấy một đầu ra dài với tất cả các create
hành động sẽ diễn ra. Xem lại đầu ra, lưu ý rằng <computed>
các giá trị bạn thấy sẽ được xác định khi tạo. Khi bạn hài lòng với các hành động được đề xuất, đã đến lúc áp dụng chúng.
Chạy apply
lệnh:
terraform apply
Bạn sẽ được nhắc chấp thuận hành apply
động. Nhập yes và nhấn Enter . Terraform sẽ bắt đầu tạo các tài nguyên bạn đã cấu hình ở các bước trước. Quá trình này sẽ mất vài phút, sau đó bạn sẽ bắt đầu thấy đầu ra của remote-exec
các lệnh bạn đã xác định trong tài nguyên phiên bản Linode của mình. Khi tất cả các hành động hoàn tất, bạn sẽ thấy đầu ra như sau:
Apply complete! Resources: 7 added, 0 changed, 0 destroyed.
Outputs:
NodeBalancer IP Address = 104.237.148.131
Điều hướng đến địa chỉ IP NodeBalancer của bạn và xem NodeBalancer của bạn đang hoạt động. Bạn đã tạo thành công NodeBalancer và các nút phụ trợ trong Terraform.
(Tùy chọn) Xóa tài nguyên NodeBalancer
Nếu bạn đã hoàn tất các tài nguyên vừa tạo, bạn có thể xóa chúng bằng destroy
lệnh
terraform destroy
Lệnh này sẽ nhắc bạn xác nhận hành động.
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.
- Tài liệu tham khảo về nhà cung cấp Terraform Linode
- Tài liệu tham khảo linode_nodebalancer
- Tài liệu tham khảo linode_nodebalancer_config
- Tài liệu tham khảo linode_nodebalancer_node
- Tài liệu tham khảo tài nguyên linode_instance
- Tài liệu tham khảo về Nhà cung cấp ngẫu nhiên Terraform
- Tham chiếu hàm tích hợp Terraform
Nguồn: https://www.linode.com/docs/guides/create-a-nodebalancer-with-terraform/