Условное развертывание в шаблонах ARM

Иногда требуется развернуть ресурс в шаблоне Azure Resource Manager (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"
    }
  ]
}

Более сложный пример см. в статье Логический сервер SQL Azure.

Новый или существующий ресурс

Вы можете воспользоваться условным развертыванием, чтобы создать новый ресурс или использовать существующий. В следующем примере показано, как развернуть новую учетную запись хранения либо использовать существующую.

{
  "$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": [
    {
      "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"
    },
    {
      "condition": "[equals(parameters('newOrExisting'), 'existing')]",
      "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 см. по адресу VM with a new or existing Virtual Network, Storage, and Public IP (Виртуальная машина с новой или существующей виртуальной сетью, хранилищем и общедоступным IP-адресом).

Функции времени выполнения

При использовании функции reference или list с ресурсом, который развертывается условно, функция вычисляется, даже если ресурс не развернут. Если функция ссылается на несуществующий ресурс, возникает ошибка.

Используйте функцию if, чтобы убедиться, что функция вычисляется для условий только при развертывании ресурса. Пример шаблона, который использует функции if и reference с условно развертываемым ресурсом, см. в описании функции if.

Вы можете задать ресурс в качестве зависимого от условного ресурса точно так же, как любой другой ресурс. Если условный ресурс не развернут, Azure Resource Manager автоматически удаляет его из числа необходимых зависимостей.

Полный режим

Если вы развертываете шаблон с полным режимом и ресурс не развертывается, так как condition принимает значение false, то результат зависит от того, какая версия REST API используется для развертывания шаблона. Если вы используете версию ниже 2019-05-10, ресурс не удаляется. В версии 2019-05-10 или более поздних версиях ресурс удаляется. В последних версиях Azure PowerShell и Azure CLI ресурс удаляется, когда условие имеет значение false.

Дальнейшие действия