Delen via


Iteratie van eigenschappen in ARM-sjablonen

In dit artikel leest u 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 eigenschappensectie van een resource in uw sjabloon, kunt u het aantal items voor een eigenschap dynamisch instellen tijdens de implementatie. U voorkomt ook dat u de syntaxis van de sjabloon moet herhalen.

U kunt alleen een 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 een kopieerlus gebruiken met resources, variabelen 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

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

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

Geef 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 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.

Iteratie van eigenschappen

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 binnen een eigenschapsiteratie gebruikt, moet u de naam van de iteratie opgeven. Iteratie van eigenschappen 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 wanneer u met matrices werkt, omdat u elk element in de matrix kunt herhalen. Gebruik de lengtefunctie 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 als matrix worden doorgegeven.

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

Sjabloon Beschrijving
VM-implementatie met een variabel aantal gegevensschijven Hiermee worden verschillende gegevensschijven met een virtuele machine geïmplementeerd.

Volgende stappen