Terraform là gì?
Terraform là một công cụ mạnh mẽ giúp chúng ta xây dựng và quản lý hạ tầng một cách có tổ chức. Bạn có thể dùng nó để quản lý các DigitalOcean Droplet, Load Balancer, thậm chí cả các bản ghi DNS, cùng vô số dịch vụ từ các nhà cung cấp khác. Terraform sử dụng giao diện dòng lệnh (CLI) và có thể chạy trực tiếp từ máy tính để bàn hoặc một máy chủ từ xa của bạn.
Terraform hoạt động như thế nào?
Terraform hoạt động bằng cách đọc các tệp cấu hình mô tả các thành phần của môi trường ứng dụng hoặc trung tâm dữ liệu của bạn. Dựa trên cấu hình đó, nó tạo ra một kế hoạch thực thi (execution plan) chi tiết về những gì nó sẽ làm để đạt được trạng thái mong muốn. Sau đó, bạn dùng Terraform để thực thi kế hoạch này nhằm xây dựng hạ tầng. Khi có thay đổi trong cấu hình, Terraform có thể tạo và thực thi các kế hoạch tăng cường để cập nhật hạ tầng hiện có lên trạng thái mới mô tả.
Trong hướng dẫn này, chúng ta sẽ cài đặt Terraform và xây dựng hạ tầng web cân bằng tải với terraform trên digitalocean bao gồm hai máy chủ Nginx được cân bằng tải bởi một DigitalOcean Load Balancer. Tiếp theo, chúng ta sẽ dùng Terraform để thêm một bản ghi DNS trên DigitalOcean trỏ về Load Balancer của bạn. Điều này sẽ giúp bạn bắt đầu làm quen với việc sử dụng Terraform và hình dung cách bạn có thể dùng nó để quản lý và triển khai một hạ tầng dựa trên DigitalOcean đáp ứng nhu cầu riêng của mình.
Lưu ý: Hướng dẫn này đã được kiểm tra với Terraform 1.1.3
.
Chuẩn bị
Để hoàn thành hướng dẫn này, bạn sẽ cần:
- Một tài khoản DigitalOcean.
- Một DigitalOcean Personal Access Token, bạn có thể tạo nó thông qua bảng điều khiển của DigitalOcean.
- Một SSH key không cần mật khẩu (password-less SSH key) đã được thêm vào tài khoản DigitalOcean của bạn. Khi bạn thêm key vào tài khoản, hãy nhớ tên bạn đặt cho nó, vì bạn sẽ cần nó trong hướng dẫn này. (Để Terraform chấp nhận tên key của bạn, nó phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới và chỉ có thể chứa chữ cái, chữ số, dấu gạch dưới và dấu gạch ngang.)
- Một tên miền cá nhân được trỏ về nameserver của DigitalOcean.
Bước 1: Cài đặt terraform
Terraform là một công cụ dòng lệnh mà bạn chạy trên máy tính để bàn hoặc trên một máy chủ từ xa. Để cài đặt nó, bạn sẽ tải về và đặt nó vào biến môi trường PATH
của bạn để có thể thực thi nó trong bất kỳ thư mục nào bạn đang làm việc.
Đầu tiên, hãy tải xuống gói phù hợp với hệ điều hành và kiến trúc của bạn từ trang Downloads chính thức. Nếu bạn đang dùng macOS hoặc Linux, bạn có thể tải Terraform bằng curl
.
Trên macOS, sử dụng lệnh này để tải Terraform và đặt nó vào thư mục Home của bạn:
curl -o ~/terraform.zip <https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_darwin_amd64.zip>
Trên Linux, sử dụng lệnh này:
curl -o ~/terraform.zip <https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip>
Tạo thư mục ~/opt/terraform
:
mkdir -p ~/opt/terraform
Sau đó, giải nén Terraform vào ~/opt/terraform
bằng lệnh unzip
. Trên Ubuntu, bạn có thể cài đặt unzip
bằng apt
:
sudo apt install unzip
Sử dụng nó để giải nén file đã tải xuống vào thư mục ~/opt/terraform
bằng cách chạy:
unzip ~/terraform.zip -d ~/opt/terraform
Cuối cùng, thêm ~/opt/terraform
vào biến môi trường PATH
của bạn để có thể thực thi lệnh terraform
mà không cần chỉ định toàn bộ đường dẫn đến tệp thực thi.
Trên Linux, bạn sẽ cần định nghĩa lại PATH
trong .bashrc
, tệp này chạy khi một shell mới mở. Mở nó để chỉnh sửa bằng cách chạy:
nano ~/.bashrc
Lưu ý: Trên macOS, thêm đường dẫn vào tệp .bash_profile
nếu sử dụng Bash, hoặc vào .zshrc
nếu sử dụng ZSH.
Để thêm đường dẫn của Terraform vào PATH
của bạn, hãy thêm dòng sau vào cuối tệp:
export PATH=$PATH:~/opt/terraform
Lưu và đóng tệp khi bạn hoàn thành.
Bây giờ, tất cả các phiên shell mới của bạn sẽ có thể tìm thấy lệnh terraform
. Để tải PATH
mới vào phiên hiện tại của bạn, hãy chạy lệnh sau nếu bạn đang sử dụng Bash trên hệ thống Linux:
. ~/.bashrc
Nếu bạn đang sử dụng Bash trên macOS, hãy thực thi lệnh này thay vào đó:
. .bash_profile
Nếu bạn đang sử dụng ZSH, hãy chạy lệnh này:
. .zshrc
Để xác minh rằng bạn đã cài đặt Terraform đúng cách, hãy chạy lệnh terraform
mà không có đối số nào:
terraform
Bạn sẽ thấy đầu ra tương tự như sau:
OutputUsage: terraform [global options] <subcommand> [args]
The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.
Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure
All other commands:
console Try Terraform expressions at an interactive command prompt
fmt Reformat your configuration in the standard style
force-unlock Release a stuck lock on the current workspace
get Install or upgrade remote Terraform modules
graph Generate a Graphviz graph of the steps in an operation
import Associate existing infrastructure with a Terraform resource
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Show output values from your root module
providers Show the providers required for this configuration
refresh Update the state to match remote systems
show Show the current state or a saved plan
state Advanced state management
taint Mark a resource instance as not fully functional
test Experimental support for module integration testing
untaint Remove the 'tainted' state from a resource instance
version Show the current Terraform version
workspace Workspace management
Global options (use these before the subcommand, if any):
-chdir=DIR Switch to a different working directory before executing the
given subcommand.
-help Show this help output, or the help for a specified subcommand.
-version An alias for the "version" subcommand.
Đây là các lệnh mà Terraform chấp nhận. Đầu ra cung cấp cho bạn mô tả ngắn gọn và bạn sẽ tìm hiểu thêm về chúng trong suốt hướng dẫn này.
Với Terraform đã được cài đặt, chúng ta hãy cấu hình nó để làm việc với các tài nguyên của DigitalOcean.
Bước 2: Cấu hình terraform cho digitalocean
Terraform hỗ trợ nhiều nhà cung cấp dịch vụ thông qua các provider mà bạn có thể cài đặt. Mỗi provider có các thông số kỹ thuật riêng, thường ánh xạ tới API của nhà cung cấp dịch vụ tương ứng.
DigitalOcean provider cho phép Terraform tương tác với DigitalOcean API để xây dựng hạ tầng. Provider này hỗ trợ tạo nhiều tài nguyên DigitalOcean khác nhau, bao gồm:
digitalocean_droplet
: Droplet (máy chủ)digitalocean_loadbalancer
: Load Balancerdigitalocean_domain
: Bản ghi tên miền DNSdigitalocean_record
: Bản ghi DNS
Terraform sẽ sử dụng DigitalOcean Personal Access Token của bạn để giao tiếp với DigitalOcean API và quản lý các tài nguyên trong tài khoản của bạn. Đừng chia sẻ key này với người khác và giữ nó tránh xa các script và hệ thống kiểm soát phiên bản. Hãy xuất DigitalOcean Personal Access Token của bạn ra một biến môi trường tên DO_PAT
bằng cách chạy:
export DO_PAT="your_personal_access_token"
Điều này sẽ giúp việc sử dụng nó trong các lệnh tiếp theo dễ dàng hơn và giữ nó tách biệt khỏi mã của bạn.
Lưu ý: Nếu bạn sẽ thường xuyên làm việc với Terraform và DigitalOcean, hãy thêm dòng này vào các tệp cấu hình shell của bạn bằng cách tiếp cận tương tự như bạn đã sử dụng để sửa đổi biến môi trường PATH
của mình ở bước trước.
Tạo một thư mục sẽ lưu trữ cấu hình hạ tầng của bạn bằng cách chạy lệnh sau:
mkdir ~/loadbalance
Di chuyển đến thư mục mới được tạo:
cd ~/loadbalance
Các cấu hình Terraform là các tệp văn bản có phần mở rộng .tf
. (Terraform cũng hỗ trợ các tệp cấu hình định dạng JSON, nhưng chúng sẽ không được đề cập ở đây.) Terraform sẽ đọc tất cả các tệp cấu hình trong thư mục làm việc của bạn, vì vậy thứ tự của các định nghĩa tài nguyên và biến không quan trọng. Toàn bộ hạ tầng của bạn có thể tồn tại trong một tệp cấu hình duy nhất, nhưng bạn nên tách các tệp cấu hình theo loại tài nguyên để duy trì sự rõ ràng.
Bước đầu tiên để xây dựng hạ tầng với Terraform là định nghĩa provider bạn sẽ sử dụng.
Để sử dụng DigitalOcean provider với Terraform, bạn phải thông báo cho Terraform về provider và cấu hình plugin với các biến xác thực phù hợp. Tạo một tệp có tên provider.tf
, tệp này sẽ lưu trữ cấu hình cho provider:
nano provider.tf
Thêm các dòng sau vào tệp để thông báo cho Terraform rằng bạn muốn sử dụng DigitalOcean provider và hướng dẫn Terraform nơi tìm thấy nó:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
Sau đó, định nghĩa các biến sau trong tệp để bạn có thể tham chiếu chúng trong phần còn lại của các tệp cấu hình của mình:
do_token
: DigitalOcean Personal Access Token của bạn.pvt_key
: Vị trí private key, để Terraform có thể sử dụng nó để đăng nhập vào các Droplet mới và cài đặt Nginx.
Bạn sẽ truyền các giá trị của các biến này vào Terraform khi chạy nó, thay vì mã hóa cứng các giá trị ở đây.
Để định nghĩa các biến này, hãy thêm các dòng này vào tệp:
...
variable "do_token" {}
variable "pvt_key" {}
Sau đó, thêm các dòng này để cấu hình DigitalOcean provider và chỉ định thông tin xác thực cho tài khoản DigitalOcean của bạn bằng cách gán do_token
cho đối số token
của provider:
...
provider "digitalocean" {
token = var.do_token
}
Cuối cùng, bạn sẽ muốn Terraform tự động thêm SSH key của bạn vào bất kỳ Droplet mới nào bạn tạo. Khi bạn thêm SSH key vào DigitalOcean, bạn đã đặt cho nó một tên. Terraform có thể sử dụng tên này để truy xuất public key. Thêm các dòng này, thay thế terraform
bằng tên của key bạn đã cung cấp trong tài khoản DigitalOcean của mình:
...
data "digitalocean_ssh_key" "terraform" {
name = "terraform"
}
Tệp provider.tf
hoàn chỉnh của bạn sẽ trông như thế này:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
variable "do_token" {}
variable "pvt_key" {}
provider "digitalocean" {
token = var.do_token
}
data "digitalocean_ssh_key" "terraform" {
name = "terraform"
}
Khi hoàn thành, hãy lưu và đóng tệp.
Lưu ý: Đặt biến môi trường TF_LOG
thành 1
sẽ bật ghi nhật ký chi tiết về những gì Terraform đang cố gắng thực hiện. Bạn có thể đặt nó bằng cách chạy:
export TF_LOG=1
Khởi tạo Terraform cho dự án của bạn bằng cách chạy:
terraform init
Lệnh này sẽ đọc cấu hình của bạn và cài đặt các plugin cho provider của bạn. Bạn sẽ thấy điều đó được ghi lại trong đầu ra:
OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.16.0...
- Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
<https://www.terraform.io/docs/cli/plugins/signing.html>
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Nếu bạn gặp khó khăn và Terraform không hoạt động như mong đợi, bạn có thể bắt đầu lại bằng cách xóa tệp terraform.tfstate
và hủy thủ công các tài nguyên đã được tạo.
Terraform hiện đã được cấu hình và có thể kết nối với tài khoản DigitalOcean của bạn. Ở bước tiếp theo, chúng ta sẽ sử dụng Terraform để định nghĩa một Droplet sẽ chạy máy chủ Nginx.
Bước 3: Định nghĩa máy chủ nginx đầu tiên
Bạn có thể sử dụng Terraform để tạo một DigitalOcean Droplet và cài đặt phần mềm trên Droplet sau khi nó khởi tạo. Trong bước này, bạn sẽ cấp phát một Droplet Ubuntu 20.04 duy nhất và cài đặt máy chủ web Nginx bằng Terraform.
Tạo một tệp cấu hình Terraform mới có tên www-1.tf
, tệp này sẽ chứa cấu hình cho Droplet:
nano www-1.tf
Thêm các dòng sau để định nghĩa tài nguyên Droplet:
resource "digitalocean_droplet" "www-1" {
image = "ubuntu-20-04-x64"
name = "www-1"
region = "nyc3"
size = "s-1vcpu-1gb"
ssh_keys = [
data.digitalocean_ssh_key.terraform.id
]
Trong cấu hình trên, dòng đầu tiên định nghĩa một tài nguyên digitalocean_droplet
có tên www-1
. Các dòng còn lại chỉ định các thuộc tính của Droplet, bao gồm trung tâm dữ liệu nó sẽ cư trú và slug xác định kích thước của Droplet bạn muốn cấu hình. Trong trường hợp này, bạn đang sử dụng s-1vcpu-1gb
, sẽ tạo một Droplet với một CPU và 1GB RAM. (Truy cập biểu đồ size slug này để xem các slug có sẵn bạn có thể sử dụng.)
Phần ssh_keys
chỉ định danh sách các public key bạn muốn thêm vào Droplet. Trong trường hợp này, bạn đang chỉ định key bạn đã định nghĩa trong provider.tf
. Đảm bảo tên ở đây khớp với tên bạn đã chỉ định trong provider.tf
.
Khi bạn chạy Terraform, nó sẽ thu thập nhiều thông tin khác nhau về Droplet, chẳng hạn như địa chỉ IP công khai và riêng tư của nó. Thông tin này có thể được sử dụng bởi các tài nguyên khác trong cấu hình của bạn.
Nếu bạn đang thắc mắc những đối số nào là bắt buộc hoặc tùy chọn cho một tài nguyên Droplet, vui lòng tham khảo tài liệu Terraform chính thức: DigitalOcean Droplet Specification.
Để thiết lập một connection
mà Terraform có thể sử dụng để kết nối với máy chủ qua SSH, hãy thêm các dòng sau vào cuối tệp:
...
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file(var.pvt_key)
timeout = "2m"
}
Các dòng này mô tả cách Terraform nên kết nối với máy chủ, để Terraform có thể kết nối qua SSH để cài đặt Nginx. Lưu ý việc sử dụng biến private key var.pvt_key
bạn sẽ truyền giá trị của nó vào khi chạy Terraform.
Bây giờ bạn đã thiết lập kết nối, hãy cấu hình remote-exec
provisioner, bạn sẽ sử dụng nó để cài đặt Nginx. Thêm các dòng sau vào cấu hình để thực hiện điều đó:
...
provisioner "remote-exec" {
inline = [
"export PATH=$PATH:/usr/bin",
# install nginx
"sudo apt update",
"sudo apt install -y nginx"
]
}
}
Lưu ý rằng các chuỗi trong mảng inline
là các lệnh mà người dùng root
sẽ chạy để cài đặt Nginx.
Tệp hoàn chỉnh trông như thế này:
resource "digitalocean_droplet" "www-1" {
image = "ubuntu-20-04-x64"
name = "www-1"
region = "nyc3"
size = "s-1vcpu-1gb"
ssh_keys = [
data.digitalocean_ssh_key.terraform.id
]
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file(var.pvt_key)
timeout = "2m"
}
provisioner "remote-exec" {
inline = [
"export PATH=$PATH:/usr/bin",
# install nginx
"sudo apt update",
"sudo apt install -y nginx"
]
}
}
Lưu tệp và thoát trình chỉnh sửa. Bạn đã định nghĩa máy chủ và sẵn sàng triển khai nó, điều mà chúng ta sẽ thực hiện ngay bây giờ.
Bước 4: Sử dụng terraform để tạo máy chủ nginx
Cấu hình Terraform hiện tại của bạn mô tả một máy chủ Nginx duy nhất. Bạn sẽ triển khai Droplet chính xác như nó đã được định nghĩa.
Chạy lệnh terraform plan
để xem execution plan
, hoặc những gì Terraform sẽ cố gắng làm để xây dựng hạ tầng bạn đã mô tả. Bạn sẽ phải chỉ định các giá trị cho DigitalOcean Access Token của mình và đường dẫn đến private key, vì cấu hình của bạn sử dụng thông tin này để truy cập Droplet của bạn để cài đặt Nginx. Chạy lệnh sau để tạo một plan:
terraform plan \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Cảnh báo: Lệnh terraform plan
hỗ trợ tham số -out
để lưu plan. Tuy nhiên, plan sẽ lưu trữ các API key và Terraform không mã hóa dữ liệu này. Khi sử dụng tùy chọn này, bạn nên tìm hiểu về việc mã hóa tệp này nếu bạn định gửi nó cho người khác hoặc để nó ở trạng thái tĩnh trong một thời gian dài.
Bạn sẽ thấy đầu ra tương tự như thế này:
OutputTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_droplet.www-1 will be created
+ resource "digitalocean_droplet" "www-1" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ id = (known after apply)
+ image = "ubuntu-20-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "www-1"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "nyc3"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ ssh_keys = [
+ "...",
]
+ status = (known after apply)
+ urn = (known after apply)
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
───────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
Dòng + resource "digitalocean_droplet" "www-1"
có nghĩa là Terraform sẽ tạo một tài nguyên Droplet mới có tên www-1
, với các chi tiết theo sau. Đó chính xác là những gì nên xảy ra, vì vậy hãy chạy lệnh terraform apply
để thực thi plan hiện tại:
terraform apply \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Bạn sẽ nhận được đầu ra tương tự như trước, nhưng lần này, Terraform sẽ hỏi bạn có muốn tiếp tục không:
Output...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Nhập yes
và nhấn ENTER
. Terraform sẽ cấp phát Droplet của bạn:
Outputdigitalocean_droplet.www-1: Creating...
Sau một thời gian, bạn sẽ thấy Terraform cài đặt Nginx với remote-exec
provisioner và sau đó quá trình sẽ hoàn tất:
Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'...
....
digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...
Terraform đã tạo một Droplet mới có tên www-1
và cài đặt Nginx trên đó. Nếu bạn truy cập địa chỉ IP công khai của Droplet mới của mình, bạn sẽ thấy màn hình chào mừng của Nginx. Địa chỉ IP công khai đã được hiển thị khi Droplet được tạo, nhưng bạn luôn có thể xem nó bằng cách kiểm tra trạng thái hiện tại của Terraform. Terraform cập nhật tệp trạng thái terraform.tfstate
mỗi khi nó thực thi một plan hoặc làm mới trạng thái của nó.
Để xem trạng thái hiện tại của môi trường của bạn, hãy sử dụng lệnh sau:
terraform show terraform.tfstate
Thao tác này sẽ hiển thị địa chỉ IP công khai của Droplet của bạn.
Outputresource "digitalocean_droplet" "www-1" {
backups = false
created_at = "..."
disk = 25
id = "your_www-1_droplet_id"
image = "ubuntu-20-04-x64"
ipv4_address = "your_www-1_server_ip"
ipv4_address_private = "10.128.0.2"
...
Truy cập http://your_www-1_server_ip
trong trình duyệt của bạn để xác minh máy chủ Nginx của bạn đang chạy.
Lưu ý: Nếu bạn sửa đổi hạ tầng của mình bên ngoài Terraform, tệp trạng thái của bạn sẽ lỗi thời. Nếu các tài nguyên của bạn được sửa đổi bên ngoài Terraform, bạn sẽ cần làm mới tệp trạng thái để cập nhật nó. Lệnh này sẽ kéo thông tin tài nguyên được cập nhật từ (các) nhà cung cấp của bạn:
terraform refresh \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Ở bước này, bạn đã triển khai Droplet mà bạn đã mô tả trong Terraform. Bây giờ, bạn sẽ tạo một cái thứ hai.
Bước 5: Tạo máy chủ nginx thứ hai
Bây giờ bạn đã mô tả một máy chủ Nginx, bạn có thể nhanh chóng thêm một máy chủ thứ hai bằng cách sao chép tệp cấu hình của máy chủ hiện có và thay thế tên và hostname của tài nguyên Droplet.
Bạn có thể làm điều này thủ công, nhưng nhanh hơn là sử dụng lệnh sed
để đọc tệp www-1.tf
, thay thế tất cả các trường www-1
bằng www-2
và tạo một tệp mới có tên www-2.tf
. Đây là lệnh sed
để làm điều đó:
sed 's/www-1/www-2/g' www-1.tf > www-2.tf
Bạn có thể tìm hiểu thêm về sed
bằng cách truy cập Using sed.
Chạy terraform plan
một lần nữa để xem trước các thay đổi mà Terraform sẽ thực hiện:
terraform plan \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Đầu ra cho thấy Terraform sẽ tạo máy chủ thứ hai, www-2
:
OutputTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_droplet.www-2 will be created
+ resource "digitalocean_droplet" "www-2" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ id = (known after apply)
+ image = "ubuntu-20-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "www-2"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = true
+ region = "nyc3"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ ssh_keys = [
+ "...",
]
+ status = (known after apply)
+ urn = (known after apply)
+ vcpus = (known after apply)
+ volume_ids = (known after apply)
+ vpc_uuid = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
...
Chạy terraform apply
một lần nữa để tạo Droplet thứ hai:
terraform apply \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Như trước, Terraform sẽ yêu cầu bạn xác nhận xem bạn có muốn tiếp tục không. Xem lại plan một lần nữa và gõ yes
để tiếp tục.
Sau một thời gian, Terraform sẽ tạo máy chủ mới và hiển thị kết quả:
Outputdigitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Terraform đã tạo máy chủ mới, trong khi không làm thay đổi máy chủ hiện có. Bạn có thể lặp lại bước này để thêm các máy chủ Nginx bổ sung.
Bây giờ bạn đã có hai Droplet đang chạy Nginx, bạn sẽ định nghĩa và triển khai một load balancer để phân chia lưu lượng truy cập giữa chúng.
Bước 6: Tạo load balancer
Bạn sẽ sử dụng một DigitalOcean Load Balancer, được hỗ trợ bởi provider Terraform chính thức, để định tuyến lưu lượng truy cập giữa hai máy chủ web.
Tạo một tệp cấu hình Terraform mới có tên loadbalancer.tf
:
nano loadbalancer.tf
Thêm các dòng sau để định nghĩa Load Balancer:
resource "digitalocean_loadbalancer" "www-lb" {
name = "www-lb"
region = "nyc3"
forwarding_rule {
entry_port = 80
entry_protocol = "http"
target_port = 80
target_protocol = "http"
}
healthcheck {
port = 22
protocol = "tcp"
}
droplet_ids = [digitalocean_droplet.www-1.id, digitalocean_droplet.www-2.id ]
}
Định nghĩa Load Balancer chỉ định tên của nó, trung tâm dữ liệu nó sẽ nằm trong, các cổng nó nên lắng nghe để cân bằng lưu lượng truy cập, cấu hình cho health check và ID của các Droplet nó nên cân bằng. Lưu và đóng tệp.
Chạy lệnh terraform plan
một lần nữa để xem lại kế hoạch thực thi mới:
terraform plan \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Bạn sẽ thấy một vài dòng đầu ra, bao gồm các dòng sau:
Output...
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_loadbalancer.www-lb will be created
+ resource "digitalocean_loadbalancer" "www-lb" {
+ algorithm = "round_robin"
+ disable_lets_encrypt_dns_records = false
+ droplet_ids = [
+ ...,
+ ...,
]
+ enable_backend_keepalive = false
+ enable_proxy_protocol = false
+ id = (known after apply)
+ ip = (known after apply)
+ name = "www-lb"
+ redirect_http_to_https = false
+ region = "nyc3"
+ size_unit = (known after apply)
+ status = (known after apply)
+ urn = (known after apply)
+ vpc_uuid = (known after apply)
+ forwarding_rule {
+ certificate_id = (known after apply)
+ certificate_name = (known after apply)
+ entry_port = 80
+ entry_protocol = "http"
+ target_port = 80
+ target_protocol = "http"
+ tls_passthrough = false
}
+ healthcheck {
+ check_interval_seconds = 10
+ healthy_threshold = 5
+ port = 22
+ protocol = "tcp"
+ response_timeout_seconds = 5
+ unhealthy_threshold = 3
}
+ sticky_sessions {
+ cookie_name = (known after apply)
+ cookie_ttl_seconds = (known after apply)
+ type = (known after apply)
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
...
Điều này có nghĩa là các Droplet www-1
và www-2
đã tồn tại, và Terraform sẽ tạo Load Balancer www-lb
.
Chạy terraform apply
để xây dựng Load Balancer:
terraform apply \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Một lần nữa, Terraform sẽ yêu cầu bạn xem lại plan. Chấp thuận plan bằng cách nhập yes
để tiếp tục.
Khi bạn làm vậy, bạn sẽ thấy đầu ra chứa các dòng sau, được cắt bớt cho ngắn gọn:
Output...
digitalocean_loadbalancer.www-lb: Creating...
...
digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...
Sử dụng terraform show terraform.tfstate
để xác định địa chỉ IP của Load Balancer của bạn:
terraform show terraform.tfstate
Bạn sẽ tìm thấy IP dưới mục www-lb
:
Output...
# digitalocean_loadbalancer.www-lb:
resource "digitalocean_loadbalancer" "www-lb" {
algorithm = "round_robin"
disable_lets_encrypt_dns_records = false
droplet_ids = [
your_www-1_droplet_id,
your_www-2_droplet_id,
]
enable_backend_keepalive = false
enable_proxy_protocol = false
id = "your_load_balancer_id"
ip = "your_load_balancer_ip"
name = "www-lb"
...
Truy cập http://your_load_balancer_ip
trong trình duyệt của bạn và bạn sẽ thấy màn hình chào mừng của Nginx vì Load Balancer đang gửi lưu lượng truy cập đến một trong hai máy chủ Nginx.
Bạn sẽ tìm hiểu cách cấu hình DNS cho tài khoản DigitalOcean của mình bằng Terraform.
Bước 7: Tạo tên miền và bản ghi dns
Ngoài Droplet và Load Balancer, Terraform cũng có thể tạo tên miền và bản ghi DNS. Ví dụ, nếu bạn muốn trỏ tên miền của mình đến Load Balancer, bạn có thể viết cấu hình mô tả mối quan hệ đó.
Lưu ý: Hãy sử dụng tên miền duy nhất của riêng bạn, nếu không Terraform sẽ không thể triển khai các tài nguyên DNS. Đảm bảo tên miền của bạn đã được trỏ về nameserver của DigitalOcean.
Tạo một tệp mới để mô tả DNS của bạn:
nano domain_root.tf
Thêm tài nguyên miền sau, thay thế your_domain
bằng tên miền của bạn:
resource "digitalocean_domain" "default" {
name = "your_domain"
ip_address = digitalocean_loadbalancer.www-lb.ip
}
Lưu và đóng tệp khi bạn hoàn thành.
Bạn cũng có thể thêm một bản ghi CNAME trỏ www.your_domain
tới your_domain
. Tạo một tệp mới cho bản ghi CNAME:
nano domain_cname.tf
Thêm các dòng này vào tệp:
resource "digitalocean_record" "CNAME-www" {
domain = digitalocean_domain.default.name
type = "CNAME"
name = "www"
value = "@"
}
Lưu và đóng tệp khi bạn hoàn thành.
Để thêm các mục DNS, hãy chạy terraform plan
sau đó là terraform apply
, giống như với các tài nguyên khác.
Truy cập tên miền của bạn và bạn sẽ thấy màn hình chào mừng của Nginx vì tên miền đang trỏ đến Load Balancer, nơi đang gửi lưu lượng truy cập đến một trong hai máy chủ Nginx.
Bước 8: Xóa hạ tầng của bạn
Mặc dù không phổ biến trong môi trường sản xuất, Terraform cũng có thể xóa hạ tầng mà nó đã tạo. Điều này chủ yếu hữu ích trong các môi trường phát triển được triển khai và hủy nhiều lần.
Đầu tiên, tạo một plan thực thi để xóa hạ tầng bằng cách sử dụng terraform plan -destroy
:
terraform plan -destroy -out=terraform.tfplan \\\\
-var "do_token=${DO_PAT}" \\\\
-var "pvt_key=$HOME/.ssh/id_rsa"
Terraform sẽ xuất ra một plan với các tài nguyên được đánh dấu màu đỏ và có tiền tố là dấu trừ, cho biết rằng nó sẽ xóa các tài nguyên trong hạ tầng của bạn.
Sau đó, sử dụng terraform apply
để chạy plan:
terraform apply terraform.tfplan
Terraform sẽ tiến hành phá hủy các tài nguyên, như được chỉ ra trong plan đã tạo.
Kết luận
Trong hướng dẫn này, bạn đã sử dụng Terraform để xây dựng một hạ tầng web cân bằng tải trên DigitalOcean, với hai máy chủ web Nginx chạy sau DigitalOcean Load Balancer. Bạn đã biết cách tạo và hủy tài nguyên, xem trạng thái hiện tại và sử dụng Terraform để cấu hình các bản ghi DNS.
Bây giờ bạn đã hiểu cách Terraform hoạt động, bạn có thể tạo các tệp cấu hình mô tả hạ tầng máy chủ cho các dự án của riêng mình. Ví dụ trong hướng dẫn này là một điểm khởi đầu tốt cho thấy cách bạn có thể tự động hóa việc triển khai máy chủ. Nếu bạn đã sử dụng các công cụ provisioning, bạn có thể tích hợp chúng với Terraform để cấu hình máy chủ như một phần của quá trình tạo thay vì sử dụng phương pháp provisioning được sử dụng trong hướng dẫn này.
Terraform có nhiều tính năng hơn nữa và có thể hoạt động với các provider khác. Hãy xem tài liệu Terraform chính thức để tìm hiểu thêm về cách bạn có thể sử dụng Terraform để cải thiện hạ tầng của riêng mình.