iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

Terraform 繁體中文系列 第 21

Day21-【入門教程】apply, console, destroy, fmt, force-unlock, get

  • 分享至 

  • xImage
  •  

原簡體中文教程連結: Introduction.《Terraform入門教程》


1.6.4.1. apply

Terraform 最重要的指令就是 apply。apply 指令被用來產生執行計畫(可選)並執行之,使得基礎設施資源狀態符合程式碼的描述。

1.6.4.1.1. 用法

terraform apply [options] [dir-or-plan]

預設情況下,apply 會掃描目前目錄下的程式碼文件,並執行相應的變更。然而,也可以透過參數指定其他程式碼檔案目錄。在設計自動化管線時也可以明確分為建立執行計畫、使用 apply 指令執行該執行計畫兩個獨立步驟。

如果沒有明確指定變更計劃文件,那麼 terraform apply 會自動建立新的變更計劃,並提示使用者是否批准執行。如果產生的方案不包含任何變更,那麼 terraform apply 會立即退出,不會提示使用者輸入。

此指令有以下參數可以使用:

  • -backup-path:保存備份檔案的路徑。預設等於 -state-out 參數後加上 ".backup" 後綴。設定為 "-" 可關閉
  • -compact-warnings:如果 Terraform 產生了一些警告訊息而沒有伴隨的錯誤訊息,那麼以只顯示訊息總結的精簡形式展示警告
  • -lock=true:執行時是否先鎖定狀態文件
  • -lock-timeout=0s:嘗試重新取得狀態鎖的間隔
  • -input=true:在無法取得輸入變數的值是是否提示使用者輸入
  • -auto-approve:跳過互動確認步驟,直接執行變更
  • -no-color:停用輸出中的顏色
  • -parallelism=n:限制 Terraform 遍歷圖時的最大並行度,預設值為 10 (考試高頻考點)
  • -refresh=true:指定變更計畫及執行變更前是否先查詢記錄的基礎設施物件現在的狀態以刷新狀態檔。如果命令列指定了要執行的變更計劃文件,則該參數設定無效
  • -state=path:儲存狀態檔案的路徑,預設值是 "terraform.tfstate"。如果使用了遠端 Backend 該參數設定無效。此參數不影響其他指令,例如執行 init 時會找不到它所設定的狀態檔。如果要讓所有指令都可以使用同一個特定位置的狀態文件,請使用 Local Backend(譯者也不知道這是什麼,官方文件相關連結404,並且搜尋不到)
  • -state-out=path:寫入更新的狀態檔案的路徑,預設使用 -state 的值。此參數在使用遠端 Backend 時設定無效
  • -target=resource:透過指定資源位址指定更新目標資源。我們會在後續介紹 plan 指令時詳細介紹
  • -var 'foo=bar':設定一組輸入變數的值。此參數可以重複設定以傳入多個輸入變數值
  • -var-file=foo:指定一個輸入變數檔。具體內容我們在介紹輸入變數的章節已有介紹,在此不再贅述

1.6.5.1. console

有時我們想要一個安全的偵錯工具來幫助我們確認某個表達式是否合法,或者表達式的值是否符合預期,這時我們可以使用 terraform console 啟動一個互動式控制台。

1.6.5.1.1. 用法

terraform console [options] [dir]

console 指令提供了一個用以執行和測試各種表達式的命令列控制台。在編碼時如果我們不確定某個表達式的最終結果時(例如使用字串模版),我們可以在這個控制台中搭配當前狀態文件中的資料進行各種測試。

如果當前狀態是空的或還沒有建立狀態文件,那麼控制台可以用來測試各種表達式語法以及內建函數。

dir 參數指定了根模組的路徑。如果沒有指定 path 參數,則會使用目前工作目錄。

支援的參數有:

  • -state=path:指向本機狀態檔案的路徑。表達式計算會使用該狀態檔中記錄的值。如果沒有指定,則會使用目前工作區(Workspace)關聯的狀態文件

在控制台中可以使用 exit 指令或是 Ctrl-C 或是 Ctrl-D 退出。

1.6.5.1.2. 腳本化

terraform console 指令可以搭配非互動式腳本使用,可以使用管道符號將其他指令輸出接入控制台執行。如果沒有發生錯誤,只有最終結果會被列印。

範例:

