使用适用于 Terraform 的 Azure 导出自定义资源选择和命名

适用于 Terraform 的 Azure 导出提供了各种选项来自定义导出哪些资源。

在本文中,你将了解每种选项的优缺点。

  • 使用 UI
  • 使用查询模式
  • 使用映射文件

使用用户界面

在交互模式下运行适用于 Terraform 的 Azure 导出时,将显示指定的资源(通过运行时指定的参数)。 默认情况下,所有资源都会导出。

删除可作为跳过或包含资源的切换。 若要从导出中删除资源,请使用箭头键选择所需的资源,然后按删除。 资源将更新为显示“跳过”。

若要撤消跳过操作,请验证跳过的资源是否已选中,并再次按删除

优点

  • 需要使用单个切换键。
  • 在运行命令之前,不需要知道所需的资源。

缺点

  • 如果有许多资源要滚动并跳过,那么操作可能会很耗时。

使用查询模式

当你确切地知道需要什么筛选器时,使用 Azure Resource Graph查询语法应用筛选器是一种强大的技术。

aztfexport query [option] <ARG_where_predicate>

例如,假设你有一个名为 myResourceGroup 的资源组,其中包含许多资源,包括一个网络资源。 如果只想导出网络资源,可以使用以下语法:

aztfexport query -n "resourceGroup =~ 'myResourceGroup' and type contains 'Microsoft.Network'"

优点:

  • 单一命令,无需手动编辑。
  • 支持无限数量的筛选器。
  • 高效处理大量资源。

缺点:

  • 易于排除需要导出的资源。
  • 需要了解 Azure Resource Graph 语法。

使用映射文件

以下语法显示了导出资源映射文件中定义的一组资源的基础知识:

aztfexport mapping-file [option] <resource_mapping_file>

可以在交互式模式或非交互模式下使用映射文件:

  • 交互模式:在资源列表视图中以交互方式运行时,按 s
  • 非交互模式:通过添加 --generate-mapping-file 标志,可以在所有导出命令(resourceresource-groupquerymapping file)中生成映射文件。

如果用例需要在导出前进行修改,可以手动构建或编辑映射文件。 以下是一些你想要手动编辑自己的映射文件的示例:

用例 步骤
资源组中有许多资源,但只需要导出少数资源。 在导出之前,从选择的编辑器中删除 JSON 对象并保存文件。
你希望以一致的方式重命名所有资源。 resource-name 属性更改为符合公司合规标准的任何名称。
需要根据资源类型(如网络或计算)重构一组资源。 使用编辑器查找所有 Microsoft.NetworkMicrosoft.Compute 资源。

例如,假设针对包含虚拟机的资源组运行以下命令:

aztfexport rg --generate-mapping-file --non-interactive myResourceGroup

结果类似于以下 JSON 文件:

{
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux",
		"resource_type": "azurerm_virtual_machine_extension",
		"resource_name": "res-0"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup",
		"resource_type": "azurerm_resource_group",
		"resource_name": "res-1"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key",
		"resource_type": "azurerm_ssh_public_key",
		"resource_name": "res-2"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup",
		"resource_type": "azurerm_linux_virtual_machine",
		"resource_name": "res-3"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146",
		"resource_type": "azurerm_network_interface",
		"resource_name": "res-4"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146/networkSecurityGroups/L3N1YnNjcmlwdGlvbnMvZGJmM2I2Y2ItYzFkMC00ZDA0LTk0YjktNTE1MDliOGQzM2ZkL3Jlc291cmNlR3JvdXBzL2hhc2hpY29uZi12bS1kZW1vL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9uZXR3b3JrU2VjdXJpdHlHcm91cHMvdm0taGFzaGljb25mLXZtLWRlbW8tbnNn": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146|/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg",
		"resource_type": "azurerm_network_interface_security_group_association",
		"resource_name": "res-5"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg",
		"resource_type": "azurerm_network_security_group",
		"resource_name": "res-6"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip",
		"resource_type": "azurerm_public_ip",
		"resource_name": "res-7"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet",
		"resource_type": "azurerm_virtual_network",
		"resource_name": "res-8"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default",
		"resource_type": "azurerm_subnet",
		"resource_name": "res-9"
	}
}

只有映射文件中的对象值具有意义。 密钥(默认为 Azure resource_id)在此模式下只是一个标识符。

现在,假设我们要保留资源组和任何与计算相关的资源,并修改 resource_name 值。

我们可以按如下方式更新映射文件:

{
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup",
		"resource_type": "azurerm_resource_group",
		"resource_name": "myResourceGroup"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
		"resource_type": "azurerm_linux_virtual_machine",
		"resource_name": "myVM"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey",
		"resource_type": "azurerm_ssh_public_key",
		"resource_name": "myKey"
	},
	"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux": {
		"resource_id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux",
		"resource_type": "azurerm_virtual_machine_extension",
		"resource_name": "myVMExtension"
	}
}

编辑映射文件后,使用以下命令导出映射文件:

aztfexport map -n "aztfexportResourceMapping.json"

优点

  • 由于正在编辑文件,因此可以使用编辑器查找和替换删除或编辑所需的内容。
  • JSON 输出支持独特的功能,例如脚本筛选。
  • 可以重命名资源以符合命名标准。
  • 可以将 JSON 重构为多个映射文件。
  • 妥善处理大量资源。

缺点

  • 对于简单方案,此方法可能是多余的。
  • 需要手动修改。

使用 Terraform 导入块

当与 Terraform v1.5 或更高版本一起运行aztfexportv0.13或更高时,--generate-import-block该命令将生成一个映射文件以及一个import.tf文件。 import.tf 文件包括每个资源 aztfexport 能够映射的导入块。 从这一点来看,配置的行为与先前存在的导入块工作流相同。 若要完成,请运行 terraform plan

然后,若要从生成的导出中删除或筛选资源,可以删除包含资源的 ID 和其他信息的块。

比较导入块和 Azure 导出

一个常见问题是使用适用于 Terraform 的 Azure 导出和导入块之间的差异。 我们注意到的两个工具的优点包括:

  • 适用于 Terraform 的 Azure 导出有助于资源发现。 有多种方法可用于帮助发现和导出所需的资源。
  • 适用于 Terraform 的 Azure 导出提供资源筛选,也可以通过手动和自动方式进行。
  • 适用于 Terraform 的 Azure 导出自动生成导入块及其输出,节省了创作过程中的时间和精力。
  • Terraform 中本机支持 Terraform 导入块,这使得它们易于使用。 结合在一起,我们相信两者的使用将为你带来巨大的好处。

优点

  • 本机 Terraform 支持的工作流。 不需要 JSON。
  • 由于正在编辑文件,因此可以使用编辑器查找和替换删除或编辑所需的内容。
  • 可以重命名资源以符合命名标准。
  • 妥善处理大量资源。

缺点

  • 对于简单方案,此方法可能是多余的。
  • 需要手动修改才能筛选。
  • 不适用于旧版 Terraform。

总结

本文介绍了使用适用于 Terraform 的 Azure 导出时筛选资源的各种选项。

后续步骤