使用 Azure PowerShell 导出模板

为了帮助创建 Azure 资源管理器模板,可以从现有的资源导出模板。 导出的模板可帮助你了解用于部署资源的 JSON 语法和属性。 若要自动完成将来的部署,可从导出的模板着手,根据具体的方案修改此模板。 导出模板过程会尝试创建可用的模板。 但是,大多数导出的模板需要进行一些修改才能用于部署 Azure 资源。

在资源管理器中,可以选择一个或多个要导出到模板的资源。 你可以完全专注于模板中所需的资源。

本文介绍如何通过 Azure PowerShell 导出模板。 有关其他选项,请参阅:

选择适当的导出选项

可以通过两种方式来导出模板:

  • 从资源组或资源导出。 此选项基于现有的资源生成新模板。 导出的模板是资源组当前状态的“快照”。 可以导出整个资源组,或该资源组中的特定资源。

  • 从历史记录中保存。 此选项检索用于部署的确切模板副本。 从部署历史记录中指定部署。

根据所选的选项,导出的模板具有不同的质量。

从资源组或资源 从历史记录
模板是自动生成的。 在部署代码之前,你可能要对其进行改进。 模板是模板作者创建的模板的精确副本。 无需任何更改即可重新部署。
模板是资源当前状态的快照。 其中包含你在部署之后所做的任何手动更改。 模板仅显示资源在部署时的状态。 不包含部署之后所做的任何手动更改。
可以从资源组中选择要导出的资源。 包含特定部署的所有资源。 不能选取其中的一部分资源,或者包含在不同时间添加的资源。
模板包含资源的所有属性,包括部署过程中通常不会设置的某些属性。 在重复使用模板之前,你可能需要删除或清理这些属性。 模板仅包含部署所需的属性。 模板更稀疏且更易于阅读。
模板可能不包含重复使用它所需的所有参数。 大多数属性值在模板中已硬编码。 若要在其他环境中重新部署模板,需要添加参数,以提高配置资源的能力。 可以取消选择“包括参数”,这样就可以创作自己的参数 。 模板包含一些参数以方便在不同的环境中重新部署。

在以下情况下,请从资源组或资源导出模板:

  • 需要捕获在原始部署之后对资源所做的更改。
  • 想要选择要导出的资源。
  • 资源不是使用模板创建的。

执行以下操作时,从历史记录中导出模板:

  • 想要一个易于重复使用的模板。
  • 不需要包含原始部署之后所做的更改。

限制

导出不一定成功。 导出不是将预先存在的资源转换为可在生产中使用的模板的可靠方法。 最好使用手写的 Bicep 文件ARM 模板terraform 从头开始创建资源。

从资源组或资源进行导出时,将通过每种资源类型的已发布架构生成导出的模板。 有时,架构没有资源类型的最新版本。 检查导出的模板,确保其包含所需的属性。 如有必要,请编辑导出的模板,以使用所需的 API 版本。

导出的模板中可能缺少某些密码参数。 需要检查模板参考,并手动添加这些参数,然后才能使用模板部署资源。

导出模板功能不支持导出 Azure 数据工厂资源。 若要了解如何导出数据工厂资源,请参阅在 Azure 数据工厂中复制或克隆数据工厂

若要导出通过经典部署模型创建的资源,必须将其迁移到资源管理器部署模型

如果在导出模板时收到警告,指示未导出某个资源类型,则仍然可以发现该资源的属性。 还可以查看该资源类型的 Azure REST API

为其创建导出模板的资源组中存在 200 个资源的限制。 如果尝试导出超过 200 个资源的资源组,则会显示“Export template is not supported for resource groups more than 200 resources”错误消息。

从资源组导出模板

设置资源组后,可以导出资源组的 Azure 资源管理器模板。

若要导出资源组中的所有资源,请使用 Export-AzResourceGroup cmdlet 并提供资源组名称。

Export-AzResourceGroup -ResourceGroupName demoGroup

它将模板另存为本地文件。

可以选择要导出的资源,而不是导出资源组中的所有资源。

若要导出一个资源,请传递该资源 ID。

$resource = Get-AzResource `
  -ResourceGroupName <resource-group-name> `
  -ResourceName <resource-name> `
  -ResourceType <resource-type>
Export-AzResourceGroup `
  -ResourceGroupName <resource-group-name> `
  -Resource $resource.ResourceId

若要导出多个资源,请在数组中传递资源 ID。

Export-AzResourceGroup `
  -ResourceGroupName <resource-group-name> `
  -Resource @($resource1.ResourceId, $resource2.ResourceId)

导出模板时,可以指定是否在模板中使用参数。 默认情况下,包含资源名称的参数,但它们没有默认值。

"parameters": {
  "serverfarms_demoHostPlan_name": {
    "type": "String"
  },
  "sites_webSite3bwt23ktvdo36_name": {
    "type": "String"
  }
}

如果在导出模板时使用 -SkipResourceNameParameterization 参数,则模板中不包括资源名称的参数。 而是,资源名称直接在资源上设置为其当前值。 无法在部署过程中自定义该名称。

"resources": [
  {
    "type": "Microsoft.Web/serverfarms",
    "apiVersion": "2022-09-01",
    "name": "demoHostPlan",
    ...
  }
]

如果在导出模板时使用 -IncludeParameterDefaultValue 参数,则模板参数包括设置为当前值的默认值。 可以使用该默认值,也可以通过传入不同的值来覆盖默认值。

"parameters": {
  "serverfarms_demoHostPlan_name": {
    "defaultValue": "demoHostPlan",
    "type": "String"
  },
  "sites_webSite3bwt23ktvdo36_name": {
    "defaultValue": "webSite3bwt23ktvdo36",
    "type": "String"
  }
}

从部署历史记录保存模板

可以将部署中的模板保存到部署历史记录中。 获取的模板正是用于部署的模板。

若要从资源组部署获取模板,请使用 Save-AzResourceGroupDeploymentTemplate cmdlet。 指定要检索的部署的名称。 有关获取部署名称的帮助,请参阅使用 Azure 资源管理器查看部署历史记录

Save-AzResourceGroupDeploymentTemplate -ResourceGroupName demoGroup -DeploymentName demoDeployment

模板使用部署的名称保存为本地文件。

若要在其他级别部署模板,请使用:

后续步骤