适用于 Terraform 的 Azure 导出的工作原理

本文介绍适用于 Terraform 工作流的 Azure 导出。 在本文中,你将了解该工具的最佳做法指南、当前限制以及如何缓解这些限制。

交互模式

默认情况下,适用于 Terraform 的 Azure 导出以交互模式运行。 在交互模式下运行时,显示的底部会列出可用的键盘快捷方式。

任务 键盘快捷方式(s)
导航
在资源列表中选择上一项。 -or- k
在资源列表中选择下一项。 -or- j
移动到资源列表中的上一页。 ← -or- h -or- Page Up
移动到资源列表中的下一页。 → -or- l -or- Page Down
跳转到资源列表的开头。 g -or- Home
跳转到资源列表的末尾。 G -or- End
选择要跳过的资源
跳过资源(如果标记为“Skip”) 删除
筛选操作
按资源列表中的文本定义筛选器。 /
清除任何当前筛选器 Esc
保存操作
保存资源列表的映射文件。 输出文件受跳过(但不筛选)的影响。 s
将资源导出到状态(如果未 --hcl-only 指定)并生成配置。 w
用户体验
显示当前资源的建议。 r
显示资源导出错误(如果有)。 e
显示帮助。 ?
退出
退出交互式模式。 q

对于每个资源,Terraform 的 Azure 导出会尝试识别相应的 Terraform 资源类型。 如果找到匹配项,则线标有以下指示器: 💡

如果无法解析资源,则需要以以下形式输入 Terraform 资源地址: <resource type>.<resource name> 例如,引用azurerm_linux_virtual_machineTerraform 资源类型,azurerm_linux_virtual_machine.testtest引用配置文件中使用的虚拟机的名称。

若要查看所选资源的可用资源类型,请按 r

在某些情况下,有些 Azure 资源没有相应的 Terraform 资源,例如资源缺少 Terraform 支持。 某些资源也可能是预配另一个资源的副作用,例如预配虚拟机时创建的 OS 磁盘资源。 在这些情况下,可以跳过资源而不分配任何内容。

完成要导入的所有资源后,按 w 开始生成 Terraform 配置,并(如果未 --hcl-only 选择)导入到 Terraform 状态。

非交互模式

默认情况下,适用于 Terraform 的 Azure 导出以交互模式运行。 若要指定该工具应在非交互模式下运行,请指定 --non-interactive 标志。

aztfexport [command] --non-interactive <scope>

重要

如果运行 Azure Export for Terraform 的目录不为空,则必须添加 --overwrite 标志才能使用该 --hcl-only 标志。

核心工作流的最佳做法

在基本层面上,Azure 导出的任何用户都面临着两个选项之间的决策:

以下小节提供基于方案的选项的指导。

管理基础结构

如果尚未验证已配置的资源以所需方式在环境中运行,则可能需要导出到状态。

如果确定要使用工作流管理 Terraform terraform init plan apply 中的一组资源,则导出到状态至关重要。

如果还不确定要管理资源,建议传递 --hcl-only 标志。

现有基础结构

在导出到现有 Terraform 环境的情况下,最好将其 --hcl-only 视为 等效的 terraform 计划 ,尤其是在追加到现有环境之前。

terraform apply 命令等同于导出资源 - 在此期间,其配置与预先存在的状态关联。 在此方案中,使用映射文件可节省运行时来列出和映射资源。

发现基础结构

如果不确定环境中存在哪些资源,可以通过指定 --generate-mapping-file 标志进行验证。 有关此主题的详细信息,请参阅 使用 Azure Export for Terraform 浏览自定义资源选择和命名。

限制

适用于 Terraform 的 Azure 导出是一种复杂的工具,用于尝试将 Azure 基础结构转换为 Terraform 代码和状态。 其当前已知限制在以下小节中进行了说明。

仅写入属性

AzureRM 中的某些属性是仅写的,并且不会包含在为 Terraform 创建的 Azure 导出生成的代码中。 通过在导出到 HCL 代码后定义属性来解决该问题。

跨属性约束

AzureRM 提供程序可以设置两个相互冲突的属性。 当 Azure Export for Terraform 读取冲突属性时,尽管用户只配置了一个属性,但它可能会将这两个属性设置为相同的值。 在同一生成的配置中存在多个跨属性约束时,会出现进一步的复杂性。 必须知道配置中存在跨属性冲突的位置,以便缓解此问题。

资源范围外部的基础结构

将 Azure Export for Terraform 用于目标资源范围时,配置所需的资源可能存在于指定的范围之外。 一个示例是角色分配。 用户需要标识超出范围的资源。

仅写入属性

Azure 导出无法在其配置中生成仅写属性(如密码)。你需要了解仅写属性,并在配置中定义它们以创建新的资源集。

修改代码以匹配编码标准

如果用户希望修改其代码以遵守编码标准,则需执行一些必要的操作。 仅当用户计划在非andbox 环境中使用代码时,才需要执行这些步骤。

属性定义的资源

Azure 中的某些资源可以定义为父 Terraform 资源或单个 Terraform 资源中的属性。 一个示例是子网。 适用于 Terraform 的 Azure 导出将资源定义为单个资源,但最佳做法是匹配现有编码配置。

显式依赖关系

Terraform 的 Azure 导出目前只能声明显式依赖项。 必须知道资源之间的关系的映射,以重构代码以包含任何所需的隐式依赖项。

硬编码值

适用于 Terraform 的 Azure 导出当前生成硬编码字符串。 最佳做法是将这些值重构为变量。 此外,使用 --full-properties 标志公开所有属性时,可以在生成的配置中看到某些敏感信息(如机密)。使用建议的做法来保护此代码的可见性。

后续步骤