共用方式為


在進階案例中使用適用於 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 匯出可讓您定義自己的 terraformprovider 區塊來傳遞。

在目標目錄內的檔案中 .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 記憶體遠端狀態教學課程中指定的相同組態。

  1. 在您要建立暫存目錄的父目錄中,執行下列命令:

    aztfexport resource -o tempdir --hcl-only <resource_id>
    

    重點︰

    • 如果目錄不存在,旗 -o 標會指定建立目錄。
    • --hcl-only 標會指定將設定的資源匯出至 HCL
  2. 檢查資源是否可附加之後,請利用產生的對應檔案和 --append 旗標來確保 Azure 匯出會遵守現有遠端狀態和現有環境中的提供者版本:

    aztfexport map --append `./tempdir/aztfexportResourceMapping.json`
    
  3. 執行 terraform init

    terraform init --upgrade
    
  4. 執行 terraform 方案

  5. 適用於 Terraform 的 Azure 匯出應該會顯示 [不需要變更]。

恭喜! 您的基礎結構及其對應的狀態已成功附加至您的 Terraform 環境。

如果您的計劃發生問題,請參閱 適用於 Terraform 的 Azure 匯出概念,以瞭解有關部署 所 --hcl-only產生程式代碼的限制。 如果該文章無法協助您,請開啟 GitHub 問題

進一步自定義您的查詢

以下將說明一些額外的進階旗標,以及如何利用它們:

選取雲端環境

若要指定公用雲端以外的不同環境,請使用 --env 旗標。 例如,針對美國政府:

aztfexport [command] --env="usgovernment" [further options] <scope>

變更 Terraform 提供者版本

若要更容易存取慣用 AzureRMAzAPI 版本,請使用 --provider-version 旗標。 例如,如果您在版本1.10.0AzAPI

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 試著以下順序向每個認證類型進行驗證,並在提供權杖時停止:

  1. 用戶端密碼
  2. 用戶端憑證
  3. OIDC
  4. 受控識別
  5. Azure CLI

如果一或多個 use-xxx-cred 不是 true,則會略過該認證類型。 此行為與提供者相同。

提供者設定可以從覆寫任何驗證設定 aztfexport。 這可讓使用者在和 提供者之間 aztfexport 使用不同的認證類型。

包括角色指派

如果您要匯出資源範圍時包含角色指派,請使用 --include-role-assignment 命令:

aztfexport [command] --include-role-assignment [further options] <scope>

下一步