Delen via


Variabele iteratie in ARM-sjablonen

In dit artikel leest u hoe u meer dan één waarde maakt voor een variabele in uw Azure Resource Manager-sjabloon (ARM-sjabloon). Door het copy element toe te voegen aan de sectie variabelen van uw sjabloon, kunt u het aantal items voor een variabele dynamisch instellen tijdens de implementatie. U voorkomt ook dat u de syntaxis van de sjabloon moet herhalen.

U kunt ook kopiëren gebruiken met resources, eigenschappen in een resource en uitvoer.

Tip

We raden Bicep aan omdat het dezelfde mogelijkheden biedt als ARM-sjablonen en de syntaxis gemakkelijker te gebruiken is. Zie lussen voor meer informatie.

Syntaxis

Het kopieerelement heeft de volgende algemene indeling:

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

De name eigenschap is een waarde die de lus identificeert. De count eigenschap geeft het aantal iteraties op dat u wilt gebruiken voor de variabele.

De input eigenschap geeft de eigenschappen op die u wilt herhalen. U maakt een matrix met elementen die zijn samengesteld op basis van de waarde in de input eigenschap. Het kan één eigenschap zijn (zoals een tekenreeks) of een object met verschillende eigenschappen.

Kopieerlimieten

Het aantal mag niet groter zijn dan 800.

Het aantal kan geen negatief getal zijn. Dit kan nul zijn als u de sjabloon implementeert met een recente versie van Azure CLI, PowerShell of REST API. U moet met name het volgende gebruiken:

  • Azure PowerShell 2.6 of hoger
  • Azure CLI 2.0.74 of hoger
  • REST API-versie 2019-05-10 of hoger
  • Gekoppelde implementaties moeten API-versie 2019-05-10 of hoger gebruiken voor het implementatieresourcetype

Eerdere versies van PowerShell, CLI en de REST API bieden geen ondersteuning voor nul voor het aantal.

Variabele iteratie

In het volgende voorbeeld ziet u hoe u een matrix met tekenreekswaarden maakt:

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

De voorgaande sjabloon retourneert een matrix met de volgende waarden:

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

In het volgende voorbeeld ziet u hoe u een matrix met objecten met drie eigenschappen , namediskSizeGBen 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')]"
    }
  }
}

In het voorgaande voorbeeld wordt een matrix geretourneerd met de volgende waarden:

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

Notitie

Variabele iteratie ondersteunt een offsetargument. De offset moet achter de naam van de iteratie komen, zoals copyIndex('diskNames', 1). Als u geen offsetwaarde opgeeft, wordt deze standaard ingesteld op 0 voor het eerste exemplaar.

U kunt ook het copy element in een variabele gebruiken. In het volgende voorbeeld wordt een object gemaakt dat een matrix als een van de waarden bevat.

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

In het voorgaande voorbeeld wordt een object met de volgende waarden geretourneerd:

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

In het volgende voorbeeld ziet u de verschillende manieren waarop u variabelen kunt gebruiken 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"
    }
  }
}

Voorbeeldsjablonen

In de volgende voorbeelden ziet u veelvoorkomende scenario's voor het maken van meer dan één waarde voor een variabele.

Sjabloon Beschrijving
Variabelen kopiëren Demonstreert de verschillende manieren om variabelen te herhalen.
Meerdere beveiligingsregels Implementeert verschillende beveiligingsregels in een netwerkbeveiligingsgroep. Hiermee worden de beveiligingsregels samengesteld op basis van een parameter. Zie meerdere NSG-parameterbestanden voor de parameter voor de parameter.
Opslag kopiëren met variabelen Voorbeeld van het herhalen van een variabele en het maken van meerdere opslagaccounts.

Volgende stappen