Terraform: Input Variables
要讓 Terraform 能有複用性,我們需要加入一些參數化變數來增加彈性,也就是為 module 的 parameter,而且在 root module 中定義好的 variable,可以根據需求來覆蓋。 Terraform Input Variables 的功能,讓我們可以宣告變數,並有幾種方式可以傳入自訂義 variable values:
- command line
.tfvars
- Environment 讀取
以下會簡單介紹這些方式和優缺點。
雖然對於 Terraform 的設計,在任何 .tf
檔案內的任何位置,我們都可以宣告 Variable ,但這不太符合 best practice …,一般會建議把所有變數相關的宣告,都放在 variables.tf
內。在 plan 或是 apply 時,若 terraform 抓不到任何 Variable 資訊的話,會要求你在 console 輸入資料。
command line
想要在輸入指令時帶入資料,需要加上 -var
,範例如下:
terraform apply -var="project_id=my-test-project"
比較需要注意的是複雜型態的變數
terraform apply -var="project_id=my-test-project" -var='zones=["us-central1-a", "us-central1-b"]'
terraform apply -var='img_info={"image_project":"my-img-project","image_name":""my-test-img"}'
-var
可以在 cli 中使用多次,來傳入多個 variable value 。
個人覺得在 cli 中傳入太多變數的寫法其實不太好,而且在面對複雜型態的變數,其實也蠻容易寫錯的。
.tfvars
建立 .tfvars
檔案,這個副檔名就是變數定義檔。例如定義一個 testing.tfvars
檔案內容如下 :
project_id="my-test-project"
zones=[
"us-central1-a",
"us-central1-b"
]
在輸入指令時,加上 -var-file
,可以用來指定變數定義檔,範例如下:
terraform apply -var-file="testing.tfvars"
但還需要指定 .tfvars
檔案實在是有點麻煩…,為解決這問題,有一些預設會抓取的名稱。如果 .tfvars
檔案,符合以下檔名規則,Terraform 則會自動用來當作-var-file
:
- terraform.tfvars(最常用)
- *.auto.tfvars
自動當作 -var-file
的檔案,必須放在執行 terraform apply or terraform plan 時所在的目錄中喔。
個人最常使用 terraform.tfvars ,並且建議不要把它上傳到 GIT 內管理。
Environment
Terraform 會搜尋以 TF_VAR_
開頭宣告的環境變數來使用,,範例如下:
export TF_VAR_project_id=my-test-project
terraform plan
個人基本上不會採取這種做法,在 CICD 流程中,我會選擇造出 terraform.tfvars 檔案並放到對應位置,而不會使用寫到環境變數的方式。
變數的使用優先順序
上面提到幾個方法可以傳入 variables ,那如果同時有多個方法被使用,優先級如何排序呢 ? Terraform 載入變數的順序如下,較晚載入的會覆蓋前面的:
- 環境變數
- terraform.tfvars
- *.auto.tfvars
- 指令加上 -var 或是 -var-file 參數
基本上以 cli 指令代的值為主,再來是 .tfvars
,最後才是環境變數。