Eigenschapsiteratie in ARM-sjablonen

In dit artikel wordt beschreven hoe u meer dan één exemplaar van een eigenschap maakt in uw ARM-sjabloon (Azure Resource Manager). Door een kopieerlus toe te voegen aan de sectie Eigenschappen van een resource in uw sjabloon, kunt u het aantal items voor een eigenschap tijdens de implementatie dynamisch instellen. U voorkomt ook dat u de syntaxis van de sjabloon moet herhalen.

U kunt alleen de kopieerlus gebruiken met resources op het hoogste niveau, zelfs wanneer u een kopieerlus toepast op een eigenschap. Zie Iteratie voor een onderliggende resource voor meer informatie over het wijzigen van een onderliggende resource in een resource op het hoogste niveau.

U kunt ook de kopieerlus gebruiken met resources, variabelen en uitvoer.

Tip

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

Syntax

Voeg het copy element toe aan de sectie resources van uw sjabloon om het aantal items voor een eigenschap in te stellen. Het copy-element heeft de volgende algemene indeling:

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

Geef voor namede naam op van de resource-eigenschap die u wilt maken.

De count eigenschap geeft het aantal iteraties op dat u wilt gebruiken voor de eigenschap.

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.

Kopieerlimieten

Het aantal mag niet groter zijn dan 800.

Het aantal mag 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 aantal.

Iteratie van eigenschap

In het volgende voorbeeld ziet u hoe u een kopieerlus toepast op de dataDisks eigenschap op een virtuele machine:

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

Wanneer u copyIndex gebruikt in een eigenschaps iteratie, moet u de naam van de iteratie opgeven. Eigenschap iteratie ondersteunt ook een offsetargument. De offset moet achter de naam van de iteratie komen, zoals copyIndex('dataDisks', 1).

De geïmplementeerde sjabloon wordt:

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

De kopieerbewerking is handig bij het werken met matrices, omdat u elk element in de matrix kunt herhalen. Gebruik de functie lengte in de matrix om het aantal iteraties op te geven en copyIndex om de huidige index in de matrix op te halen.

Met de volgende voorbeeldsjabloon wordt een failovergroep gemaakt voor databases die worden doorgegeven als een matrix.

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

Het copy element is een matrix, zodat u meer dan één eigenschap voor de resource kunt opgeven.

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

U kunt iteraties van resources en eigenschappen samen gebruiken. Verwijs naar de iteratie van de eigenschap op naam.

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

Voorbeeldsjablonen

In het volgende voorbeeld ziet u een veelvoorkomend scenario voor het maken van meer dan één waarde voor een eigenschap.

Template Beschrijving
VM-implementatie met een variabel aantal gegevensschijven Implementeert verschillende gegevensschijven met een virtuele machine.

Volgende stappen