在高级方案中使用适用于 Terraform 的 Azure 导出

本文介绍如何使用适用于 Terraform 的 Azure 导出执行一些更高级的任务。

  • 将资源附加到现有的 Terraform 环境。
  • 将资源导出到具有远程后端状态的现有 Terraform 环境中

附加到现有资源

默认情况下,适用于 Terraform 的 Azure 导出可确保输出目录为空,以避免与现有用户文件发生任何冲突。 如果需要将资源导入现有状态文件,请添加 --append 标志。

aztfexport [command] --append <scope>

指定 --append 标志后,适用于 Terraform 的 Azure 导出将验证当前目录中的任何文件中是否存在预先存在的 providerterraform 块。 否则,该工具会为每个块创建一个文件,然后继续导出。 如果输出目录有一个状态文件,则所有导出的资源都将导入到状态文件中。

此外,生成的文件在扩展名之前有 .aztfexport 后缀,例如 main.aztfexport.tf,以避免潜在的文件名冲突。

如果多次运行 aztfexport --append,则每次运行命令时,都会创建一个 main.aztfexport.tf,并将导出结果附加到文件中。

自带 Terraform 配置

默认情况下,适用于 Terraform 的 Azure 导出使用本地后端来存储状态文件。 但是,也可以使用远程后端。 使用适用于 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),或者将命令组合到一行中。
  • 如果后端状态已存在,则适用于 Terraform 的 Azure 导出会自动将新资源与现有状态合并。 你无需指定 --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 plan

  5. 适用于 Terraform 的 Azure 导出应显示无需更改

祝贺你! 基础结构及其相应的状态已成功附加到 Terraform 环境中。

如果计划遇到问题,请参阅适用于 Terraform 的 Azure 导出概念,以了解有关部署由 --hcl-only其生成的代码的限制。 如果这篇文章对你没有帮助,请提交 GitHub 问题

进一步自定义查询

下面介绍了一些其他高级标志,以及如何利用它们:

选择云环境

若要指定公共云以外的其他环境,请使用 --env 标志。 例如,对于美国政府:

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

更改 Terraform 提供程序版本

若要更简单地访问首选 AzureRM 版本或 AzAPI 版本,请使用 --provider-version 标志。 例如,如果使用的是 AzAPI 版本 1.10.0

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>

后续步骤