$ echo "1 + 5" | terraform console
6

1.6.5.1.3. 遠端狀態

如果使用了遠端 Backend 儲存狀態,Terraform 會從遠端 Backend 讀取目前工作區的狀態資料來計算表達式。


1.6.6.1. destroy

terraform destroy 指令可以用來銷毀並回收所有 Terraform 管理的基礎設施資源。

1.6.6.1.1. 用法

terraform destroy [options] [dir]

Terraform 管理的資源會被銷毀,在執行銷毀動作前會透過互動式介面徵求使用者的確認。

此指令可以接收所有 apply 指令的參數,除了不可以指定 plan 檔。

如果 -auto-approve 參數被設定為 true,那麼將不會徵求使用者確認直接銷毀。

如果用 -target 參數指定了某項資源,那麼不但會銷毀該資源,同時也會銷毀一切依賴於該資源的資源。我們會在後續介紹 plan 指令時詳細介紹。

terraform destroy 將執行的所有操作都可以隨時透過執行 terraform plan -destroy 指令來預覽。


1.6.7.1. fmt

terraform fmt 指令被用來格式化 Terraform 程式碼檔案的格式和規格。這個指令會對程式碼檔案應用我們先前介紹過的程式碼風格規格中的一些規定,另外會針對可讀性對程式碼做些微調整。

其他具有產生 Terraform 程式碼檔案功能的指令會依照 `` terraform fmt的標準來產生程式碼,所以請在專案中遵循 fmt 的程式碼風格以保持程式碼風格的統一。

Terraform 不同版本的程式碼風格規格會有些微不同,所以在升級 Terraform 後我們建議要對程式碼執行一次 terraform fmt

1.6.7.1.1. 用法

terraform fmt [options] [dir]

預設情況下,fmt 會掃描目前資料夾以尋找程式碼檔案。如果 dir 參數被提供了,那麼它會掃描 dir 所指向的目錄。如果 dir 參數是一個減號(-),那麼 fmt 指令會從標準輸入讀取(STDIN)。

此命令支援以下參數:

  • -list=false:不列出包含不一致風格的文件
  • -write=false:不要重寫輸入檔(透過 -check 參數實現,或使用標準輸入流時)
  • -diff:展示格式差異
  • -check:檢查輸入是否合規。回傳 0 則代表所有輸入的代碼風格都是合規,反之則不是 0
  • -recursive:是否遞歸處理所有子資料夾。預設為 false(只有目前資料夾會被處理,不涉及內嵌子模組)

1.6.8.1. force-unlock

手動解除狀態鎖定。

這個指令不會修改你的基礎設施,它只會刪除目前工作區對應的狀態鎖定。具體操作步驟取決於使用的 Backend。本地狀態檔案無法被其他進程解鎖。

1.6.8.1.1. 用法

terraform force-unlock LOCK_ID [DIR]

參數:

  • -force=true:解鎖時不提示確認

要注意的是,就像我們在狀態管理篇當中介紹過的是,每一個狀態鎖都有一個鎖 ID。Terraform 為了確保我們解除正確的狀態鎖,所以會要求我們明確輸入鎖 ID。

一般情況下我們不需要強制解鎖,只有在 Terraform 異常終止,來不及解除鎖時需要我們手動強制解除鎖。錯誤地解除狀態鎖定可能會導致狀態混亂,所以請小心使用。


1.6.9.1. get

terraform get 指令被用來下載以及更新根模組中使用的模組。

1.6.9.1.1. 用法

terraform get [options] [dir]

模組被下載並安裝在目前工作目錄下 .terraform 子目錄。這個子目錄不應該被提交至版本控制系統。這個 .terraform 資料夾的建立路徑是在目前工作目錄下的,與 dir 參數無關。

如果模組已經被安裝而 -update 參數沒有設置,那麼 Terraform 什麼都不會做,這樣我們可以快速且安全地執行該命令任意多次。

此命令所有參數都是可選的:

  • `-update:如果指定,已經下載的模組會被檢查是否有新版本,如果有新版本則會更新
  • dir:指定根模組的位置

原簡體中文教程連結: Introduction.《Terraform入門教程》


上一篇
Day20-【入門教程】環境變數及資源地址
下一篇
Day22-【入門教程】graph, import, init, output, plan
系列文
Terraform 繁體中文25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言