使用 ARM 模板进行条件部署

有时,需要选择在 Azure 资源管理器模板(ARM 模板)中部署资源。 使用 condition 元素指定是否部署资源。 条件的值解析为 true 或 false。 如果值为 true,则创建了该资源。 如果值为 false,则未创建该资源。 值只能应用到整个资源。

注意

条件部署不会级联到子资源。 如果要有条件地部署资源及其子资源,需要对每种资源类型应用相同的条件。

提示

我们建议使用 Bicep,因为它提供与 ARM 模板相同的功能,并且该语法更易于使用。 若要了解详细信息,请参阅条件部署

部署条件

你可以传入一个指示是否部署资源的参数值。 以下示例按条件部署 DNS 区域。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "deployZone": {
      "type": "bool"
    }
  },
  "functions": [],
  "resources": [
    {
      "condition": "[parameters('deployZone')]",
      "type": "Microsoft.Network/dnsZones",
      "apiVersion": "2018-05-01",
      "name": "myZone",
      "location": "global"
    }
  ]
}

如需查看更复杂的示例,请参阅 Azure SQL 逻辑服务器

新资源或现有资源

可以使用条件部署来创建新资源或使用现有资源。 以下示例演示如何部署新的存储帐户或使用现有存储帐户。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "newOrExisting": {
      "type": "string",
      "defaultValue": "new",
      "allowedValues": [
        "new",
        "existing"
      ]
    }
  },
  "resources": {
    "saNew": {
      "condition": "[equals(parameters('newOrExisting'), 'new')]",
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
    },
    "saExisting": {
      "condition": "[equals(parameters('newOrExisting'), 'existing')]",
      "existing": true,
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]"
    }
  },
  "outputs": {
    "storageAccountId": {
      "type": "string",
      "value": "[if(equals(parameters('newOrExisting'), 'new'), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]"
    }
  }
}

当参数 newOrExisting 设置为 new 时,条件的计算结果为 true。 将部署存储帐户。 否则会使用现有的存储帐户。

有关使用 condition 元素的完整示例模板,请参阅具有新的或现有虚拟网络、存储和公共 IP 的 VM

运行时函数

如果对条件性部署的资源使用 referencelist 函数,则会对该函数进行评估,即使资源尚未部署。 如果该函数引用某个不存在的资源,则会出现错误。

请使用 if 函数,以确保仅当资源已部署时,才根据条件评估函数。 请查看示例模板的 if 函数,该模板将 ifreference 用于进行条件部署的资源。

将资源设置为依赖于条件资源,这与设置任何其他资源完全一样。 条件资源未部署时,Azure 资源管理器会自动将其从所需依赖项中删除。

完整模式

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

后续步骤