Поделиться через


Итерация переменных в шаблонах ARM

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

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

Подсказка

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

Синтаксис

Элемент copy имеет следующий общий формат:

"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и diskSizeGBdiskIndex.

{
  "$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
  }
]

Замечание

Итерация переменных поддерживает аргумент смещения. Смещение должно следовать после имени итерации, например copyIndex('diskNames', 1). Если вы не предоставляете значение смещения, оно по умолчанию равно 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"
    }
  }
}

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

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

Шаблон Описание
Копирование переменных Демонстрирует различные способы итерации переменных.
Несколько правил безопасности Развертывает несколько правил безопасности в группе безопасности сети. Он создает правила безопасности из параметра. Для параметра см. файл параметров NSG с несколькими параметрами.
Копирование хранилища с переменными Пример итерации переменной и создания нескольких учетных записей хранения.

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