Azure 资源管理器部署模式

部署资源时,可以指定部署为增量更新还是完整更新。 这两种模式之间的区别在于资源管理器如何处理资源组中不在模板中的现有资源。

对于这两种模式,资源管理器都会尝试创建模板中指定的所有资源。 如果资源已存在于资源组中且其设置未更改,则不会对该资源执行任何操作。 如果更改资源的属性值,则使用这些新值更新资源。 如果尝试更新现有资源的位置或类型,则部署会失败并出现错误。 请改用所需的位置或类型部署新资源。

默认模式为增量模式。

完整模式

在完整模式下,资源管理器删除资源组中已存在但尚未在模板中指定的资源 。

注意

在完全模式下部署模板之前,请始终使用 what-if 操作。 如果显示哪些资源将被创建、删除或修改。 使用 what-if 以避免意外删除资源。

如果模板包含由于条件的计算结果为 false 而未部署的资源,则结果取决于用于部署模板的 REST API 版本。 如果使用 2019-05-10 之前的版本,则不会删除该资源。 如果使用 2019-05-10 或更高版本,则会删除该资源。 最新版本的 Azure PowerShell 和 Azure CLI 会删除该资源。

将完整模式与复制循环一起使用时要小心。 在解析复制循环后会删除模板中未指定的任何资源。

如果部署到模板中的多个资源组,则可以删除部署操作中指定的资源组中的资源。 辅助资源组中的资源不会被删除。

资源类型处理完整模式删除的方式有所不同。 当父资源不在以完整模式部署的模板中时,将自动删除该资源。 而某些子资源不在模板中时,不会将其自动删除。 但是,如果删除父资源,则会删除这些子资源。

例如,如果资源组包含 DNS 区域(Microsoft.Network/dnsZones 资源类型)和 CNAME 记录(Microsoft.Network/dnsZones/CNAME 资源类型),则 DNS 区域是 CNAME 记录的父资源。 如果使用完整模式部署并且模板中不包含 DNS 区域,则 DNS 区域和 CNAME 记录都将被删除。 如果在模板中包含 DNS 区域但不包含 CNAME 记录,则不会删除 CNAME。

有关资源类型如何处理删除的列表,请参阅针对完全模式部署的 Azure 资源删除

如果资源组被锁定,则完整模式不会删除资源。

注意

仅根级别模板支持完整部署模式。 对于链接模板或嵌套模板,必须使用增量模式。

订阅级别部署不支持完整模式。

目前,门户不支持完整模式。

增量模式

在增量模式下,资源管理器保留资源组中已存在但尚未在模板中指定的未更改资源。 模板中的资源添加到资源组。

重要

在增量模式下重新部署现有资源时,所有属性都将重新应用。 属性不会以增量方式添加。 一个常见的误解是认为未在模板中指定的属性会保持不变。 如果未指定某些属性,资源管理器会将部署解释为覆盖这些值。 未包含在模板中的属性将重置为默认值。 指定资源的所有非默认值,而不仅仅是要更新的属性。 模板中的资源定义始终包含资源的最终状态。 它不能表示对现有资源的部分更新。

警告

在极少数情况下,可以在资源上或其某个子资源上指定属性。 两个常见示例是虚拟网络上的子网和 Web 应用的站点配置值 。 在这些情况下,必须仔细处理增量更新。

对于子网,通过 Microsoft.Network/virtualNetworks 资源上的 subnets 属性指定值。 不要通过子资源 Microsoft.Network/virtualNetworks/subnets 定义值。 只要在虚拟网络上定义了子网,就可以重新部署虚拟网络,而不会丢失子网。

对于站点配置值,这些值会在子资源类型 Microsoft.Web/sites/config 中实现。 如果重新部署 Web 应用并为站点配置值指定了空对象,则子资源不会更新。 但是,如果提供新的站点配置值,则子资源类型会更新。

示例结果

为了说明增量模式和完整模式的差异,请考虑以下方案。

资源组包含:

  • 资源 A
  • 资源 B
  • 资源 C

模板包含:

  • 资源 A
  • 资源 B
  • 资源 D

在“增量”模式下部署时,资源组具有:

  • 资源 A
  • 资源 B
  • 资源 C
  • 资源 D

在“完整”模式下部署时,会删除资源 C。 资源组具有:

  • 资源 A
  • 资源 B
  • 资源 D

设置部署模式

在使用 PowerShell 部署时若要设置部署模式,请使用 Mode 参数。

New-AzResourceGroupDeployment `
  -Mode Complete `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.json

在使用 Azure CLI 部署时若要设置部署模式,请使用 mode 参数。

az deployment group create \
  --mode Complete \
  --name ExampleDeployment \
  --resource-group ExampleResourceGroup \
  --template-file storage.json

以下示例显示了设置为增量部署模式的链接模板:

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2020-10-01",
    "name": "linkedTemplate",
    "properties": {
      "mode": "Incremental",
          <nested-template-or-external-template>
    }
  }
]

后续步骤