Iterace proměnných v šablonách ARM

V tomto článku se dozvíte, jak vytvořit více než jednu hodnotu pro proměnnou v šabloně Azure Resource Manager (šablona ARM). Přidáním elementu copy do oddílu variables šablony můžete dynamicky nastavit počet položek pro proměnnou během nasazení. Vyhnete se také opakování syntaxe šablony.

Kopírování můžete použít také s prostředky, vlastnostmi v prostředku a výstupy.

Tip

Doporučujeme Bicep , protože nabízí stejné funkce jako šablony ARM a syntaxe se snadněji používá. Další informace najdete v tématu Smyčky.

Syntax

Element copy má následující obecný formát:

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

Vlastnost name je libovolná hodnota, která identifikuje smyčku. Vlastnost count určuje počet iterací, které chcete pro proměnnou použít.

Vlastnost input určuje vlastnosti, které chcete opakovat. Vytvoříte pole prvků vytvořených z hodnoty ve input vlastnosti. Může to být jedna vlastnost (například řetězec) nebo objekt s několika vlastnostmi.

Limity kopírování

Počet nesmí překročit 800.

Počet nemůže být záporné číslo. Pokud šablonu nasadíte pomocí nedávné verze Azure CLI, PowerShellu nebo rozhraní REST API, může být nulová. Konkrétně musíte použít:

  • Azure PowerShell 2.6 nebo novější
  • Azure CLI 2.0.74 nebo novější
  • ROZHRANÍ REST API verze 2019-05-10 nebo novější
  • Propojená nasazení musí pro typ prostředku nasazení používat rozhraní API verze 2019-05-10 nebo novější.

Starší verze PowerShellu, rozhraní příkazového řádku a rozhraní REST API nepodporují nulu pro počet.

Iterace proměnných

Následující příklad ukazuje, jak vytvořit pole řetězcových hodnot:

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

Předchozí šablona vrátí pole s následujícími hodnotami:

[
  "item1",
  "item2",
  "item3",
  "item4",
  "item5"
]

Další příklad ukazuje, jak vytvořit pole objektů se třemi vlastnostmi – name, diskSizeGBa 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')]"
    }
  }
}

Předchozí příklad vrátí matici s následujícími hodnotami:

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

Poznámka

Iterace proměnné podporuje argument posunu. Posun musí pocházet za názvem iterace, například copyIndex('diskNames', 1). Pokud nezadáte hodnotu posunu, pro první instanci se ve výchozím nastavení nastaví hodnota 0.

Můžete také použít copy prvek v proměnné. Následující příklad vytvoří objekt, který má pole jako jednu ze svých hodnot.

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

Předchozí příklad vrátí objekt s následujícími hodnotami:

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

Další příklad ukazuje různé způsoby použití copy s proměnnými.

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

Ukázkové šablony

Následující příklady ukazují běžné scénáře vytvoření více než jedné hodnoty pro proměnnou.

Template (Šablona) Description
Kopírování proměnných Ukazuje různé způsoby iterace proměnných.
Více pravidel zabezpečení Nasadí několik pravidel zabezpečení do skupiny zabezpečení sítě. Vytvoří pravidla zabezpečení z parametru. Parametr najdete v několika souborech parametrů NSG.
Kopírování úložiště s proměnnými Příklad iterace proměnné a vytvoření více účtů úložiště

Další kroky