适用于 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_machine的 Terraform 资源类型,azurerm_linux_virtual_machine.test
而test
引用配置文件中使用的虚拟机的名称。
若要查看所选资源的可用资源类型,请按 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
标志公开所有属性时,可以在生成的配置中看到某些敏感信息(如机密)。使用建议的做法来保护此代码的可见性。