適用於 Terraform 的 Azure 導出運作方式
本文將為您介紹適用於 Terraform 工作流程的 Azure 導出。 在本文中,您將瞭解工具的最佳作法指引、目前的限制,以及如何減輕這些限制。
互動式模式
根據預設,適用於 Terraform 的 Azure 匯出會以互動式模式執行。 當您以互動模式執行時,可用的鍵盤快捷方式會列在顯示器底部。
Task | 鍵盤快捷方式(s) |
---|---|
導覽 | |
選取資源清單中的上一個專案。 | ≦ -or- k |
選取資源清單中的下一個專案。 | — -or- j |
移至資源清單中的上一頁。 | ← -or- h -or- Page Up |
移至資源清單中的下一頁。 | → -或- l -或- Page Down |
跳到資源清單的開頭。 | g -或- 首頁 |
跳到資源清單的結尾。 | G -或- 結束 |
選取要略過的資源 | |
略過資源 (如果標示為 “Skip”, 或取消斯基普) | 刪除 |
篩選作業 | |
依資源清單中的文字定義篩選。 | / |
清除任何目前的篩選 | Esc |
儲存作業 | |
儲存資源清單的對應檔案。 輸出檔案會受到略過 (但不篩選) 的影響。 | s |
將資源匯出至狀態(如果未 --hcl-only 指定),併產生組態。 |
w |
使用者體驗 | |
顯示目前資源的建議。 | r |
顯示資源匯出錯誤(如果有的話)。 | e |
顯示說明。 | ? |
退出 | |
結束互動式模式。 | 問 |
針對每個資源,適用於 Terraform 的 Azure Export 會嘗試辨識對應的 Terraform 資源類型。 如果找到相符專案,這一行會以下列指標標示: 💡。
如果無法解析資源,您需要以下列格式輸入 Terraform 資源位址: <resource type>.<resource name>
。 例如,azurerm_linux_virtual_machine.test
是指 azurerm_linux_virtual_machine的 Terraform 資源類型,而 test
參考組態檔中使用的虛擬機名稱。
若要查看所選資源的可用資源類型,請按 r。
在某些情況下,Azure 資源沒有對應的 Terraform 資源,例如資源缺少 Terraform 支援。 某些資源可能也會建立為布建另一個資源的副作用,例如布建虛擬機時所建立的OS磁碟資源。 在這些情況下,您可以略過資源,而不需要指派任何專案。
完成要匯入的所有資源之後,請按 w 開始產生 Terraform 組態,並(如果未 --hcl-only
選取)匯入至 Terraform 狀態。
非互動式模式
根據預設,適用於 Terraform 的 Azure 匯出會以互動式模式執行。 若要指定工具應在非互動式模式中執行,請指定 --non-interactive
旗標。
aztfexport [command] --non-interactive <scope>
重要
如果您執行 Azure Export for Terraform 的目錄不是空的,您必須新增 --overwrite
旗標以使用 --hcl-only
旗標。
核心工作流程的最佳做法
在基本層級上,Azure 導出的任何使用者都面臨兩個選項之間的決策:
下列小節提供根據案例採取哪一個選項的指引。
管理基礎結構
如果您尚未以所需的方式驗證已設定的資源在環境中運作,您可能不需要匯出為狀態。
如果您確定想要使用 terraform init plan apply
工作流程來管理 Terraform 中的一組資源,匯出至狀態就很重要。
如果您還不確定要管理資源,建議傳遞 --hcl-only
旗標。
現有的基礎結構
在導出至現有 Terraform 環境的案例中,將 它視為--hcl-only
對等的 terraform 方案可能很有説明,尤其是在附加至現有環境之前。
terraform apply
命令等同於導出資源 - 其組態會系結至既有狀態。 在此案例中,使用對應檔案可節省運行時間來列出和對應資源。
探索基礎結構
如果您不確定環境中有哪些資源存在,您可以藉由指定 --generate-mapping-file
旗標來驗證。 如需此主題的詳細資訊,請參閱 使用 Azure Export for Terraform 探索自定義資源選取和命名。
限制
適用於 Terraform 的 Azure 匯出是一項複雜的工具,會嘗試將 Azure 基礎結構轉換成 Terraform 程式代碼和狀態。 其目前已知限制會在下列小節中說明。
唯寫屬性
AzureRM 內的某些屬性是僅限寫入的,而且不會包含在 Azure Export for Terraform 所建立的產生程式代碼中。 在匯出至 HCL 程式代碼之後定義 屬性,即可解決此問題。
跨屬性條件約束
AzureRM 提供者可以設定兩個彼此衝突的屬性。 當 Azure Export for Terraform 讀取衝突的屬性時,它可能會將這兩個屬性設定為相同的值,儘管使用者只設定一個。 當相同產生的組態中存在多個跨屬性條件約束時,會出現進一步的併發症。 您必須知道設定中存在跨屬性衝突的位置,才能減輕此問題。
資源範圍外的基礎結構
當您使用 Azure Export for Terraform 以目標資源範圍時,設定所需的資源可能會存在於指定的範圍之外。 其中一個範例是角色指派。 用戶必須識別超出範圍的資源。
唯寫屬性
Azure 匯出無法在其組態內產生唯寫屬性(例如密碼)。您必須知道唯寫屬性,並在組態中定義它們,以建立新的資源集。
修改程式代碼以符合程式代碼撰寫標準
如果使用者想要修改程式碼以遵守程式碼標準,則有幾個必要的作業。 只有在使用者打算在 nonsandbox 環境中使用程式代碼時,才需要這些步驟。
屬性定義的資源
Azure 中的某些資源可以定義為父 Terraform 資源或個別 Terraform 資源中的屬性。 其中一個範例是子網。 適用於 Terraform 的 Azure 導出會將資源定義為個別資源,但最佳做法是符合您現有的編碼組態。
明確相依性
適用於 Terraform 的 Azure 匯出目前只能宣告明確的相依性。 您必須知道資源之間的關聯性對應,以重構程式代碼以包含任何必要的隱含相依性。
硬式編碼值
適用於 Terraform 的 Azure 匯出目前會產生硬式編碼字串。 最佳做法是,您應該將這些值重構為變數。 此外,當您使用 --full-properties
旗標公開所有屬性時,產生的組態中可以看到一些敏感性資訊(例如秘密)。使用建議的做法來保護此程式碼的可見度。