Terraform là một công cụ phối hợp phổ biến của HashiCorp . Công cụ này được sử dụng để xây dựng, duy trì và tạo phiên bản cơ sở hạ tầng một cách an toàn. Các mô-đun Terraform cho phép bạn tổ chức mã cấu hình tốt hơn và làm cho mã có thể tái sử dụng.

Trong hướng dẫn này, bạn sẽ tạo một mô-đun Linode StackScripts . Mô-đun này sẽ triển khai một phiên bản Linode từ một StackScript mà bạn sẽ tạo. Mô-đun này sẽ bao gồm các mô-đun lồng nhau chia tách các tài nguyên cần thiết giữa mô-đun gốc , một linode_instancemô-đun và một stackscriptsmô-đun.

Mô-đun Terraform

Mô-đun Terraform là gì?

Về mặt chính thức, một mô-đun Terraform chứa nhiều tài nguyên được sử dụng với nhau, nhưng nếu bạn nhìn vào một mô-đun, đó là một thư mục có một tập hợp các tệp cấu hình Terraform được chứa bên trong. Các mô-đun có thể tạo ra các bản tóm tắt nhẹ để cơ sở hạ tầng của bạn có thể được mô tả theo kiến ​​trúc của nó, trái ngược với các thuật ngữ trực tiếp của các đối tượng vật lý. Bạn cũng có thể lưu trữ các mô-đun Terraform của mình trên các dịch vụ kiểm soát phiên bản từ xa, như Git, để những người khác sử dụng. Terraform Module Registry lưu trữ các mô-đun cộng đồng mà bạn có thể sử dụng lại cho các cấu hình Terraform của riêng mình hoặc bạn có thể xuất bản các mô-đun của riêng mình để cộng đồng Terraform sử dụng. Đọc phần “Mô-đun” của Tài liệu ngôn ngữ Terraform được đề xuất để biết thêm chi tiết.

Làm thế nào để tạo Mô-đun Terraform?

Hướng dẫn này bao gồm việc tạo một mô-đun Terraform được sử dụng để triển khai một phiên bản Linode. Tuy nhiên, nếu bạn vẫn còn thắc mắc, HashiCorp đã đăng một loạt hướng dẫn về các mô-đun Terraform trên HashiCorp Learn và phần “Xây dựng một mô-đun” được tính thời gian chỉ mất khoảng 15 phút. Chúng tôi khuyên bạn nên tham gia bài học đó để tìm hiểu thêm.

Trước khi bạn bắt đầu

1.Cài đặt Terraform trên máy tính cục bộ của bạn bằng các bước tìm thấy trong phần Cài đặt Terraform của hướng dẫn Sử dụng Terraform để cung cấp môi trường Linode . Thư mục dự án Terraform của bạn phải được đặt tên là linode_stackscripts.

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 để lấy mã thông báo.

3.Hoàn thành các bước trong phần Cấu hình Git của hướng dẫn Bắt đầu với Git .

4.Xem lại Triển khai trang web WordPress bằng Terraform và StackScripts để làm quen với tài nguyên StackScript của nhà cung cấp Linode.

Cấu trúc mô-đun Terraform chuẩn

Cấu trúc mô-đun chuẩn của Terraform cung cấp hướng dẫn về bố cục tệp và thư mục cho các mô-đun có thể tái sử dụng. Nếu bạn muốn công khai mô-đun của mình với cộng đồng Terraform, bố cục được đề xuất cho phép Terraform tạo tài liệu và lập chỉ mục các mô-đun cho Terraform Module Registry .

  • Yêu cầu cấu trúc mô-đun chính là phải có một mô-đun gốc . Mô-đun gốc là thư mục chứa các tệp cấu hình Terraform được áp dụng để xây dựng cơ sở hạ tầng mong muốn của bạn. Các tệp này cung cấp điểm vào bất kỳ mô-đun lồng nhau nào mà bạn có thể sử dụng.
  • Bất kỳ mô-đun nào cũng phải bao gồm ít nhất a main.tf, a variables.tfvà một outputs.tftệp. Quy ước đặt tên này được khuyến nghị nhưng không bắt buộc.
    • Nếu sử dụng các mô-đun lồng nhau để chia nhỏ các tài nguyên cần thiết của cơ sở hạ tầng, main.tftệp sẽ chứa tất cả các khối mô-đun của bạn và bất kỳ tài nguyên cần thiết nào không có trong các mô-đun lồng nhau của bạn. main.tfTệp mô-đun đơn giản, không có bất kỳ mô-đun lồng nhau nào, sẽ khai báo tất cả các tài nguyên trong tệp này.
    • Các tệp variables.tfvà outputs.tfchứa các khai báo biến đầu vào và biến đầu ra. Tất cả các biến và đầu ra phải bao gồm mô tả.
  • Nếu sử dụng các mô-đun lồng nhau, chúng phải nằm trong thư mục con của mô-đun gốc có tên là modules/.
  • Nếu các mô-đun của bạn được lưu trữ trên Module Registry của Terraform, các mô-đun gốc và bất kỳ mô-đun lồng nhau nào cũng phải chứa một README.MDtệp có mô tả giải thích mục đích sử dụng dự kiến ​​của mô-đun.
  • Bạn có thể cung cấp ví dụ trong thư mục con có tên exampleslà thư mục mô-đun gốc.

