在高级方案中对 Terraform 使用 Azure 导出
本文介绍如何使用 Azure Export for Terraform 执行一些更高级的任务。
- 将资源追加到现有的 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 导出使用本地后端来存储状态文件。 但是,也可以使用远程后端。 使用 Azure Export for Terraform 可以定义自己的 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 计划。
适用于 Terraform 的 Azure 导出应显示 无需更改。
祝贺你! 基础结构及其相应的状态已成功追加到 Terraform 环境中。
如果计划遇到问题,请参阅 适用于 Terraform 的 Azure 导出概念,以了解有关部署由 --hcl-only
其生成的代码的限制。 如果本文没有帮助,请打开 GitHub 问题。
后续步骤
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