Thứ Tự Ưu Tiên Các Cấu Hình Biến Trong Terraform
Khi làm việc với Terraform, nhiều khi bạn sẽ gặp phải tình huống khai báo giá trị cho biến (variables) ở nhiều nguồn khác nhau. Vậy, giá trị nào sẽ được chọn khi có sự xung đột? Đây chính là một vấn đề thường gặp và cũng rất thú vị để thảo luận, đặc biệt là trong các cuộc phỏng vấn DevOps. Hãy cùng đi sâu vào tìm hiểu cách Terraform xác định giá trị biến và thứ tự ưu tiên của chúng.
Terraform cho phép 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ố dòng lệnh (CLI), đầu vào từ module và ưu tiên các nguồn này theo thứ tự cụ thể. 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. Dưới đây là thứ tự ưu tiên từ cao đến thấp:
-
Tham Số Dòng Lệnh:
-var
và-var-file
Đây là mức ưu tiên cao nhất. Giá trị 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ụ:
terraform apply -var="instance_type=t3.micro"
Trong ví dụ này, giá trịinstance_type
được đặt làt3.micro
và ghi đè tất cả các định nghĩa khác.Mục đích: Sử dụng khi cần ghi đè nhanh giá trị mặc định hoặc tích hợp vào các script tự động hóa.
-
Tệp Biến Tự Động Tải:
*.auto.tfvars
và*.auto.tfvars.json
Terraform sẽ tự động tải các tệp này trong thư mục hiện tại với mức ưu tiên cao sau tham số dòng lệnh.Ví dụ:
Tệpinstance.auto.tfvars
có nội dung:instance_type = "t3.medium"
Terraform sẽ tự động tải và áp dụng giá trị này.
Mục đích: Lưu trữ giá trị mặc định linh hoạt có thể dễ dàng ghi đè bởi tham số dòng lệnh mà không cần can thiệp thủ công.
-
Tệp
terraform.tfvars.json
Đây là định dạng có cấu trúc để định nghĩa các biến, rất phù hợp cho những ai ưa chuộng JSON.Ví dụ:
json{ "instance_type": "t3.large" }
Tệp này định nghĩa biến dưới dạng có cấu trúc, không phụ thuộc vào HCL.
Mục đích: Sử dụng trong môi trường ưa chuộng định dạng JSON.
-
Biến Môi Trường:
TF_VAR_name
Biến môi trường có tiền tốTF_VAR_
sẽ được Terraform sử dụng như là giá trị biến trong cấu hình.Ví dụ:
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: Quản lý biến giữa các môi trường (dev, staging, production).
-
Tệp
terraform.tfvars
Đây là nguồn có mức ưu tiên thấp nhất trong việc định nghĩa biến.Ví dụ:
hclinstance_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: Đặt các giá trị mặc định chung cho các cấu hình hạ tầng, hiệu quả cho các giá trị hiếm khi thay đổi.
Ví Dụ Thực Tế: Giá Trị Nào Được Chọn?
Hãy xem một tình huống trong đó biến instance_type
được định nghĩa ở nhiều nơi như sau:
- Trong tệp
terraform.tfvars
:instance_type = "t3.small"
- Biến môi trường:
TF_VAR_instance_type = "t3.large"
- Tệp
instance.auto.tfvars
:instance_type = "t3.medium"
- Tham số dòng lệnh:
terraform apply -var="instance_type=t3.micro"
Với thứ tự ưu tiên đã nêu, 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
Việc nắm rõ thứ tự ưu tiên biến trong Terraform giúp bạn:
- Tránh ghi đè không mong muốn: Hiểu rõ nơi định nghĩa biến sẽ giúp bạn tránh được hành vi không như ý.
- Đảm bảo cấu hình động: Sử dụng tham số dòng lệnh và biến môi trường giúp bạn cấu hình linh hoạt tùy 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 đè: Xây dựng các giá trị mặc định hợp lý và dễ dàng ghi đè khi cần thiết.
Chúc bạn thành công!
source: viblo