Terraform 命令
一旦在你的機器上安裝 Terraform 之后,就可以在根模塊所在的目錄下,通過命令來與 Terraform 進行交互。本文涵蓋的常見命令包括 terraform init、terraform plan、terraform apply、terraform destroy 和 terraform fmt。
terraform init:用于初始化和自動下載提供商的插件。
terraform plan:提供在執行 terraform apply 后將創建的資源的預覽。
terraform apply:創建基礎設施資源。
terraform destroy:銷毀基礎設施資源。
terraform fmt:自動格式化代碼以匹配規范約定。
初始化階段(Init)
terraform init 命令在初始化階段運行,它是在完成 Terraform 配置后運行的第一個命令。terraform init 確保阿里云提供商的插件已完成下載,并安裝在當前工作目錄的子目錄中,同時還包括各種其他記錄文件。
提供商的代碼定義塊中包括一個 source 屬性,指定從哪里下載提供商插件。
Terraform 是基于插件的架構來實現對多種基礎設施和服務提供商支持的。每個 "提供商" 是一個獨立的二進制文件,它與 Terraform 本身獨立分發。terraform init 命令將自動下載和安裝 Terraform 配置中使用到的任何提供者的二進制文件,如在本例中,提供商是 alicloud。
terraform init 運行之后,你會看到一個 "Initializing provider plugins" 的消息,告訴你 Terraform 將找到指定版本的插件并下載相關文件。命令運行完成之后,在當前工作目錄中將會創建一個隱藏的 .terraform 目錄,該目錄中保存了已經下載的插件。
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding aliyun/alicloud versions matching "1.225.0"...
- Reusing previous version of hashicorp/alicloud from the dependency lock file
- Installing aliyun/alicloud v1.225.0...
- Installed aliyun/alicloud v1.225.0 (verified checksum)
...
Terraform has been successfully initialized!
terraform init 命令的輸出會告訴你 Terraform 已安裝的提供商版本,在此例中是 1.225.0 版本。
預覽階段(Plan)
terraform plan 創建一個執行計劃,并詳細展示了在執行 terraform apply 時將創建、修改或銷毀的所有資源信息。
運行 terraform plan 時,Terraform 會:
讀取現有資源的在遠端的當前狀態,以確保 Terraform 狀態是最新的。
將當前配置與先前狀態進行比較,并記錄任何差異。
構建一個執行計劃,只修改達成你所需狀態所必要的部分。
terraform plan 實際上不會創建或更改任何基礎設施資源,而是為你提供預覽基礎設施創建和變更的機會。例如,在將 Terraform 配置提交到版本控制之前,你可能想要運行此命令,以確保其行為跟預期是一樣的。
資源和參數旁邊的符號表示對資源計劃執行的具體操作:
加號(+)
資源旁邊的加號意味著 Terraform 將創建該資源,并展示將要設置的屬性
減號斜線加號(-/+)
表示 Terraform 將銷毀當前資源并重新創建一個新的資源,而不是就地更新它的屬性
波浪號(~)
表示 Terraform 將就地更新資源屬性
減號(-)
表示銷毀當前資源實例
運行 terraform plan 命令時,你可以使用可選參數 -out=<文件名> 將生成的計劃保存到磁盤上的文件中,以便之后可以將文件作為執行計劃傳遞給 terraform apply 來執行。
$ terraform plan -out=tf.tfplan
執行階段(Apply)
terraform apply 執行通過 terraform plan 創建的執行計劃,或者直接生成執行計劃并確認執行,進而完成資源的創建和相互之間依賴關系的建立。
terraform apply 對執行計劃的執行有兩種方式:
直接執行 terraform plan 生成的執行計劃。terraform plan 通過 -out 參數將執行計劃保存為文件(比如文件命名為 tf.tfplan),terraform apply 可以直接使用該文件作為執行計劃直接執行,無需等待確認:
$ terraform apply tf.tfplan
自身重新生成執行計劃并等待確認再執行
和 terraform plan 命令一樣,terraform apply 在執行時也會顯示資源變更詳情,并嘗試創建執行計劃等待用戶確認執行。如果執行計劃成功創建,Terraform 會暫停并等待確認再繼續;如果計劃中有任何不正確或不安全的地方,你可以在這里中止而不改變你的基礎設施。
如果 terraform apply 執行失敗,請閱讀錯誤消息并解決問題。
資源銷毀(Destroy)
terraform destroy 用于銷毀資源。terraform destroy 類似于 terraform apply,但它的行為就像配置中將所有資源定義刪除并執行 terraform apply 一樣。
Terraform 銷毀資源主要有三種方式:
terraform destroy 命令
和 terraform apply 命令一樣,terraform destroy 在執行時也會顯示資源銷毀的詳情,并嘗試創建銷毀計劃等待用戶確認執行。如果銷毀計劃成功創建,Terraform 會暫停并等待確認再繼續;如果計劃中有任何不正確或不安全的地方,你可以在這里中止而不會銷毀你的基礎設施。
terraform plan 創建資源銷毀的執行計劃
可以通過 terraform plan 的可選參數 -destroy 來生成一個銷毀計劃,并通過 terraform apply 來執行這個銷毀計劃:
$ terraform plan -destroy -out=tf.tfplan
如果想要銷毀某個特定的資源,你也可以通過命令中的可選參數 -target=resource 來指定要銷毀的特定 資源。
刪除配置并創建資源銷毀執行計劃
從 Terraform 配置中刪除所有資源或者單個想要銷毀的資源的代碼定義,并通過 terraform plan 和 terraform apply 來完成所有資源或者指定資源的銷毀。
與 terraform plan 類似,Terraform 在銷毀資源時將確定需要銷毀的順序,例如,如果 VSwitch 交換機中仍有資源(如 ECS 實例,RDS 實例等),阿里云將不允許刪除 VSwitch 交換機,Terraform 會在實例被銷毀后再銷毀交換機。
terraform destroy 需要謹慎使用,它將銷毀任何資源及其相關數據。例如,如果 OSS Bucket 中有數據,在運行 terraform destroy 時要小心,因為這些數據無法恢復。
在生產環境中銷毀基礎設施是罕見的事件,但如果你使用 Terraform 創建多個環境(例如開發、測試和預發布),那么銷毀往往是一個有用的操作,可以用 terraform destroy 方便地清理臨時對象。
代碼格式化(fmt)
最后,我們來討論一些代碼格式化的最佳實踐:
將元參數與資源參數分開,放在代碼的最前面或最后,并留出空行
元參數是指 HCL 提供的預留參數,比如 count,for_each 等
參數從塊定義開始縮進兩個空格
當在一個塊中定義兩個或兩個以上的參數時,讓等號對齊
當一個塊包含嵌套塊時,將該塊放在所有參數之后
最后,當代碼包含多個塊時,用空行將它們分開以提高可讀性
運行 terraform fmt 將基于所有格式規則和推薦的樣式自動對模塊和代碼進行格式化,以提高代碼可讀性和一致性。terraform fmt 自動保持一致的格式,因此你不必手動更改配置以確保其符合標準。