在進階案例中使用適用於 Terraform 的 Azure 導出
本文說明如何使用 Azure Export for Terraform 執行一些更進階的工作。
- 將資源附加至現有的 Terraform 環境。
- 將資源匯出至具有遠端後端狀態的現有 Terraform 環境
附加至現有資源
根據預設,Azure Export for Terraform 可確保輸出目錄是空的,以避免與現有的使用者檔案發生任何衝突。 如果您需要將資源匯入現有的狀態檔案,請新增 --append
旗標。
aztfexport [command] --append <scope>
--append
指定旗標時,Azure Export for Terraform 會驗證目前目錄中是否有預先存在的provider
檔案或terraform
區塊。 如果沒有,此工具會為每個區塊建立檔案,然後繼續進行匯出。 如果輸出目錄有狀態檔案,則會將任何導出的資源匯入狀態檔案中。
此外,產生的檔案會在擴展名之前加上 .aztfexport
後綴,例如 main.aztfexport.tf
,以避免潛在的檔名衝突。
如果您執行 aztfexport --append
多次,就會建立一個單 main.aztfexport.tf
一,每次執行命令時,匯出結果會附加至檔案。
自備 Terraform 設定
根據預設,Azure Export for Terraform 會使用本機後端來儲存狀態檔案。 不過,也可以使用遠端後端。 適用於 Terraform 的 Azure 匯出可讓您定義自己的 terraform
或 provider
區塊來傳遞。
在目標目錄內的檔案中 .tf
定義這些區塊、使用 --append
旗標匯出,以及您的組態匯出至指定的後端和提供者版本(如果提供的話)。
重要
如果指定的 AzureRM 版本與匯出時已安裝的版本不符,命令會失敗。
Azure 儲存體 範例
此範例是以發行項為依據,儲存 Azure 儲存體 中的 Terraform 狀態。
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
backend "azurerm" {
resource_group_name = "tfstate"
storage_account_name = "storageacc"
container_name = "tfstate"
key = "terraform.tfstate"
}
}
provider "azurerm" {
features {}
}
Terraform Cloud 範例
terraform {
cloud {
organization = "aztfexport-test"
workspaces {
name = "aztfexport-playground"
}
}
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {
}
}
內嵌體驗
若要匯出至後端內嵌,請使用 --backend-type
和 --backend-config
選項。 如需設定 Terraform 後端的詳細資訊,請參閱 Terraform 後端設定。
使用我們的 Azure 記憶體帳戶範例,您需要如 AzureRM 後端檔中所定義的 下列內容。
- 資源群組名稱
- 儲存體帳戶名稱
- 記憶體容器名稱
將這些參數連同後端類型一起傳遞至命令:
aztfexport [subcommand] --backend-type=azurerm \
--backend-config=resource_group_name=<resource group name> \
--backend-config=storage_account_name=<account name> \
--backend-config=container_name=<container name> \
--backend-config=key=terraform.tfstate
重點︰
- 在上一個範例中,我使用的是 Unix 行接續字元,讓程式代碼在瀏覽器中顯示良好。 您可能需要變更這些字元,以符合命令行環境,例如 PowerShell,或將命令結合到一行。
- 如果後端狀態已經存在,Azure Export for Terraform 會自動合併新的資源與現有的狀態。 您不需要指定
--append
內嵌選項。
將 Azure 資源匯出至現有的 Terraform 環境
現在,讓我們把它全部放在一起! 想像一下,Terraform 外部已建立需要移至 Terraform 管理的新資源。 若要完成區段,請確定您已設定後端。 本教學課程使用 Azure 記憶體遠端狀態教學課程中指定的相同組態。
在您要建立暫存目錄的父目錄中,執行下列命令:
aztfexport resource -o tempdir --hcl-only <resource_id>
重點︰
- 如果目錄不存在,旗
-o
標會指定建立目錄。 - 旗
--hcl-only
標會指定將設定的資源匯出至 HCL
- 如果目錄不存在,旗
檢查資源是否可附加之後,請利用產生的對應檔案和
--append
旗標來確保 Azure 匯出會遵守現有遠端狀態和現有環境中的提供者版本:aztfexport map --append `./tempdir/aztfexportResourceMapping.json`
執行 terraform init。
terraform init --upgrade
執行 terraform 方案。
適用於 Terraform 的 Azure 匯出應該會顯示 [不需要變更]。
恭喜! 您的基礎結構及其對應的狀態已成功附加至您的 Terraform 環境。
如果您的計劃發生問題,請參閱 適用於 Terraform 的 Azure 匯出概念,以瞭解有關部署 所 --hcl-only
產生程式代碼的限制。 如果該文章無法協助您,請開啟 GitHub 問題。
進一步自定義您的查詢
以下將說明一些額外的進階旗標,以及如何利用它們:
選取雲端環境
若要指定公用雲端以外的不同環境,請使用 --env
旗標。 例如,針對美國政府:
aztfexport [command] --env="usgovernment" [further options] <scope>
變更 Terraform 提供者版本
若要更容易存取慣用 AzureRM
或 AzAPI
版本,請使用 --provider-version
旗標。 例如,如果您在版本1.10.0
上AzAPI
:
aztfexport [command] --provider-name=azapi --provider-version=1.10.0 [further options] <scope>
驗證
有各種不同的旗標可用來管理驗證組態。 某些旗標已新增為 v0.15
:
--env
--tenant-id
--auxiliary-tenant-ids
--client-id
--client-id-file-path
--client-certificate
--client-certificate-path
--client-certificate-password
--client-secret
--client-secret-file-path
--oidc-request-token
--oidc-request-url
--oidc-token
--oidc-token-file-path
--use-managed-identity-cred
(預設值為 false)--use-azure-cli-cred
(預設值為 true)--use-oidc-cred
(預設值為 false)
上述旗標遵循提供者的 azurerm
命名慣例。 所有旗標也可以透過環境變數來設定,其中包含提供者中 azurerm
定義的相同環境變數。
aztfexport
試著以下順序向每個認證類型進行驗證,並在提供權杖時停止:
- 用戶端密碼
- 用戶端憑證
- OIDC
- 受控識別
- Azure CLI
如果一或多個 use-xxx-cred
不是 true,則會略過該認證類型。 此行為與提供者相同。
提供者設定可以從覆寫任何驗證設定 aztfexport
。 這可讓使用者在和 提供者之間 aztfexport
使用不同的認證類型。
包括角色指派
如果您要匯出資源範圍時包含角色指派,請使用 --include-role-assignment
命令:
aztfexport [command] --include-role-assignment [further options] <scope>