Nhà cung cấp Terraform của Linode hỗ trợ StackScripts . StackScripts cho phép bạn tự động triển khai phần mềm tùy chỉnh trên các hình ảnh phân phối Linux mặc định của Linode hoặc trên bất kỳ hình ảnh tùy chỉnh nào đã lưu của bạn . Bạn có thể tạo StackScripts của riêng mình, sử dụng StackScript do Linode tạo ra hoặc sử dụng Community StackScript.
Hướng dẫn này trình bày cách sử dụng Community StackScript để triển khai WordPress trên Compute Instance bằng Terraform.
Quan trọng: Thực hiện theo hướng dẫn này sẽ tạo ra các nguồn tài nguyên có thể thanh toán trên tài khoản của bạn. Để tránh tiếp tục thanh toán cho các nguồn tài nguyên này, hãy xóa chúng khi bạn đã hoàn tất hướng dẫn.
Trước khi bạn bắt đầu
1.Cài đặt Terraform trên máy tính của bạn bằng cách làm theo phần Cài đặt Terraform trong 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.
2.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 để có được mã thông báo.
3.Nếu bạn chưa thực hiện, hãy chỉ định máy chủ tên của Linode cho tên miền của bạn tại cơ quan đăng ký tên miền.
4.Duyệt Thư viện StackScripts hiện có để làm quen với các tác vụ phổ biến mà bạn có thể hoàn thành với StackScripts hiện có.
Tạo cấu hình Terraform
Terraform định nghĩa các thành phần của cơ sở hạ tầng Linode của bạn bên trong các tệp cấu hình. Terraform gọi các thành phần cơ sở hạ tầng này là tài nguyên . Sau khi bạn khai báo cấu hình Terraform của mình, bạn sẽ áp dụng cấu hình đó, dẫn đến việc tạo các tài nguyên đó trên nền tảng Linode.
Tạo tệp cấu hình Terraform
1.Đảm bảo rằng bạn đang ở trong terraform
thư mục.
cd ~/terraform
2.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo tệp cấu hình Terraform có tên main.tf
để lưu trữ định nghĩa tài nguyên của bạn:
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.26.0"
}
}
}
provider "linode" {
token = var.token
}
resource "linode_sshkey" "my_wordpress_linode_ssh_key" {
label = "my_ssh_key"
ssh_key = chomp(file("~/.ssh/id_rsa.pub"))
}
resource "random_string" "my_wordpress_linode_root_password" {
length = 32
special = true
}
resource "linode_instance" "my_wordpress_linode" {
image = var.image
label = var.label
region = var.region
type = var.type
authorized_keys = [ linode_sshkey.my_wordpress_linode_ssh_key.ssh_key ]
root_pass = random_string.my_wordpress_linode_root_password.result
stackscript_id = var.stackscript_id
stackscript_data = {
"ssuser" = var.stackscript_data["ssuser"]
"hostname" = var.stackscript_data["hostname"]
"website" = var.stackscript_data["website"]
"dbuser" = var.stackscript_data["dbuser"]
"db_password" = var.stackscript_data["db_password"]
"sspassword" = var.stackscript_data["sspassword"]
"dbuser_password" = var.stackscript_data["dbuser_password"]
}
}
resource "linode_domain" "my_wordpress_domain" {
domain = var.domain
soa_email = var.soa_email
type = "master"
}
resource "linode_domain_record" "my_wordpress_domain_www_record" {
domain_id = "${linode_domain.my_wordpress_domain.id}"
name = "www"
record_type = var.a_record
target = "${linode_instance.my_wordpress_linode.ip_address}"
}
resource "linode_domain_record" "my_wordpress_domain_apex_record" {
domain_id = "${linode_domain.my_wordpress_domain.id}"
name = ""
record_type = var.a_record
target = "${linode_instance.my_wordpress_linode.ip_address}"
}
- Tệp cấu hình Terraform sử dụng cú pháp nội suy để tham chiếu các biến đầu vào của Terraform , gọi các hàm tích hợp của Terraform và tham chiếu các thuộc tính của các tài nguyên khác.Các biến và giá trị của chúng sẽ được tạo trong các tệp riêng biệt sau này trong hướng dẫn này. Sử dụng các tệp riêng biệt để khai báo biến cho phép bạn tránh mã hóa cứng các giá trị vào tài nguyên của mình. Chiến lược này có thể giúp bạn tái sử dụng, chia sẻ và kiểm soát phiên bản cấu hình Terraform của mình.
Kiểm tra cấu hình Terraform
Chúng ta hãy xem xét kỹ hơn từng khối trong tệp cấu hình:
1.Khổ thơ đầu tiên tuyên bố Linode là nhà cung cấp Terraform sẽ quản lý vòng đời của bất kỳ tài nguyên nào được khai báo trong suốt tệp cấu hình. Nhà cung cấp Linode yêu cầu mã thông báo Linode APIv4 của bạn để xác thực:
provider "linode" {
token = var.token
}
2.Tài nguyên tiếp theo cấu hình Khóa SSH sẽ được tải lên Phiên bản máy tính của bạn sau trong tệp cấu hình:
resource "linode_sshkey" "my_wordpress_linode_ssh_key" {
label = "my_ssh_key"
ssh_key = chomp(file("~/.ssh/id_rsa.pub"))
}
ssh_key = chomp(file("~/.ssh/id_rsa.pub"))
sử dụng chức năng tích hợp của Terraform file()
để cung cấp đường dẫn tệp cục bộ đến vị trí khóa SSH công khai. Chức chomp()
năng tích hợp này xóa các dòng mới theo sau khỏi khóa SSH.
Ghi chú: Nếu bạn chưa có khóa SSH, hãy làm theo các bước trong phần Tạo cặp khóa xác thực của Hướng dẫn bảo mật máy chủ .
3.Tài random_string
nguyên có thể được sử dụng để tạo một chuỗi ngẫu nhiên gồm 32 ký tự. linode_instance
Tài nguyên sẽ sử dụng nó để tạo mật khẩu người dùng root:
resource "random_string" "my_wordpress_linode_root_password" {
length = 32
special = true
}
4.Tài linode_instance
nguyên tạo ra một Compute Instance với các cấu hình đã khai báo:
resource "linode_instance" "my_wordpress_linode" {
image = var.image
label = var.label
region = var.region
type = var.type
authorized_keys = [ linode_sshkey.my_wordpress_linode_ssh_key.ssh_key ]
root_pass = random_string.my_wordpress_linode_root_password.result
stackscript_id = var.stackscript_id
stackscript_data = {
"ssuser" = var.stackscript_data["ssuser"]
"hostname" = var.stackscript_data["hostname"]
"website" = var.stackscript_data["website"]
"dbuser" = var.stackscript_data["dbuser"]
"db_password" = var.stackscript_data["db_password"]
"sspassword" = var.stackscript_data["sspassword"]
"dbuser_password" = var.stackscript_data["dbuser_password"]
}
}
- Đối
authorized_keys
số sử dụng khóa công khai SSH dolinode_sshkey
tài nguyên cung cấp trong khổ trước. Đối số này mong đợi một giá trị có kiểulist
, do đó giá trị phải được đặt trong dấu ngoặc. - Đối
root_pass
số được gán cho giá trị củarandom_string
tài nguyên đã khai báo trước đó. - Để sử dụng StackScript hiện có, bạn phải sử dụng
stackscript_id
đối số và cung cấp ID hợp lệ làm giá trị. Mỗi StackScript được gán một ID duy nhất khi tạo. Hướng dẫn này sử dụng WordPress trên Ubuntu 20.04 StackScript do người dùng Linode hmorris điều chỉnh . ID của StackScript này sẽ được gán cho một biến Terraform sau trong hướng dẫn này.StackScripts hỗ trợ dữ liệu do người dùng xác định. StackScript có thể sử dụng thẻUDF
để tạo biến có giá trị phải do người dùng của tập lệnh cung cấp. Điều này cho phép người dùng tùy chỉnh hành vi của StackScript trên cơ sở mỗi lần triển khai. Bất kỳUDF
biến bắt buộc nào cũng có thể được xác định bằngstackscript_data
đối số.StackScript chịu trách nhiệm cài đặt WordPress trên Compute Instance của bạn cùng với tất cả các yêu cầu khác, chẳng hạn như cài đặt Apache, cấu hình Apache, cấu hình tệp Virtual Hosts và cài đặt MySQL. - Các đối số khác được gán giá trị bởi các biến Terraform sẽ được khai báo sau trong hướng dẫn này.
5.Để hoàn tất cấu hình trang web WordPress của bạn, bạn cần tạo một tên miền và các bản ghi tên miền tương ứng cho trang web của bạn. Các tài nguyên linode_domain
và linode_domain_record
xử lý các cấu hình này:
resource "linode_domain" "my_wordpress_domain" {
domain = var.domain
soa_email = var.soa_email
type = "master"
}
resource "linode_domain_record" "my_wordpress_domain_www_record" {
domain_id = "${linode_domain.my_wordpress_domain.id}"
name = "www"
record_type = var.a_record
target = "${linode_instance.my_wordpress_linode.ip_address}"
}
resource "linode_domain_record" "my_wordpress_domain_apex_record" {
domain_id = "${linode_domain.my_wordpress_domain.id}"
name = ""
record_type = var.a_record
target = "${linode_instance.my_wordpress_linode.ip_address}"
}
Ghi chú: Nếu bạn không quen với Hệ thống tên miền (DNS), hãy xem lại hướng dẫn Giới thiệu về Bản ghi DNS .
Xác định các biến đầu vào
Trong terraform
thư mục, tạo một tệp có tên variables.tf
. Tệp này sẽ định nghĩa tất cả các biến được sử dụng trong tệp main.tf
ở phần trước. Các giá trị cho các biến này (ngoài các giá trị mặc định của chúng) sẽ được gán trong một tệp khác:
variable "token" {
description = "Linode API Personal Access Token"
}
variable "image" {
description = "Image to use for Linode instance"
default = "linode/ubuntu20.04"
}
variable "label" {
description = "The Linode's label is for display purposes only."
default = "default-linode"
}
variable "region" {
description = "The region where your Linode will be located."
default = "us-east"
}
variable "type" {
description = "Your Linode's plan type."
default = "g6-standard-1"
}
variable "stackscript_id" {
description = "StackScript ID"
}
variable "stackscript_data" {
description = "Map of required StackScript UDF data."
type = "map"
}
variable "domain" {
description = "The domain this domain represents."
}
variable "soa_email" {
description = "Start of Authority email address. This is required for master domains."
}
variable "a_record" {
description = "The type of DNS record. For example, `A` records associate a domain name with an IPv4 address."
default = "A"
}
Ghi chú: Nên bao gồm một description
thuộc tính cho mỗi biến đầu vào để giúp ghi lại cách sử dụng cấu hình của bạn. Điều này sẽ giúp bất kỳ ai khác sử dụng cấu hình Terraform này dễ dàng hơn.
Mỗi biến có thể chứa một default
giá trị. default
Giá trị chỉ được sử dụng nếu không có giá trị nào khác được cung cấp. Bạn cũng có thể khai báo a type
cho mỗi biến. Nếu không cung cấp kiểu nào, biến sẽ mặc định là type = "string"
.
Biến stackscript_data
có kiểu map
. Điều này sẽ cho phép bạn cung cấp giá trị cho nhiều UDF
biến tùy theo yêu cầu của StackScript.
Gán giá trị cho các biến đầu vào
Terraform cho phép bạn gán biến theo nhiều cách. Ví dụ, bạn có thể gán giá trị biến thông qua dòng lệnh khi chạy terraform apply
. Để duy trì giá trị biến, bạn cũng có thể tạo tệp để lưu tất cả các giá trị của mình.
Ghi chú: Có một số tùy chọn khác có sẵn để quản lý bí mật với Terraform. Để biết thêm thông tin về điều này, hãy xem Quản lý bí mật với Terraform .
Terraform sẽ tự động tải bất kỳ tệp nào được đặt tên terraform.tfvars
và sử dụng nội dung của tệp đó để điền vào các biến. Tuy nhiên, bạn nên tách riêng bất kỳ giá trị nhạy cảm nào, như mật khẩu và mã thông báo, vào tệp riêng của chúng. Giữ tệp nhạy cảm này ngoài tầm kiểm soát phiên bản.
1.Tạo một tệp có tên terraform.tfvars
trong terraform
thư mục của bạn để lưu trữ tất cả các giá trị không nhạy cảm:
label = "wp-linode"
stackscript_id = "998743"
domain = "example.com"
soa_email = "user@email.com"
2.Tạo tên tệp secrets.tfvars
trong terraform
thư mục của bạn để lưu trữ mọi giá trị nhạy cảm:
token = "my-linode-api4-token"
stackscript_data = {
"ssuser" = "username"
"hostname" = "wordpress"
"website" = "example.com"
"dbuser" = "wpuser"
"sspassword" = "my-secure-password"
"db_password" = "another-secure-password"
"dbuser_password" = "a-third-secure-password"
}
Ghi chú: Trong Terraform 0.12, các biến có giá trị map và object sẽ sử dụng giá trị cuối cùng được tìm thấy và ghi đè các giá trị trước đó. Điều này khác với các phiên bản trước của Terraform, sẽ hợp nhất các giá trị map thay vì ghi đè chúng. Vì lý do này, stackscript_data
map và các giá trị của nó được định nghĩa trong một tệp định nghĩa biến duy nhất.
Ghi chú: Sẽ rất hữu ích khi tham khảo tài liệu về nhà cung cấp Linode của Terraform và tài liệu Linode APIv4 để hỗ trợ xác định giá trị phù hợp cho tài nguyên Linode.
- Thay thế các giá trị sau vào
.tfvars
tệp mới của bạn:token
nên được thay thế bằng mã thông báo APIv4 của tài khoản Linode của bạn.- Vì mục đích bảo mật, StackScript sẽ tạo một người dùng Linux giới hạn trên Compute Instance của bạn.
ssuser
nên được thay thế bằng tên người dùng mong muốn của bạn cho người dùng này. sspassword
,db_password
, vàdbuser_password
nên thay thế bằng mật khẩu an toàn của riêng bạn.domain
nên được thay thế bằng địa chỉ tên miền trang web WordPress của bạn.soa_email
phải là địa chỉ email bạn muốn sử dụng làm địa chỉ email Bắt đầu thẩm quyền của mình .
Khởi tạo, lập kế hoạch và áp dụng cấu hình Terraform
Cấu hình Terraform của bạn đã được ghi lại, nhưng bạn vẫn chưa yêu cầu Terraform tạo tài nguyên. Để thực hiện việc này, bạn sẽ gọi lệnh từ CLI của Terraform.
Khởi tạo
Bất cứ khi nào một nhà cung cấp mới được sử dụng trong cấu hình Terraform, nó phải được khởi tạo trước khi bạn có thể tạo tài nguyên với nó. Quá trình khởi tạo tải xuống và cài đặt plugin của nhà cung cấp và thực hiện bất kỳ bước nào khác cần thiết để chuẩn bị cho việc sử dụng nó.
Điều hướng đến terraform
thư mục trong terminal của bạn và chạy:
terraform init
Bạn sẽ thấy một thông báo xác nhận rằng plugin của nhà cung cấp Linode đã được khởi tạo thành công.
Kế hoạch
Có thể hữu ích khi xem kế hoạch thực hiện cấu hình của bạn trước khi thực sự cam kết những thay đổi đó vào cơ sở hạ tầng của bạn. Terraform bao gồm một plan
lệnh cho mục đích này. Chạy lệnh này từ terraform
thư mục:
terraform plan \
-var-file="secrets.tfvars" \
-var-file="terraform.tfvars"
plan
sẽ không thực hiện bất kỳ hành động nào hoặc thực hiện bất kỳ thay đổi nào trên tài khoản Linode của bạn. Thay vào đó, một phân tích được thực hiện để xác định hành động nào (tức là tạo, xóa hoặc sửa đổi tài nguyên Linode) là cần thiết để đạt được trạng thái được mô tả trong cấu hình của bạn.
Áp dụng
Bây giờ bạn đã sẵn sàng để tạo cơ sở hạ tầng được xác định trong main.tf
tệp cấu hình của mình:
- Chạy lệnh Terraform
apply
từterraform
thư mục:
terraform apply \
-var-file="secrets.tfvars" \
-var-file="terraform.tfvars"
Vì bạn đang sử dụng nhiều tệp giá trị biến, bạn phải bao gồm từng tệp riêng lẻ bằng cách sử dụng var-file
đối số. Bạn sẽ được nhắc xác nhận hành apply
động. Nhập yes và nhấn enter .
2.Terraform sẽ bắt đầu tạo các tài nguyên bạn đã xác định trong hướng dẫn này. Quá trình này sẽ mất vài phút để hoàn tất. Khi cơ sở hạ tầng đã được xây dựng thành công, bạn sẽ thấy kết quả tương tự:
Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
3.Điều hướng đến tên miền của trang WordPress của bạn và xác minh rằng trang web đã tải. Bạn có thể phải đợi thêm vài phút sau khi lệnh terraform apply
trả về, vì StackScript mất thời gian để cài đặt WordPress. Ngoài ra, có thể mất một thời gian để tên miền của bạn thay đổi được lan truyền:
4.Hoàn tất các bước cấu hình WordPress còn lại theo lời nhắc.
(Tùy chọn) Hủy tài nguyên Linode
Nếu bạn không muốn tiếp tục sử dụng các tài nguyên do Terraform tạo ra trong hướng dẫn này, hãy chạy destroy
lệnh từ terraform
thư mục:
terraform destroy \
-var-file="secrets.tfvars" \
-var-file="terraform.tfvars"
Terraform sẽ nhắc bạn xác nhận hành động này. Nhập yes để tiếp tục.
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/deploy-a-wordpress-site-using-terraform-and-linode-stackscripts/