Итерация переменной в шаблонах ARM
В этой статье показано, как создать более одного значения для переменной в шаблоне Azure Resource Manager (шаблоне ARM). Добавив элемент copy
в раздел Variables вашего шаблона, можно динамически задать число элементов для переменной во время развертывания. Кроме того, не нужно будет повторять синтаксис шаблона.
Можно также использовать цикл копирования для ресурсов, свойств в ресурсе и выходных данных.
Совет
Мы рекомендуем использовать Bicep, так как он предоставляет те же возможности, что и шаблоны ARM, и имеет более простой синтаксис. Дополнительные сведения см. в статье о циклах.
Синтаксис
Элемент копирования имеет следующий общий формат.
"copy": [
{
"name": "<name-of-loop>",
"count": <number-of-iterations>,
"input": <values-for-the-variable>
}
]
Свойство 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 не поддерживают нулевое значение.
Итерация переменной
В следующем примере представлено, как создать массив строковых значений.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"copy": [
{
"name": "stringArray",
"count": "[parameters('itemCount')]",
"input": "[concat('item', copyIndex('stringArray', 1))]"
}
]
},
"resources": [],
"outputs": {
"arrayResult": {
"type": "array",
"value": "[variables('stringArray')]"
}
}
}
Приведенный выше шаблон возвращает массив со следующими значениями:
[
"item1",
"item2",
"item3",
"item4",
"item5"
]
В следующем примере показано, как создать массив объектов с тремя свойствами: name
, diskSizeGB
и diskIndex
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"copy": [
{
"name": "objectArray",
"count": "[parameters('itemCount')]",
"input": {
"name": "[concat('myDataDisk', copyIndex('objectArray', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('objectArray')]"
}
}
]
},
"resources": [],
"outputs": {
"arrayResult": {
"type": "array",
"value": "[variables('objectArray')]"
}
}
}
В представленном выше примере возвращается массив со следующими значениями:
[
{
"name": "myDataDisk1",
"diskSizeGB": "1",
"diskIndex": 0
},
{
"name": "myDataDisk2",
"diskSizeGB": "1",
"diskIndex": 1
},
{
"name": "myDataDisk3",
"diskSizeGB": "1",
"diskIndex": 2
},
{
"name": "myDataDisk4",
"diskSizeGB": "1",
"diskIndex": 3
},
{
"name": "myDataDisk5",
"diskSizeGB": "1",
"diskIndex": 4
}
]
Примечание.
Переменная iteration поддерживает аргумент offset. Смещение должно находиться после имени итерации, например copyIndex('diskNames', 1)
. Если значение смещения (offset) не введено, то для первого экземпляра по умолчанию используется 0.
Внутри переменной можно также использовать элемент copy
. В следующем примере создается объект, имеющий массив в качестве одного из его значений.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"topLevelObject": {
"sampleProperty": "sampleValue",
"copy": [
{
"name": "disks",
"count": "[parameters('itemCount')]",
"input": {
"name": "[concat('myDataDisk', copyIndex('disks', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('disks')]"
}
}
]
}
},
"resources": [],
"outputs": {
"objectResult": {
"type": "object",
"value": "[variables('topLevelObject')]"
}
}
}
В представленном выше примере возвращается объект со следующими значениями.
{
"sampleProperty": "sampleValue",
"disks": [
{
"name": "myDataDisk1",
"diskSizeGB": "1",
"diskIndex": 0
},
{
"name": "myDataDisk2",
"diskSizeGB": "1",
"diskIndex": 1
},
{
"name": "myDataDisk3",
"diskSizeGB": "1",
"diskIndex": 2
},
{
"name": "myDataDisk4",
"diskSizeGB": "1",
"diskIndex": 3
},
{
"name": "myDataDisk5",
"diskSizeGB": "1",
"diskIndex": 4
}
]
}
В следующем примере представлены различные способы использования copy
с переменными.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {
"disk-array-on-object": {
"copy": [
{
"name": "disks",
"count": 5,
"input": {
"name": "[concat('myDataDisk', copyIndex('disks', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('disks')]"
}
},
{
"name": "diskNames",
"count": 5,
"input": "[concat('myDataDisk', copyIndex('diskNames', 1))]"
}
]
},
"copy": [
{
"name": "top-level-object-array",
"count": 5,
"input": {
"name": "[concat('myDataDisk', copyIndex('top-level-object-array', 1))]",
"diskSizeGB": "1",
"diskIndex": "[copyIndex('top-level-object-array')]"
}
},
{
"name": "top-level-string-array",
"count": 5,
"input": "[concat('myDataDisk', copyIndex('top-level-string-array', 1))]"
},
{
"name": "top-level-integer-array",
"count": 5,
"input": "[copyIndex('top-level-integer-array')]"
}
]
},
"resources": [],
"outputs": {
"exampleObject": {
"value": "[variables('disk-array-on-object')]",
"type": "object"
},
"exampleArrayOnObject": {
"value": "[variables('disk-array-on-object').disks]",
"type" : "array"
},
"exampleObjectArray": {
"value": "[variables('top-level-object-array')]",
"type" : "array"
},
"exampleStringArray": {
"value": "[variables('top-level-string-array')]",
"type" : "array"
},
"exampleIntegerArray": {
"value": "[variables('top-level-integer-array')]",
"type" : "array"
}
}
}
Образцы шаблонов
В следующих примерах отображены распространенные сценарии для создания более одного значения для переменной.
Template | Description |
---|---|
Копирование переменных | Демонстрирует разные способы итерации переменных. |
Несколько правил безопасности | Развертывает несколько правил безопасности в группу безопасности сети. Кроме того, этот шаблон создает правила безопасности на основе параметра. Чтобы узнать параметр, см. файл параметров нескольких групп безопасности сети. |
Копирование хранилища с помощью переменных | Пример итерации переменной и создания нескольких учетных записей хранения. |
Следующие шаги
- Ознакомьтесь с учебником Руководство по созданию нескольких экземпляров ресурса с помощью шаблонов ARM.
- Дополнительные сведения об использовании элемента копирования см. в следующих статье:
- Если вы хотите изучить разделы шаблона, ознакомьтесь с разделом Описание структуры и синтаксиса шаблонов ARM.
- Чтобы узнать, как развернуть шаблон, ознакомьтесь с разделом Развертывание ресурсов с помощью шаблонов ARM и Azure PowerShell.