Tạo mô-đun Linode StackScripts

Mô-đun Linode StackScripts sẽ bao gồm hai mô-đun lồng nhau chia tách các tài nguyên cần thiết giữa mô-đun gốc , một linodesmô-đun và một stackscriptsmô-đun. Khi bạn hoàn tất việc tạo tất cả các tệp Terraform cần thiết, cấu trúc thư mục của bạn sẽ trông như sau:

linode_stackscripts/
├── main.tf
├── outputs.tf
├── secrets.tfvars
├── terraform
├── terraform.tfvars
├── variables.tf
└── modules/
    ├── linodes/
    |   ├── main.tf
    │   ├── variables.tf
    │   └── outputs.tf
    └── stackscripts/
        ├── main.tf
        ├── variables.tf
        └── outputs.tf

Ghi chú: Thư mục của bạn linode_stackscriptscó thể chứa các tệp khác liên quan đến quá trình cài đặt Terraform mà bạn đã hoàn tất trước khi bắt đầu các bước trong hướng dẫn này.

Tạo Module Linodes

Trong phần này, bạn sẽ tạo linodesmô-đun chịu trách nhiệm tạo phiên bản Linode của bạn. Mô-đun này chứa một main.tftệp và variables.tfcác outputs.tftệp tương ứng.

1.Nếu thư mục dự án Terraform của bạn chưa được đặt tên linode_stackscripts, hãy đổi tên thư mục đó trước khi bắt đầu và di chuyển vào thư mục đó:

mv terraform linode_stackscripts
cd linode_stackscripts

Ghi chú:Bạn có thể cần phải chỉnh sửa ~/.profilethư mục để đưa ~/linode_stackscriptsthư mục đó vào PATH. echo ‘xuất PATH=”$PATH:$HOME/linode_stackscripts”‘ » ~/.profile nguồn ~/.profile

2.Tạo các thư mục con modulesvà linodes:

mkdir -p modules/linodes

3.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo một main.tftệp có modules/linodes/các tài nguyên sau:

locals {
    key = var.key
}

resource "linode_sshkey" "main_key" {
    label = var.key_label
    ssh_key = chomp(file(local.key))
}

resource "linode_instance" "linode_id" {
    image = var.image
    label = var.label
    region = var.region
    type = var.type
    authorized_keys = [ linode_sshkey.main_key.ssh_key ]
    root_pass = var.root_pass
    stackscript_id = var.stackscript_id
    stackscript_data = {
       "my_password" = var.stackscript_data["my_password"]
       "my_userpubkey" = var.stackscript_data["my_userpubkey"]
       "my_hostname" = var.stackscript_data["my_hostname"]
       "my_username" = var.stackscript_data["my_username"]
    }
}

Tệp này main.tfkhai báo một linode_instancetài nguyên triển khai Linode bằng StackScript. Lưu ý rằng tất cả các giá trị đối số đều sử dụng cú pháp nội suy để truy cập các giá trị biến. Tiếp theo, bạn sẽ khai báo các biến và cung cấp các giá trị biến trong terraform.tfvarstệp của mô-đun gốc. Sử dụng các tệp riêng biệt để khai báo và gán biến sẽ tham số hóa các cấu hình của bạn và cho phép chúng được sử dụng lại dưới dạng các mô-đun.

