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 terraformthư 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}"
}
  1. 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_stringnguyên có thể được sử dụng để tạo một chuỗi ngẫu nhiên gồm 32 ký tự. linode_instanceTà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_instancenguyê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_keyssố sử dụng khóa công khai SSH do linode_sshkeytài nguyên cung cấp trong khổ trước. Đối số này mong đợi một giá trị có kiểu list, do đó giá trị phải được đặt trong dấu ngoặc.
  • Đối root_passsố được gán cho giá trị của random_stringtà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ỳ UDFbiến bắt buộc nào cũng có thể được xác định bằng stackscript_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_domainvà linode_domain_recordxử 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 terraformthư 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 descriptionthuộ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 defaultgiá trị. defaultGiá 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 typecho 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_datacó kiểu map. Điều này sẽ cho phép bạn cung cấp giá trị cho nhiều UDFbiế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.tfvarsvà 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.tfvarstrong terraformthư 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.tfvarstrong terraformthư 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_datamap 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.

  1. Thay thế các giá trị sau vào .tfvarstệp mới của bạn:
    • tokennê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. ssusernê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.
    • sspassworddb_password, và dbuser_passwordnên thay thế bằng mật khẩu an toàn của riêng bạn.
    • domainnên được thay thế bằng địa chỉ tên miền trang web WordPress của bạn.
    • soa_emailphả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 terraformthư 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 planlệnh cho mục đích này. Chạy lệnh này từ terraformthư mục:

terraform plan \
-var-file="secrets.tfvars" \
-var-file="terraform.tfvars"

plansẽ 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.tftệp cấu hình của mình:

  1. Chạy lệnh Terraform applytừ terraformthư 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 applytrả 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:

Cài đặt WordPress

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 destroylệnh từ terraformthư 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/