Ngôn ngữ cấu hình HashiCorp (HCL) là ngôn ngữ cấu hình do HashiCorp biên soạn . HCL được sử dụng với các công cụ tự động hóa cơ sở hạ tầng đám mây của HashiCorp, chẳng hạn như Terraform . Ngôn ngữ này được tạo ra với mục tiêu thân thiện với cả con người và máy móc. Ngôn ngữ này tương thích với JSON, có nghĩa là nó có thể tương tác với các hệ thống khác bên ngoài dòng sản phẩm Terraform.
Hướng dẫn này giới thiệu về cú pháp HCL, một số thuật ngữ HCL thường dùng và cách thức hoạt động với Terraform.
Ghi chú: Linode Provider 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. Để biết 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. Các ví dụ trong hướng dẫn này được viết để tương thích với Terraform phiên bản 0.11 và sẽ được cập nhật trong tương lai gần.
Tổng quan về cú pháp HCL
Cú pháp cấu hình của HCL dễ đọc và viết. Nó được tạo ra để có cấu trúc rõ ràng và dễ thấy hơn khi so sánh với các ngôn ngữ cấu hình nổi tiếng khác, chẳng hạn như YAML.
# Linode provider block. Installs Linode plugin.
terraform {
required_providers {
linode = {
source = "linode/linode"
version = "1.16.0"
}
}
}
provider "linode" {
token = "${var.token}"
}
variable "region" {
description = "This is the location where the Linode instance is deployed."
}
/* A multi
line comment. */
resource "linode_instance" "example_linode" {
image = "linode/ubuntu18.04"
label = "example-linode"
region = "${var.region}"
type = "g6-standard-1"
authorized_keys = [ "my-key" ]
root_pass = "example-password"
}
Ghi chú: Bạn không nên đưa dữ liệu nhạy cảm vào khai báo tài nguyên. Để biết thêm thông tin về quản lý bí mật, hãy xem Quản lý bí mật với Terraform .
Các yếu tố chính của HCL
- Cú pháp HCL bao gồm các khổ thơ hoặc khối định nghĩa nhiều cấu hình có sẵn cho Terraform. Các plugin cung cấp thông tin chi tiết hơn về các cấu hình Terraform cơ bản có sẵn.
- Các khổ thơ hoặc khối được tạo thành từ
key = value
các cặp. Terraform chấp nhận các giá trị kiểu chuỗi, số, boolean, bản đồ và danh sách. - Bình luận một dòng bắt đầu bằng
#
, trong khi bình luận nhiều dòng sử dụng phần mở đầu/*
và phần kết thúc*/
. - Cú pháp nội suy có thể được sử dụng để tham chiếu các giá trị được lưu trữ bên ngoài khối cấu hình trong biến đầu vào hoặc từ đầu ra của mô-đun Terraform .Tham chiếu biến nội suy được xây dựng bằng cú
"${var.region}"
pháp. Ví dụ này tham chiếu đến một biến có tên làregion
, được thêm tiền tố làvar.
. Phần mở đầu${
và đóng}
cho biết sự bắt đầu của cú pháp nội suy. - Bạn có thể bao gồm các chuỗi nhiều dòng bằng cách sử dụng dấu mở
<<EOF
, theo sau là dấu đóngEOF
trên dòng đó. - Các chuỗi được đặt trong dấu ngoặc kép.
- Danh sách các kiểu dữ liệu nguyên thủy (chuỗi, số và boolean) được đặt trong dấu ngoặc vuông:
["Andy", "Leslie", "Nate", "Angel", "Chris"]
. - Bản đồ sử dụng dấu ngoặc nhọn
{}
và dấu hai chấm:
, ví dụ:{ "password" : "my_password", "db_name" : "wordpress" }
.
Xem tài liệu Cú pháp cấu hình của Terraform để biết thêm chi tiết.
Nhà cung cấp Terraform và cú pháp HCL
Trong Terraform, một nhà cung cấp được sử dụng để tương tác với API Cơ sở hạ tầng dưới dạng Dịch vụ (IaaS) hoặc Nền tảng dưới dạng Dịch vụ (PaaS), như Linode APIv4 . Nhà cung cấp xác định tài nguyên nào được hiển thị và có sẵn để tạo, đọc, cập nhật và xóa. Một bộ thông tin xác thực hoặc mã thông báo thường được yêu cầu để giao tiếp với tài khoản dịch vụ. Ví dụ: nhà cung cấp Linode Terraform yêu cầu mã thông báo truy cập API Linode của bạn . Danh sách tất cả các nhà cung cấp Terraform chính thức có sẵn từ HashiCorp.
Để cấu hình Linode làm nhà cung cấp, bạn cần bao gồm một khối chỉ định Linode là nhà cung cấp và đặt mã thông báo API Linode của bạn vào một trong các .tf
tệp:
provider "linode" {
token = "my-token"
}
Sau khi khai báo nhà cung cấp, bạn có thể cấu hình các tài nguyên có sẵn từ nhà cung cấp.
Ghi chú: Các nhà cung cấp được đóng gói dưới dạng plugin cho Terraform. Bất cứ khi nào bạn khai báo một nhà cung cấp mới trong các tệp cấu hình Terraform, hãy chạy lệnh terraform init
. Lệnh này hoàn tất một số bước khởi tạo cần thiết trước khi bạn có thể áp dụng cấu hình Terraform, bao gồm tải xuống các plugin cho bất kỳ nhà cung cấp nào bạn đã chỉ định.
Tài nguyên Terraform và cú pháp HCL
Tài nguyên Terraform là bất kỳ thành phần nào của cơ sở hạ tầng có thể được quản lý bởi nhà cung cấp. Tài nguyên có sẵn với nhà cung cấp Linode bao gồm từ một phiên bản Linode, đến một khối lưu trữ khối, đến một bản ghi DNS. Tài liệu Nhà cung cấp Linode của Terraform có danh sách đầy đủ tất cả các tài nguyên được hỗ trợ.
Tài nguyên được khai báo bằng khối tài nguyên trong .tf
tệp cấu hình. Khối ví dụ này triển khai phiên bản Linode 2GB nằm trong trung tâm dữ liệu US East từ hình ảnh Ubuntu 18.04. Các giá trị cũng được cung cấp cho nhãn Linode, khóa SSH công khai và mật khẩu gốc:
resource "linode_instance" "WordPress" {
image = "linode/ubuntu18.04"
label = "WPServer"
region = "us-east"
type = "g6-standard-1"
authorized_keys = [ "example-key" ]
root_pass = "example-root-pass"
}
Các siêu tham số dành riêng cho HCL có sẵn cho tất cả các tài nguyên và độc lập với nhà cung cấp. Các siêu tham số cho phép bạn tùy chỉnh hành vi vòng đời của tài nguyên, xác định số lượng tài nguyên cần tạo hoặc bảo vệ một số tài nguyên nhất định khỏi bị phá hủy. Xem tài liệu Cấu hình tài nguyên của Terraform để biết thêm thông tin về siêu tham số.
Mô-đun Terraform và cú pháp HCL
Mô -đun là tập hợp các cấu hình Terraform được đóng gói, dùng để tổ chức việc tạo tài nguyên theo các cấu hình có thể tái sử dụng.
Terraform Module Registry là kho lưu trữ các module cộng đồng có thể giúp bạn bắt đầu tạo tài nguyên cho nhiều nhà cung cấp khác nhau. Bạn cũng có thể tạo các module của riêng mình để sắp xếp cấu hình Terraform tốt hơn và cho phép sử dụng lại. Sau khi tạo các module, bạn có thể phân phối chúng thông qua kho lưu trữ kiểm soát phiên bản từ xa, chẳng hạn như GitHub.
Sử dụng các mô-đun
Khối module hướng dẫn Terraform tạo một phiên bản của module. Khối này khởi tạo bất kỳ tài nguyên nào được xác định trong module đó.
Cấu hình bắt buộc chung duy nhất cho tất cả các khối mô-đun là tham source
số chỉ ra vị trí của mã nguồn mô-đun. Tất cả các cấu hình bắt buộc khác thay đổi tùy theo từng mô-đun. Nếu bạn đang sử dụng mô-đun cục bộ, bạn có thể sử dụng đường dẫn tương đối làm giá trị nguồn . Đường dẫn nguồn cho mô-đun Terraform Module Registry có sẵn trên trang đăng ký của mô-đun.
Ví dụ này tạo một phiên bản của mô-đun có tên là linode-module-example và cung cấp đường dẫn tương đối làm vị trí mã nguồn của mô-đun:
module "linode-module-example" {
source = "/modules/linode-module-example"
}
Việc biên soạn các mô-đun bao gồm việc xác định các yêu cầu về tài nguyên và tham số hóa các cấu hình bằng cách sử dụng các biến đầu vào , các tệp biến và đầu ra. Để tìm hiểu cách viết các mô-đun Terraform, hãy xem Tạo một mô-đun Terraform .
Biến đầu vào
Bạn có thể định nghĩa các biến đầu vào để làm tham số cấu hình Terraform. Theo quy ước, các biến đầu vào thường được định nghĩa trong một tệp có tên variables.tf
. Terraform tải tất cả các tệp có đuôi .tf
, vì vậy bạn cũng có thể định nghĩa các biến trong các tệp có tên khác.
- Terraform chấp nhận các biến có kiểu string, number, boolean, map và list. Nếu kiểu biến không được định nghĩa rõ ràng, Terraform mặc định là type = “string” .
- Một thực hành tốt là cung cấp mô tả có ý nghĩa cho tất cả các biến đầu vào.
- Nếu một biến không chứa giá trị mặc định hoặc nếu bạn muốn ghi đè giá trị mặc định của biến, bạn phải cung cấp giá trị dưới dạng biến môi trường hoặc trong tệp giá trị biến.
Ví dụ khai báo biến
variable "token" {
description = "This is your Linode APIv4 Token."
}
variable "region" {
description = "This is the location where the Linode instance is deployed."
default = "us-east"
}
Hai biến đầu vào có tên là token và region được định nghĩa tương ứng. region
Biến này định nghĩa một giá trị mặc định . Cả hai biến đều mặc định là type = “string” , vì một type không được khai báo rõ ràng.
Cung cấp các giá trị biến
Các giá trị biến có thể được chỉ định trong .tfvars
các tệp. Các tệp này sử dụng cú pháp giống như các tệp cấu hình Terraform:
token = "my-token"
region = "us-west"
Terraform tự động tải các giá trị từ tên tệp khớp với terraform.tfvars
hoặc *.auto.tfvars
. Nếu bạn lưu trữ các giá trị trong tệp có tên khác, bạn cần chỉ định tệp đó bằng tùy -var-file
chọn khi chạy terraform apply
. -var-file
Tùy chọn có thể được gọi nhiều lần:
terraform apply \
-var-file="variable-values-1.tfvars" \
-var-file="variable-values-2.tfvars"
Giá trị cũng có thể được chỉ định trong các biến môi trường khi chạy terraform apply
. Tên của biến phải được thêm tiền tố TF_VAR_
:
TF_VAR_token=my-token-value TF_VAR_region=us-west terraform apply
Ghi chú: Biến môi trường chỉ có thể gán giá trị cho các biến củatype = "string"
Tham chiếu các biến
Bạn có thể gọi các biến đầu vào hiện có trong tệp cấu hình bằng cú pháp nội suy của Terraform. Quan sát giá trị của tham số vùng :
resource "linode_instance" "WordPress" {
image = "linode/ubuntu18.04"
label = "WPServer"
region = "${var.region}"
type = "g6-standard-1"
authorized_keys = [ "example-key" ]
root_pass = "example-root-pass"
}
Ghi chú: Nếu giá trị biến không được cung cấp theo bất kỳ cách nào được thảo luận ở trên và biến đó được gọi trong cấu hình tài nguyên, Terraform sẽ nhắc bạn nhập giá trị khi bạn chạy terraform apply
.
Nội suy
HCL hỗ trợ nội suy các giá trị. Nội suy được gói trong một mở ${
và một đóng }
. Tên biến đầu vào được thêm tiền tố là var.
:
provider "linode" {
token = "${var.token}"
}
Cú pháp nội suy rất mạnh mẽ và cho phép bạn tham chiếu các thuộc tính của các tài nguyên khác, gọi các hàm tích hợp và sử dụng các điều kiện và mẫu.
Cấu hình của tài nguyên này sử dụng điều kiện để cung cấp giá trị cho tham tags
số:
resource "linode_instance" "web" {
tags = ["${var.env == "production" ? var.prod_subnet : var.dev_subnet}"]
}
Nếu env
biến có giá trị là production thì prod_subnet
biến đó được sử dụng. Nếu không thì biến đó dev_subent
được sử dụng.
Chức năng
Terraform có các hàm tính toán tích hợp thực hiện nhiều hoạt động khác nhau, bao gồm đọc tệp, nối danh sách, mã hóa hoặc tạo tổng kiểm tra của một đối tượng, cũng như tìm kiếm và thay thế.
resource "linode_sshkey" "main_key" {
label = "foo"
ssh_key = "${chomp(file("~/.ssh/id_rsa.pub"))}"
}
Trong ví dụ này, ssh_key = "${chomp(file("~/.ssh/id_rsa.pub"))}"
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. chomp()
Hàm này xóa các dòng mới theo sau khỏi khóa SSH. Lưu ý rằng các hàm lồng nhau được bao bọc trong opening ${
và closing }
để chỉ ra rằng giá trị cần được nội suy.
Ghi chú:Khi bạn chạy terraform console
sẽ tạo ra một môi trường nơi bạn có thể kiểm tra các hàm nội suy. Ví dụ:
terraform console
> list("newark", "atlanta", "dallas")
[
"newark",
"atlanta",
"dallas",
]
>
Tài liệu chính thức của Terraform bao gồm danh sách đầy đủ các hàm tích hợp được hỗ trợ .
Mẫu
Mẫu có thể được sử dụng để lưu trữ các chuỗi dữ liệu lớn. Nhà cung cấp mẫu sẽ hiển thị các nguồn dữ liệu cho các tài nguyên Terraform khác hoặc các đầu ra để sử dụng. Nguồn dữ liệu có thể là một tệp hoặc một mẫu nội tuyến.
Nguồn dữ liệu có thể sử dụng cú pháp nội suy chuẩn của Terraform cho các biến. Sau đó, mẫu được hiển thị với các giá trị biến mà bạn cung cấp trong khối dữ liệu.
Tài nguyên mẫu ví dụ này thay thế giá trị từ “${linode_instance.web.ip_address}” bất cứ nơi nào “${web_ip}” xuất hiện bên trong tệp mẫu ips.json
:
data "template_file" "web" {
template = "${file("${path.module}/ips.json")}"
vars {
web_ip = "${linode_instance.web.ip_address}"
}
}
Sau đó, bạn có thể xác định biến đầu ra để xem mẫu được hiển thị khi bạn chạy terraform apply
:
output "ip" {
value = "${data.template_file.web.rendered}"
}
Tài liệu chính thức của Terraform có danh sách tất cả các thành phần cú pháp nội suy có sẵn .
Các bước tiếp theo trong Terraform
Bây giờ bạn đã quen với HCL, bạn có thể bắt đầu tạo phiên bản Linode với Terraform bằng cách làm theo hướng dẫn Sử dụng Terraform để cung cấp môi trường Linode .
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/introduction-to-hcl/