Chúng ta hãy xem xét kỹ hơn từng khối trong main.tftệp cấu hình.

locals {
    key = var.key
}

resource "linode_sshkey" "main_key" {
    label = var.key_label
    ssh_key = chomp(file(local.key))
}
  • Đoạn thơ này localskhai báo một biến cục bộ keycó giá trị sẽ được cung cấp bởi một biến đầu vào.
  • Tài linode_sshkeynguyên sẽ tạo Khóa SSH Linode được liên kết với tài khoản Linode của bạn. Các khóa này có thể được sử dụng lại cho các lần triển khai Linode trong tương lai sau khi tài nguyên đã được tạo. ssh_key = chomp(file(local.key))sử dụng hàm 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. Vị trí của đường dẫn tệp là giá trị của biến cục bộ keychomp()Hàm tích hợp sẽ xóa các dòng mới theo sau khỏi khóa SSH.
resource "linode_instance" "linode_id" {
    image = var.image
    label = var.label
    region = var.region
    type = var.type
    authorized_keys = [ linode_sshkey.main_key.ssh_key ]
    root_pass = var.root_pass
    stackscript_id = var.stackscript_id
    stackscript_data = {
       "my_password" = var.stackscript_data["my_password"]
       "my_userpubkey" = var.stackscript_data["my_userpubkey"]
       "my_hostname" = var.stackscript_data["my_hostname"]
       "my_username" = var.stackscript_data["my_username"]
    }
}

Tài linode_instancenguyên tạo ra một phiên bản Linode với các đối số được liệt kê. Vui lòng lưu ý thông tin sau:

Đố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 giá trị kiểu danh sách, do đó giá trị phải được bao trong dấu ngoặc.

Để sử dụng Linode 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. Sau đó trong hướng dẫn, bạn sẽ tạo StackScript của riêng mình và hiển thị ID của nó dưới dạng biến đầu ra để sử dụng ID của nó để triển khai phiên bản Linode của bạn.

StackScripts hỗ trợ dữ liệu do người dùng định nghĩa. Điều này có nghĩa là 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 định nghĩa bằng stackscript_datađối số.

4.Tạo variables.tftệp để xác định các biến bắt buộc của tài nguyên của bạn:

variable "key" {
  description = "Public SSH Key's path."
}

variable "key_label" {
  description = "new SSH key label"
}

variable "image" {
  description = "Image to use for Linode instance"
  default = "linode/ubuntu18.04"
}

