原簡體中文教程連結: Introduction.《Terraform入門教程》
Terraform 使用一系列的環境變數來客製化各方面的行為。如果只是想簡單使用 Terraform,我們並不需要設定這些環境變數;但他們可以在一些不常見的場景下幫助我們改變 Terraform 的預設行為,或是出於偵錯目的修改輸出日誌的等級。
此環境變數可以設定 Terraform 內部日誌的輸出級別,例如:
$ export TF_LOG=TRACE
Terraform 日誌等級有 TRACE
、DEBUG
、INFO
、WARN
和 ERROR
。TRACE
包含的資訊最多也最冗長,如果 TF_LOG
被設定為這五級以外的值時 Terraform 會預設使用 TRACE
。
如果在使用 Terraform 的過程中遇到未知的錯誤並懷疑是 Terraform 或相關外掛程式的 bug,請設定 TF_LOG
等級後收集輸出的日誌並提交給相關人員。
有志於取得 Terraform 認證的讀者請注意,該知識點近乎屬於必考。
此環境變數可以設定日誌檔案保存的位置。注意,如果 TF_LOG_PATH
被設定了,那麼 TF_LOG
也必須被設定。舉例來說,想要始終把日誌輸出到目前工作目錄,我們可以這樣:
$ export TF_LOG_PATH=./terraform.log
當環境變數設定為 "false" 或 "0" 時,等同於執行 terraform 相關命令列指令時加入了參數 -input=false
。如果你想在自動化環境下避免 Terraform 透過命令列的互動式提示要求給定輸入變數的值而是直接報錯時(無 default 值的輸入變量,無法透過任何途徑獲得值)可以設定該環境變數:
$ export TF_INPUT=0
我們在介紹輸入變數賦值時介紹過,可以透過設定名為 TF_VAR_name
的環境變數來為名為 "name" 的輸入變數賦值:
$ export TF_VAR_region=us-west-1
$ export TF_VAR_ami=ami-049d8641
$ export TF_VAR_alist='[1,2,3]'
$ export TF_VAR_amap='{ foo = "bar", baz = "qux" }'
TF_CLI_ARGS
的值指定了附加給命令列的額外參數,這使得在自動化 CI 環境下可以輕鬆自訂 Terraform 的預設行為。
此參數的值會直接插入在子命令後(例如 plan)以及透過命令列指定的參數之前。這種做法確保了環境變數參數優先於透過命令列傳遞的參數。
例如,執行這樣的指令: TF_CLI_ARGS="-input=false" terraform apply -force
,它等價於手動執行 terraform apply -input=false -force
。
TF_CLI_ARGS
變數會影響所有的 Terraform指令。如果你只想影響某個特定的子指令,可以使用 TF_CLI_ARGS_name
變數。例如:TF_CLI_ARGS_plan="-refresh=false"
,就只會針對 plan 子指令運作。
這個環境變數的值會與透過命令列傳入的參數一樣被解析,你可以在值裡使用單引號和雙引號來定義字串,多個參數之間以空格分隔。
TF_DATA_DIR
可以修改 Terraform 保存在每個工作目錄下的資料的位置。一般來說,Terraform 會把這些資料寫入目前工作目錄下的 .terraform
資料夾內,但這個位置可以透過設定 TF_DATA_DIR
來修改。
大部分情況下我們不應該設定該變量,但有時我們不得不這樣做,例如預設路徑下我們無權寫入資料時。
這個數據目錄被用來保存下一次執行任意命令時需要讀取的數據,所以必須被妥善保存,並確保所有的 Terraform 命令都可以一致地讀寫它,否則 Terraform 會找不到 Provider 套件、模組代碼以及其他文件。
如果該變數被設定為非空值,Terraform 會意識到自己運行在一個自動化環境下,從而調整自己的輸出以避免給出關於該執行什麼子命令的建議。這可以使得輸出更加一致且減少非必要的資訊量。
此變數定義了嘗試從 registry 拉取套件或模組程式碼遇到錯誤時的重試次數。
此變數定義了發送到 registry 連線請求的逾時時間,預設值為 10 秒。可以這樣設定超時:
$ export TF_REGISTRY_CLIENT_TIMEOUT=15
該變數設定了 Terraform 命令列設定檔的位置:
$ export TF_CLI_CONFIG_FILE="$HOME/.terraformrc-custom"
在編碼時我們有時會需要引用一些資源的輸出屬性或是一些模組的輸出值,這都涉及如何在程式碼中引用特定模組或是資源。另外在執行某些命令列操作時也需要我們明確指定一些目標資源,這時我們要掌握 Terraform 的資源路徑規則。
一個資源位址是用以在一個龐大的基礎設施中精確引用一個特定資源物件的字串。一個位址由兩個部分組成:[module path][resource spec]
。
一個模組路徑在模組樹上定位了一個特定模組。它的形式是這樣的:module.module_name[module index]
module
:module
關鍵字標記了這時一個子模組而非根模組。在路徑中可以包含多個 module
關鍵字module_name
:使用者定義的模組名[module index]
:(可選)存取多個子模組中特定實例的索引,由方括號包圍一個不包含具體資源的位址,例如 module.foo
代表了模組內所有的資源(如果只是單一模組而不是多實例模組),或者是多實例模組的所有實例。要指涉特定模組實例的所有資源,需要在位址中附帶下標,例如 module.foo[0]
。
如果位址中模組部分被省略,那麼位址就指根模組資源。
一個多 module
關鍵字應用於多實例模組的範例:module.foo[0].module.bar["a"]
。
要注意的是,由於模組的 count
和 for_each
元參數是 Terraform 0.13 開始引進的,所以多實例模組位址也只能在 0.13 及之後的版本使用。
一個資源位址定位了程式碼中特定資源對象,它的形式是這樣的:resource_type.resource_name[resource index]
resource_type
:資源類型resource_name
:使用者定義的資源名稱[resource index]
:(可選)存取多實例資源中特定資源實例的索引,由方括號包圍以下規約適用於存取多實例模組及資源時所使用的索引值:
[N]
:當使用 count
元參數時 N 是一個自然數。如果省略,且 count > 1,那麼指涉所有的實例["INDEX"]
:當使用 for_each
元參數時 INDEX 是一個字母數字混合的字串給定一個程式碼定義:
resource "aws_instance" "web" {
# ...
count = 4
}
給定一個位址:aws_instance.web[3]
,它指涉的是最後一個名為 web 的 aws_instance
實例;給定位址 aws_instance.web
,指涉的是所有名為 web 的 aws_instance
實例。
給定如下程式碼:
resource "aws_instance" "web" {
# ...
for_each = {
"terraform": "value1",
"resource": "value2",
"indexing": "value3",
"example": "value4",
}
}
位址 aws_instance.web["example"]
引用的是 aws_instance.web
中鍵為 "example" 的實例。
原簡體中文教程連結: Introduction.《Terraform入門教程》