Khi ta khai báo giá trị (value) cho biến (variables) ở nhiều nơi trong Terraform, thì giá trị nào sẽ được chọn? Mình tin chắc anh chị em nào cũng dính tình huống này và có thắc mắc tương tự; hơn nữa, vấn đề này cũng hay được nhắc tới trong các cuộc phỏng vấn DevOps, vậy hãy cùng đào sâu xem sao.
Terraform xử lý các biến từ nhiều nguồn khác nhau như biến môi trường, tệp terraform.tfvars, tham số CLI, đầu vào module, và ưu tiên các nguồn này theo thứ tự nhất định.
Khi cùng một biến được định nghĩa ở nhiều nơi, Terraform sẽ chọn giá trị từ nguồn có mức ưu tiên cao nhất. Thứ tự từ cao đến thấp như sau:
- 1, -var and -var-file Command-Line Options
- 2, Auto-Loaded Variable Files (*.auto.tfvars and *.auto.tfvars.json)
- 3, Terraform.tfvars.json
- 4, Environment Variables (e.g., TF_VAR_name)
- 5, Terraform.tfvars
Cụ thể:
1. Command-Line Options: -var và -var-file
Đây là mức ưu tiên cao nhất. Biến được truyền trực tiếp qua dòng lệnh sẽ ghi đè tất cả các định nghĩa khác.
Ví dụ:
bash
terraform apply -var="instance_type=t3.micro"
Trong trường hợp này, giá trị instance_type được đặt là t3.micro và sẽ ghi đè tất cả các định nghĩa khác.
Mục đích: Sử dụng nó khi bạn cần ghi đè nhanh giá trị mặc định hoặc khi tích hợp với các script tự động hóa.
2. Auto-Loaded Variable Files: .auto.tfvars và .auto.tfvars.json
Terraform tự động tải các tệp có định dạng này trong thư mục hiện tại và chúng có mức ưu tiên cao sau -var and -var-file Command-Line Options.
Ví dụ: Tệp instance.auto.tfvars có nội dung:
instance_type = "t3.medium"
Terraform sẽ tự động tải và áp dụng giá trị trong tệp này.
Mục đích: Dùng khi bạn muốn thiết lập các giá trị mặc định có thể dễ dàng ghi đè bởi Command-Line Options nhưng vẫn muốn duy trì cấu hình linh hoạt không yêu cầu can thiệp thủ công.
3. File terraform.tfvars.json
Đây là một định dạng có cấu trúc để định nghĩa các biến, đặc biệt phù hợp trong môi trường anh chị em ưa chuộng JSON.
Ví dụ: json
{ "instance_type": "t3.large"
}
Tệp này giúp định nghĩa biến dưới dạng có cấu trúc và ngôn ngữ không phụ thuộc vào HCL.
Mục đích: Dùng trong môi trường ưu tiên sử dụng định dạng JSON.
4. Biến môi trường (Environment Variables TFVARname)
Biến môi trường với tiền tố TF_VAR_ sẽ được Terraform sử dụng như là giá trị biến trong cấu hình.
Ví dụ:
bash
export TF_VAR_instance_type="t3.large"
Giá trị instance_type sẽ được đặt là t3.large, trừ khi có định nghĩa với mức ưu tiên cao hơn.
Mục đích: Phù hợp khi quản lý biến giữa các môi trường (dev, staging, production).
5. File terraform.tfvars
Đây là nguồn có mức ưu tiên thấp nhất trong số các nguồn định nghĩa biến.
Ví dụ:
hcl
instance_type = "t3.small"
Nếu không có định nghĩa ở các nguồn khác có ưu tiên cao hơn, giá trị từ tệp terraform.tfvars sẽ được sử dụng.
Mục đích: Dùng để đặt các giá trị mặc định chung cho các cấu hình hạ tầng, khi những giá trị này không thay đổi thường xuyên.
Ví dụ thực tế khi khai báo ở tất cả các nguồn: Giá trị nào được chọn?
Hãy xem xét một tình huống trong đó biến instance_type được định nghĩa ở nhiều nơi như sau:
Terraform.tfvars: instance_type = "t3.small"
Biến môi trường: TF_VAR_instance_type = "t3.large"
Instance.auto.tfvars: instance_type = "t3.medium"
Command-Line Options:
terraform apply -var="instance_type=t3.micro"
Với thứ tự ưu tiên, giá trị từ tham số dòng lệnh (t3.micro) sẽ được chọn vì nó có mức ưu tiên cao nhất.
Tổng kết:
Bằng cách hiểu rõ về thứ tự ưu tiên biến trong Terraform, bạn có thể:
- Tránh ghi đè không mong muốn: Hiểu rõ biến nào được định nghĩa ở đâu giúp tránh các hành vi không như ý.
- Cấu hình động: Sử dụng dòng lệnh và biến môi trường để cấu hình linh hoạt theo môi trường mà không cần sửa đổi tệp cấu hình.
- Tối ưu hóa mặc định và ghi đè: Thiết lập các giá trị mặc định hợp lý và dễ dàng ghi đè khi cần thiết.
Good luck!