Итерация свойств в шаблонах ARM

В этой статье показано, как создать несколько экземпляров свойства в шаблоне Azure Resource Manager (шаблоне ARM). Добавив цикл копирования в раздел свойств ресурса в шаблоне, можно динамически задавать количество элементов для свойства во время развертывания. Кроме того, не нужно будет повторять синтаксис шаблона.

Цикл копирования можно использовать только для ресурсов верхнего уровня, даже при применении цикла копирования к свойству. Сведения о том, как изменить дочерний ресурс на ресурс верхнего уровня, см. в разделе Итерация для дочернего ресурса.

Можно также использовать цикл копирования для свойств, переменных и выходных данных.

Совет

Мы рекомендуем использовать Bicep, так как он предоставляет те же возможности, что и шаблоны ARM, и имеет более простой синтаксис. Дополнительные сведения см. в статье о циклах.

Синтаксис

Добавьте элемент copy в раздел ресурсов шаблона, чтобы задать число элементов для свойства. Элемент копирования имеет следующий общий формат:

"copy": [
  {
    "name": "<name-of-property>",
    "count": <number-of-iterations>,
    "input": <values-for-the-property>
  }
]

Для параметра name укажите имя свойства ресурса, которое необходимо создать.

Свойство count определяет количество итераций, которое требуется выполнить для свойства.

Свойство input задает те свойства, которые необходимо повторить. Вы создадите массив элементов на основе значения в свойстве input.

Ограничения копирования

Количество не может превышать 800.

Количество не может быть отрицательным. Оно может быть равно нулю, если вы развертываете шаблон с помощью последней версии Azure CLI, PowerShell или REST API. В частности, необходимо использовать:

  • Azure PowerShell версии 2.6 или более поздней;
  • Azure CLI версии 2.0.74 или более поздней;
  • REST API версии 2019-05-10 или более поздней.
  • Связанные развертывания должны использовать API версии 2019-05-10 или более поздней для типа ресурса развертывания

Более ранние версии PowerShell, CLI и REST API не поддерживают нулевое значение.

Итерация свойства

В следующем примере показано, как применить цикл копирования к свойству dataDisks на виртуальной машине:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "numberOfDataDisks": {
      "type": "int",
      "minValue": 0,
      "maxValue": 16,
      "defaultValue": 3,
      "metadata": {
        "description": "The number of dataDisks to create."
      }
    },
    ...
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      ...
      "properties": {
        "storageProfile": {
          ...
          "copy": [
            {
              "name": "dataDisks",
              "count": "[parameters('numberOfDataDisks')]",
              "input": {
                "lun": "[copyIndex('dataDisks')]",
                "createOption": "Empty",
                "diskSizeGB": 1023
              }
            }
          ]
        }
        ...
      }
    }
  ]
}

Обратите внимание, что при использовании copyIndex в итерации свойства, необходимо указать имя итерации. Итерация свойства также поддерживает аргумент смещения (offset). Смещение должно находиться после имени итерации, например copyIndex('dataDisks', 1).

Развернутый шаблон выглядит так:

{
  "name": "examplevm",
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2020-06-01",
  "properties": {
    "storageProfile": {
      "dataDisks": [
        {
          "lun": 0,
          "createOption": "Empty",
          "diskSizeGB": 1023
        },
        {
          "lun": 1,
          "createOption": "Empty",
          "diskSizeGB": 1023
        },
        {
          "lun": 2,
          "createOption": "Empty",
          "diskSizeGB": 1023
        }
      ],
      ...

Операция копирования удобна при работе с массивами, так как позволяет выполнить итерацию по каждому элементу в массиве. Используйте функцию length в массиве, чтобы указать число итераций, а также функцию copyIndex для получения текущего индекса в массиве.

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "primaryServerName": {
      "type": "string"
    },
    "secondaryServerName": {
      "type": "string"
    },
    "databaseNames": {
      "type": "array",
      "defaultValue": [
        "mydb1",
        "mydb2",
        "mydb3"
      ]
    }
  },
  "variables": {
    "failoverName": "[format('{0}/{1}failovergroups', parameters('primaryServerName'), parameters('primaryServerName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers/failoverGroups",
      "apiVersion": "2015-05-01-preview",
      "name": "[variables('failoverName')]",
      "properties": {
        "readWriteEndpoint": {
          "failoverPolicy": "Automatic",
          "failoverWithDataLossGracePeriodMinutes": 60
        },
        "readOnlyEndpoint": {
          "failoverPolicy": "Disabled"
        },
        "partnerServers": [
          {
            "id": "[resourceId('Microsoft.Sql/servers', parameters('secondaryServerName'))]"
          }
        ],
        "copy": [
          {
            "name": "databases",
            "count": "[length(parameters('databaseNames'))]",
            "input": "[resourceId('Microsoft.Sql/servers/databases', parameters('primaryServerName'), parameters('databaseNames')[copyIndex('databases')])]"
          }
        ]
      }
    }
  ],
  "outputs": {
  }
}

Элемент copy представляет собой массив, поэтому вы можете указать несколько свойств для ресурса.

{
  "type": "Microsoft.Network/loadBalancers",
  "apiVersion": "2017-10-01",
  "name": "exampleLB",
  "properties": {
    "copy": [
      {
        "name": "loadBalancingRules",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      },
      {
        "name": "probes",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      }
    ]
  }
}

Вы можете совместно использовать итерации свойства и ресурса. Обращайтесь к итерации свойства по имени.

{
  "type": "Microsoft.Network/virtualNetworks",
  "apiVersion": "2018-04-01",
  "name": "[format('{0}{1}', parameters('vnetname'), copyIndex())]",
  "copy":{
    "count": 2,
    "name": "vnetloop"
  },
  "location": "[resourceGroup().location]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[parameters('addressPrefix')]"
      ]
    },
    "copy": [
      {
        "name": "subnets",
        "count": 2,
        "input": {
          "name": "[format('subnet-{0}', copyIndex('subnets'))]",
          "properties": {
            "addressPrefix": "[variables('subnetAddressPrefix')[copyIndex('subnets')]]"
          }
        }
      }
    ]
  }
}

Образцы шаблонов

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

Шаблон Описание
Развертывание виртуальной машины с переменным количеством дисков данных Развертывает несколько дисков данных с виртуальной машиной.

Дальнейшие шаги