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_instance
mô-đun và một stackscripts
mô-đ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
, avariables.tf
và mộtoutputs.tf
tệ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.tf
tệ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.tf
Tệ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.tf
vàoutputs.tf
chứ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 để chia nhỏ các tài nguyên cần thiết của cơ sở hạ tầng,
- 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.MD
tệ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
examples
là 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 linodes
mô-đun và một stackscripts
mô-đ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_stackscripts
có 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 linodes
mô-đ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.tf
tệp và variables.tf
các outputs.tf
tệ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 ~/.profile
thư mục để đưa ~/linode_stackscripts
thư 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 modules
và 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.tf
tệ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.tf
khai báo một linode_instance
tà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.tfvars
tệ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.tf
tệ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
locals
khai báo một biến cục bộkey
có giá trị sẽ được cung cấp bởi một biến đầu vào. - Tài
linode_sshkey
nguyê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 Terraformfile()
để 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ộkey
.chomp()
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_instance
nguyê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_keys
số sử dụng khóa công khai SSH do linode_sshkey
tà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ỳ UDF
biế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.tf
tệ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
type
cho mỗi biến. Nếu khôngtype
cung cấp, biến sẽ mặc định làtype = "string"
. - Lưu ý rằng
stackscript_data
biến làtype = "map"
. Điều này sẽ cho phép bạn cung cấp giá trị cho nhiềuUDF
biến tùy theo yêu cầu của StackScript.
5.Tạo tập outputs.tf
tin:
output "sshkey_linode" {
value = linode_sshkey.main_key.ssh_key
}
- Tệp này
outputs.tf
sẽ hiển thị bất kỳ giá trị nào từ các tài nguyên mà bạn đã khai báo trongmain.tf
tệ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_linode
Biến đầu ra sẽ hiển thịlinode_sshkey
khóa công khai của tài nguyên.
Bây giờ linodes
mô-đ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_stackscripts
tà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_stackscripts
thư mục và tạo stackscripts
thư 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.tf
tệ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.tf
tạo linode_stackscript
tà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.tfvars
tệ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.tf
tệ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.tf
tin:
output "stackscript_id" {
value = linode_stackscript.default.id
}
Tệp này outputs.tf
hiển thị giá trị linode_stackscript
ID 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 linode
và 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_stackscripts
thư mục và tạo main.tf
tệ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.tf
sử dụng các mô-đun linodes
và 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.tf
tệp và sau đó cung cấp các giá trị tương ứng trong terraform.tfvars
tệ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 stackscripts
mô-đun và khởi tạo bất kỳ tài nguyên nào được xác định trong mô-đun. source
Thuộ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_stackscript
các đối số của tài nguyên được khai báo trong main.tf
tệp của stackscripts
mô-đ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 linodes
mô-đ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 linodes
và 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.tf
tệ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.tf
tin:
output "stackscript_id" {
value = module.stackscripts.stackscript_id
}
Trong outputs.tf
tệp, bạn sẽ hiển thị lại các biến đầu ra được stackscripts
mô-đun hiển thị.
4.Tạo terraform.tfvars
tệp để cung cấp giá trị cho tất cả các biến đầu vào được xác định trong variables.tf
tệ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.tfvars
cung cấp tất cả các giá trị được yêu cầu bởi các mô-đun linodes
và 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 stackscript
cung 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 UDF
giá trị: my_hostname
, my_username
, my_password
, và my_userpubkey
. Các giá trị my_hostname
và my_username
được cung cấp bởi stackscript_data
bản đồ. Các giá trị my_password
và my_userpubkey
sẽ đượ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 .gitignore
tệ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_stackscripts
cấ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_stackscripts
thư 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.tfvars
củ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_stackscripts
mô-đ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_stackscripts
thư mục tạo một .gitignore
tậ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_stackscripts
mụ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_stackscripts
cá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_stackscripts
thư 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_stackscripts
lư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/