在高级方案中对 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 可以定义自己的 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 计划

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

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

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

后续步骤