variable "label" {
  description = "The Linode's label is for display purposes only, but must be unique."
  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 "authorized_keys" {
  description = "SSH Keys to use for the Linode."
  type = "list"
}

variable "root_pass" {
  description = "Your Linode's root user's password."
}

variable "stackscript_id" {
  description = "StackScript ID."
}

variable "stackscript_data" {
  description = "Map of required StackScript UDF data."
  type = "map"
  default = {}
}
  • Các mô-đun phải bao gồm mô tả cho từng 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 mô-đun này dễ dàng hơn.
  • Mỗi biến có thể chứa một giá trị mặc định. Giá trị mặc định chỉ được sử dụng nếu không có giá trị nào khác được cung cấp. Ví dụ, nếu bạn có một bản phân phối Linux yêu thích, bạn có thể muốn cung cấp nó làm giá trị mặc định của biến hình ảnh của bạn. Trong trường hợp này, linode/ubuntu18.04được đặt làm giá trị mặc định.
  • Bạn có thể khai báo a typecho mỗi biến. Nếu không typecung cấp, biến sẽ mặc định là type = "string".
  • Lưu ý rằng stackscript_databiến là type = "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.

5.Tạo tập outputs.tftin:

output "sshkey_linode" {
  value = linode_sshkey.main_key.ssh_key
}
  1. Tệp này outputs.tfsẽ hiển thị bất kỳ giá trị nào từ các tài nguyên mà bạn đã khai báo trong main.tftệp. Bất kỳ giá trị nào được hiển thị đều có thể được sử dụng bởi bất kỳ mô-đun nào khác trong mô-đun gốc. sshkey_linodeBiến đầu ra sẽ hiển thị linode_sshkeykhóa công khai của tài nguyên.

Bây giờ linodesmô-đun đã hoàn tất, ở phần tiếp theo, bạn sẽ tạo mô stackscripts-đun.

Tạo mô-đun StackScripts

Trong phần này, bạn sẽ tạo mô-đun StackScripts. Mô-đun này tạo ra một linode_stackscriptstài nguyên mà bạn có thể sử dụng để tạo và sửa đổi Linode StackScript của riêng bạn.

1.Đảm bảo bạn đang ở trong linode_stackscriptsthư mục và tạo stackscriptsthư mục con:

mkdir modules/stackscripts

2.Sử dụng trình soạn thảo văn bản ưa thích của bạn, tạo một main.tftệp modules/stackscripts/có nội dung sau:

resource "linode_stackscript" "default" {
  label = var.stackscript_label
  description = var.description
  script = var.stackscript
  images = var.stackscript_image
  rev_note = var.rev_note
}

Tệp main.tftạo linode_stackscripttài nguyên và cung cấp các cấu hình cần thiết. Tất cả các giá trị đối số đều sử dụng cú pháp nội suy để truy cập các giá trị biến đầu vào. Tiếp theo, bạn sẽ khai báo các biến đầu vào và cung cấp các giá trị biến trong terraform.tfvarstệp của mô-đun gốc. Để biết thêm thông tin về StackScripts, hãy xem trang sản phẩm StackScripts và tài liệu tham khảo Linode APIv4 StackScripts .

3.Tạo variables.tftệp để xác định các biến bắt buộc của tài nguyên của bạn:

variable "stackscript_label" {
  description = "The StackScript's label is for display purposes only."
}

variable "description" {
  description = "A description for the StackScript."
}

variable "stackscript" {
  description = "The script to execute when provisioning a new Linode with this StackScript."
}
variable "stackscript_image" {
  description = " A list of Image IDs representing the Images that this StackScript is compatible for deploying with."
}
variable "rev_note" {
  description = "This field allows you to add notes for the set of revisions made to this StackScript."
}

4.Tạo tập outputs.tftin:

output "stackscript_id" {
  value = linode_stackscript.default.id
}

Tệp này outputs.tfhiển thị giá trị linode_stackscriptID của tài nguyên. Mỗi StackScript được gán một ID duy nhất khi tạo. Bạn sẽ cần ID này khi tạo mô-đun gốc của mình.

Bây giờ bạn đã tạo mô-đun StackScripts và sẵn sàng sử dụng cả hai mô-đun trong mô-đun gốc. Bạn sẽ hoàn thành công việc này trong phần tiếp theo.

Tạo mô-đun gốc

Mô-đun gốc sẽ gọi các mô-đun linodevà stackscripts, đáp ứng các biến bắt buộc của chúng và sau đó áp dụng các cấu hình đó để xây dựng cơ sở hạ tầng mong muốn của bạn. Các cấu hình này triển khai Linode dựa trên StackScript mà bạn sẽ định nghĩa trong phần này. Khi sử dụng các mô-đun lồng nhau, các mô-đun sẽ bị ẩn khỏi cấu hình gốc của bạn, vì vậy bạn sẽ phải hiển thị lại bất kỳ biến và đầu ra nào bạn yêu cầu.

1.Đảm bảo bạn đang ở trong linode_stackscriptsthư mục và tạo main.tftệp:

terraform {
  required_providers {
    linode = {
      source = "linode/linode"
      version = "1.16.0"
    }
  }
}
provider "linode" {
    token = var.token
}

module "stackscripts" {
    source = "./modules/stackscripts"
    stackscript_label = var.stackscript_label
    description = var.description
    stackscript = var.stackscript
    stackscript_image = var.stackscript_image
    rev_note = var.rev_note
}

module "linodes" {
    source = "./modules/linodes"
    key = var.key
    key_label = var.key_label
    image = var.image
    label = var.label
    region = var.region
    type = var.type
    root_pass = var.root_pass
    authorized_keys = [ module.linodes.sshkey_linode ]
    stackscript_id = module.stackscripts.stackscript_id
    stackscript_data = {
       "my_password" = var.stackscript_data["my_password"]
       "my_userpubkey" = var.stackscript_data["my_userpubkey"]
       "my_hostname" = var.stackscript_data["my_hostname"]
       "my_username" = var.stackscript_data["my_username"]
    }
}

Tệp main.tfsử dụng các mô-đun linodesvà stackscriptsđược tạo trong các phần trước và cung cấp các đối số bắt buộc. Tất cả các giá trị đối số đều sử dụng cú pháp nội suy để truy cập các giá trị biến, mà bạn sẽ khai báo trong variables.tftệp và sau đó cung cấp các giá trị tương ứng trong terraform.tfvarstệp.

Chúng ta hãy cùng xem xét từng khối:

provider "linode" {
    token = var.token
}

Khổ thơ đầu tiên tuyên bố Linode là nhà cung cấp 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.

module "stackscripts" {
    source = "./modules/stackscripts"
    stackscript_label = var.stackscript_label
    description = var.description
    stackscript = var.stackscript
    stackscript_image = var.stackscript_image
    rev_note = var.rev_note
}

Khổ tiếp theo hướng dẫn Terraform tạo một phiên bản của stackscriptsmô-đun và khởi tạo bất kỳ tài nguyên nào được xác định trong mô-đun. sourceThuộc tính cung cấp vị trí của mã nguồn mô-đun con và được yêu cầu bất cứ khi nào bạn tạo một phiên bản của mô-đun. Tất cả các thuộc tính khác được xác định bởi mô-đun. Lưu ý rằng tất cả các thuộc tính có trong khối mô-đun tương ứng với linode_stackscriptcác đối số của tài nguyên được khai báo trong main.tftệp của stackscriptsmô-đun.

module "linodes" {
    source = "./modules/linodes"
    key = var.key
    key_label = var.key_label
    image = var.image
    label = var.label
    group = var.group
    region = var.region
    type = var.type
    root_pass = var.root_pass
    authorized_keys = [ module.linodes.sshkey_linode ]
    stackscript_id = module.stackscripts.stackscript_id
    stackscript_data = {
       "my_password" = var.stackscript_data["my_password"]
       "my_userpubkey" = var.stackscript_data["my_userpubkey"]
       "my_hostname" = var.stackscript_data["my_hostname"]
       "my_username" = var.stackscript_data["my_username"]
    }
}

Khổ thơ này tạo ra một thể hiện của linodesmô-đun và sau đó khởi tạo các tài nguyên bạn đã xác định trong mô-đun. Lưu ý rằng authorized_keys = [ module.linodes.sshkey_id ]và stackscript_id = "module.stackscripts.stackscript_id"cả hai đều truy cập các giá trị được hiển thị dưới dạng biến đầu ra bởi các mô-đun linodesvà stackscripts. Bất kỳ biến đầu ra nào được hiển thị của mô-đun đều có thể được tham chiếu trong tệp mô-đun gốc của bạn main.tf.

2.Tạo variables.tftệp để khai báo các biến đầu vào cần thiết cho các phiên bản mô-đun:

variable "token" {
  description = " Linode API token"
}

variable "stackscript_label" {
  description = "The StackScript's label is for display purposes only."
}

variable "description" {
  description = "A description for the StackScript."
}

variable "stackscript" {
  description = "The script to execute when provisioning a new Linode with this StackScript."
}

variable "stackscript_image" {
  description = "A list of Image IDs representing the Images that this StackScript is compatible for deploying with."
}

variable "rev_note" {
  description = "This field allows you to add notes for the set of revisions made to this StackScript."
}

variable "key" {
  description = "Public SSH Key's path."
}

variable "key_label" {
  description = "New SSH key label."
}

variable "image" {
  description = "Image to use for Linode instance."
  default = "linode/ubuntu18.04"
}

variable "label" {
  description = "The Linode's label is for display purposes only, but must be unique."
  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 "root_pass" {
  description = "Your Linode's root user's password."
}

variable "stackscript_data" {
  description = "Map of required StackScript UDF data."
  type = "map"
  default = {}
}

variable "stackscript_id" {
  description = "Hold the stackscript id output value."
}

3.Tạo tập outputs.tftin:

output "stackscript_id" {
  value = module.stackscripts.stackscript_id
}

Trong outputs.tftệp, bạn sẽ hiển thị lại các biến đầu ra được stackscriptsmô-đun hiển thị.

4.Tạo terraform.tfvarstệp để cung cấp giá trị cho tất cả các biến đầu vào được xác định trong variables.tftệp. Tệp này sẽ loại trừ bất kỳ giá trị nào cung cấp dữ liệu nhạy cảm, như mật khẩu và mã thông báo API. Một tệp chứa các giá trị nhạy cảm sẽ được tạo ở bước tiếp theo:

key = "~/.ssh/id_rsa.pub"
key_label = "my-ssh-key"
label = "my-linode"
stackscript_id = "base-ubuntu-deployment"
stackscript_label = "base-ubuntu-deployment"
description = "A base deployment for Ubuntu 18.04 that creates a limited user account."
stackscript = <<EOF
#!/bin/bash
# <UDF name="my_hostname" Label="Linode's Hostname" />
# <UDF name="my_username" Label="Limited user account" />
# <UDF name="my_password" Label="Limited user account's password" />
# <UDF name="my_userpubkey" Label="Limited user account's public key" />

source <ssinclude StackScriptID="1">

set -x

MY_IP=system_primary_ip
system_set_hostname "$MY_HOSTNAME"
system_add_host_entry "$MY_IP" "$MY_HOSTNAME"
user_add_sudo "$MY_USERNAME" "$MY_PASSWORD"
user_add_pubkey "$MY_USERNAME" "$MY_USERPUBKEY"
ssh_disable_root
goodstuff
EOF
stackscript_image = ["linode/ubuntu18.04"]
rev_note = "First revision of my StackScript created with the Linode Terraform provider."

Tệp terraform.tfvarscung cấp tất cả các giá trị được yêu cầu bởi các mô-đun linodesvà stackscripts. Đảm bảo bạn thay thế mọi giá trị bằng giá trị của riêng bạn khi sử dụng tệp ví dụ này.Biến stackscriptcung cấp nội dung thực tế của StackScript mà bạn tạo. Ví dụ StackScript này yêu cầu bốn UDFgiá trị: my_hostnamemy_usernamemy_password, và my_userpubkey. Các giá trị my_hostnamevà my_usernameđược cung cấp bởi stackscript_databản đồ. Các giá trị my_passwordvà my_userpubkeysẽ được cung cấp trong bước tiếp theo.Sau đó, StackScript sẽ sử dụng các giá trị này để tạo một tài khoản người dùng giới hạn; đặt tên máy chủ; thêm mục nhập máy chủ; thêm người dùng đã tạo vào nhóm; vô hiệu hóa quyền truy cập SSH cho người dùng gốc; và cài đặt vim, wget và less. StackScript này sử dụng các hàm bash được định nghĩa trong Thư viện Bash StackScriptsudo của Linode Community .

5.Tạo một tệp có tên secrets.tfvarsđể lưu trữ bất kỳ giá trị nhạy cảm nào:

token = "my-linode-api-token"
root_pass = "my-secure-root-password"
stackscript_data = {
  "my_password" = "my-limited-users-password"
  "my_userpubkey" = "my-public-ssh-key"
  "my_username" = "username"
  "my_hostname" = "linode-hostname"
}

Tệp này chứa tất cả dữ liệu nhạy cảm cần thiết cho việc triển khai Linode của bạn. Đảm bảo bạn thay thế tất cả các giá trị bằng mật khẩu an toàn của riêng bạn và mã thông báo APIv4 của tài khoản Linode. Tệp này không bao giờ được theo dõi trong phần mềm kiểm soát phiên bản và phải được liệt kê trong .gitignoretệp của bạn nếu sử dụng GitHub .

Ghi chú: Trong Terraform 0.12, các biến có giá trị bản đồ và đối tượng 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ị bản đồ thay vì ghi đè chúng. Vì lý do này, bản stackscript_datađồ 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ú: 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ề chủ đề này, hãy xem Quản lý bí mật với Terraform .

Bây giờ bạn đã sẵn sàng áp dụng linode_stackscriptscấu hình Terraform của mô-đun. Các bước này sẽ được hoàn tất trong phần tiếp theo.

Khởi tạo, lập kế hoạch và áp dụng cấu hình Terraform

Bất cứ khi nào một nhà cung cấp mới được sử dụng trong cấu hình Terraform, trước tiên nó phải được khởi tạo. Quá trình khởi tạo sẽ 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 để sử dụng plugin đó. Trước khi áp dụng cấu hình của bạn, việc xem kế hoạch thực hiện cấu hình của bạn 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 cũng rất hữu ích. Trong phần này, bạn sẽ hoàn thành tất cả các bước này.

1.Khởi tạo nhà cung cấp Linode. Đảm bảo bạn đang ở trong linode_stackscriptsthư mục trước khi chạy lệnh nà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 đã được khởi tạo thành công.

2.Chạy lệnh Terraform plan:

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

Kế hoạch Terraform 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 đối với 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 phiên bả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.

3.Bây giờ bạn đã sẵn sàng để tạo cơ sở hạ tầng được xác định trong tệp cấu hình mô-đun gốc của mình main.tf:

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 gọi từng tệp riêng lẻ bằng var-fileđối số. Bạn sẽ được nhắc xác nhận hành applyđộng. Nhập yes . Terraform sẽ bắt đầu tạo các tài nguyên bạn đã xác định trong suốt hướng dẫn này. Quá trình này sẽ mất vài phút để hoàn tất. Sau khi cơ sở hạ tầng được xây dựng thành công, bạn sẽ thấy đầu ra tương tự:

  Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

4.Để xác minh việc triển khai, hãy lấy địa chỉ IP của phiên bản Linode của bạn:

terraform show | grep 'ip_address'

Bạn sẽ thấy kết quả tương tự:

        ip_address = 192.0.2.0

5.Mở phiên shell mới và SSH vào Linode của bạn bằng địa chỉ IP bạn đã lấy được ở bước trước và tên người dùng bạn đã xác định trong biến terraform.tfvarscủa tệp my_username:

ssh username@192.0.2.0

Bạn sẽ có thể truy cập Linode của mình và sau đó xác minh rằng những gì bạn đã định nghĩa trong StackScript đã được thực thi.

Kiểm soát phiên bản Mô-đun Terraform của bạn

Để cung cấp linode_stackscriptsmô-đun cho các thành viên khác trong nhóm, bạn có thể kiểm soát phiên bản mô-đun bằng GitHub . Trước khi hoàn tất các bước trong phần này, hãy đảm bảo bạn đã hoàn tất các bước trong phần Cấu hình Git của hướng dẫn Bắt đầu với Git .

1.Trong linode_stackscriptsthư mục tạo một .gitignoretập tin:

secrets.tfvars
.terraform/
terraform/
terraform.tfstate

Ghi chú: Nếu có bất kỳ tệp nào liên quan đến các bước cài đặt Terraform được hoàn tất trước khi bắt đầu hướng dẫn này (chẳng hạn như tệp zip và tệp tổng kiểm tra), bạn có thể xóa các tệp này khỏi thư linode_stackscriptsmục vì bạn không nên theo dõi chúng trong kiểm soát phiên bản và chúng không còn cần thiết nữa.

2.Khởi tạo kho lưu trữ git:

git init

Sắp xếp tất cả các tệp bạn đã tạo cho đến nay cho lần xác nhận đầu tiên của bạn:

git add -A

3.Cam kết tất cả linode_stackscriptscác tập tin:

git commit -m "Initial commit"

4.Điều hướng đến tài khoản GitHub của bạn và tạo một kho lưu trữ mới . Đảm bảo bạn đặt tên kho lưu trữ giống với tên của mô-đun Terraform. Trong ví dụ này, kho lưu trữ GitHub sẽ được đặt tên là linode_stackscripts.

5.Ở đầu trang Thiết lập nhanh của kho lưu trữ GitHub , hãy sao chép URL kho lưu trữ từ xa.

6.Trở lại linode_stackscriptsthư mục trên máy tính cục bộ của bạn và thêm URL cho kho lưu trữ từ xa:

git remote add origin https://github.com/my-github/linode_stackscripts.git

7.Đẩy kho linode_stackscriptslưu trữ cục bộ của bạn lên kho lưu trữ GitHub từ xa:

git push -u origin master

Mô-đun Terraform của bạn hiện được theo dõi qua GitHub và có thể được sử dụng, chia sẻ và sửa đổi bởi bất kỳ ai có quyền truy cập vào tài khoản GitHub của bạn.

Gọi mô-đun được lưu trữ trên GitHub của bạn

Trong tương lai, bạn có thể lấy nguồn module này từ GitHub trong các khai báo module Terraform của bạn. Bạn sẽ viết khối module của mình như sau:

module "linode_stackscripts" {
    source = "github.com/username/linode_stackscripts"

    VARIABLES HERE
    . . .
}

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/create-terraform-module/