在高级方案中使用适用于 Terraform 的 Azure 导出
本文介绍如何使用适用于 Terraform 的 Azure 导出执行一些更高级的任务。
- 将资源附加到现有的 Terraform 环境。
- 将资源导出到具有远程后端状态的现有 Terraform 环境中
附加到现有资源
默认情况下,适用于 Terraform 的 Azure 导出可确保输出目录为空,以避免与现有用户文件发生任何冲突。 如果需要将资源导入现有状态文件,请添加 --append
标志。
aztfexport [command] --append <scope>
指定 --append
标志后,适用于 Terraform 的 Azure 导出将验证当前目录中的任何文件中是否存在预先存在的 provider
或 terraform
块。 否则,该工具会为每个块创建一个文件,然后继续导出。 如果输出目录有一个状态文件,则所有导出的资源都将导入到状态文件中。
此外,生成的文件在扩展名之前有 .aztfexport
后缀,例如 main.aztfexport.tf
,以避免潜在的文件名冲突。
如果多次运行 aztfexport --append
,则每次运行命令时,都会创建一个 main.aztfexport.tf
,并将导出结果附加到文件中。
自带 Terraform 配置
默认情况下,适用于 Terraform 的 Azure 导出使用本地后端来存储状态文件。 但是,也可以使用远程后端。 使用适用于 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),或者将命令组合到一行中。
- 如果后端状态已存在,则适用于 Terraform 的 Azure 导出会自动将新资源与现有状态合并。 你无需指定
--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 plan。
适用于 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
尝试按以下顺序对每个凭据类型进行身份验证,当提供令牌时停止:
- 客户端机密
- 客户端证书
- OIDC
- 托管的标识
- Azure CLI
如果一个或多个 use-xxx-cred
不为 true,则会跳过该凭据类型。 此行为与提供程序相同。
提供程序配置可以替代 aztfexport
中的任何身份验证配置。 这样,用户就可以在 aztfexport
和提供程序之间使用不同的凭据类型。
包括角色分配
如果要在导出资源范围时包括角色分配,请使用 --include-role-assignment
命令:
aztfexport [command] --include-role-assignment [further options] <scope>