Overview
input variable 通常用來作為 module 的 parameter,而且在 root module 中定義好的 variable,可以根據需求透過 CLI or 環境變數來覆蓋。
變數宣告
要宣告一個變數檔,基本上就是新增一個副檔名為 tf 的文字檔,放入類似以下內容:
1 | # 變數名稱為 "image_id",型態為 string |
基本上變數的名稱可以隨意取(只要遵守命名規則即可),但不可使用 source, version, providers, count, for_each, lifecycle, depends_on, locals … 等關鍵字。
如何使用 input variable?
使用方式很簡單,一個簡單的範例如下:
1 | # ami 設定中使用變數 image_id |
變數型態
input variable 可以有很多型態,以下是目前支援的型態:
stringnumberboollist(<TYPE>)set(<TYPE>)map(<TYPE>)object({<ATTR NAME> = <TYPE>, ... })tuple([<TYPE>, ...])
tuple 中每個元素可以是不同的型態,例如
["a", 15, true]
詳細的使用規範 & 範例可以參考官網文件。
如何傳入 variable values ?
定義了 variable 之後,就會面臨到如何傳入 value 的問題。
以下的說明是將 value 傳入到 root module 中,若是要傳入到 child module 中,則是要在程式中自行處理。
透過 command line
透過 -var 關鍵字搭配 terraform plan or terraform apply 命令使用:
1 | $ terraform apply -var="image_id=ami-abc123" |
-var可以在單一指令中使用多次,來傳入多個 variable value
使用變數定義檔(.tfvars)
可以撰寫以 .tfvars or .tfvars.json 為副檔名的變數定義檔,以下是一個簡單的範例:
1 | image_id = "ami-abc123" |
以下是 json 格式的範例:
1 | { |
可以透過類似以下的語法帶入變數定義檔:
terraform apply -var-file=”testing.tfvars”
而 Terraform 也可以自動將變數定義檔載入,只要符合以下任何一種命名規範即可:
檔案名稱為
terraform.tfvarsorterraform.tfvars.json任何檔名,副檔名為
.auto.tfvarsor.auto.tfvars
必須放在執行
terraform applyorterraform plan時所在的目錄中
用 Environment Variables 傳入
除了上面兩種外,Terraform 也會自動去使用環境變數開頭為 TF_VAR_ 的環境變數來作為 variable value。
假設變數名稱為 image_id,只要將變數值設定到 TF_VAR_image_id 環境變數中,terraform 就會自己載入了!
傳入變數值的優先權
上面提到幾個方法可以傳入變數值,那如果同時有多個方法被使用,哪個會被優先採用呢?
基本上順序是這樣的:
首先會使用目錄中的
terraform.tfvarsorterraform.tfvars.json檔案若目錄中有
*.auto.tfvarsor*.auto.tfvars.json檔案,則會覆蓋掉上一個檔案中的變數值若在 command line 中透過
-varor-var-file指定變數值或是檔案,則會覆蓋掉上面兩個檔案中提供的變數值