Egenskapsiteration i ARM-mallar

Den här artikeln visar hur du skapar fler än en instans av en egenskap i din Azure Resource Manager-mall (ARM-mall). Genom att lägga till en kopieringsloop i egenskapsavsnittet för en resurs i mallen kan du dynamiskt ange antalet objekt för en egenskap under distributionen. Du undviker också att behöva upprepa mallsyntaxen.

Du kan bara använda en kopieringsloop med resurser på den översta nivån, även när du tillämpar en kopieringsloop på en egenskap. Mer information om hur du ändrar en underordnad resurs till en resurs på den översta nivån finns i Iteration för en underordnad resurs.

Du kan också använda en kopieringsloop med resurser, variabler och utdata.

Tips

Vi rekommenderar Bicep eftersom det har samma funktioner som ARM-mallar och syntaxen är enklare att använda. Mer information finns i loopar.

Syntax

Lägg till elementet copy i resursavsnittet i mallen för att ange antalet objekt för en egenskap. Copy-elementet har följande allmänna format:

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

För nameanger du namnet på den resursegenskap som du vill skapa.

Egenskapen count anger antalet iterationer som du vill ha för egenskapen.

Egenskapen input anger de egenskaper som du vill upprepa. Du skapar en matris med element som skapats från värdet i input egenskapen .

Kopieringsgränser

Antalet får inte överstiga 800.

Antalet får inte vara ett negativt tal. Det kan vara noll om du distribuerar mallen med en ny version av Azure CLI, PowerShell eller REST API. Mer specifikt måste du använda:

  • Azure PowerShell 2.6 eller senare
  • Azure CLI 2.0.74 eller senare
  • REST API-version 2019-05-10 eller senare
  • Länkade distributioner måste använda API-version 2019-05-10 eller senare för distributionsresurstypen

Tidigare versioner av PowerShell, CLI och REST API stöder inte noll för antal.

Egenskapsiteration

I följande exempel visas hur du tillämpar en kopieringsloop på dataDisks egenskapen på en virtuell dator:

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

Observera att när du använder copyIndex i en egenskapsiteration måste du ange namnet på iterationen. Egenskapsiteration stöder också ett offsetargument. Förskjutningen måste komma efter namnet på iterationen, till exempel copyIndex('dataDisks', 1).

Den distribuerade mallen blir:

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

Kopieringsåtgärden är användbar när du arbetar med matriser eftersom du kan iterera genom varje element i matrisen. Använd funktionen length i matrisen för att ange antalet iterationer och copyIndex för att hämta det aktuella indexet i matrisen.

I följande exempelmall skapas en redundansgrupp för databaser som skickas som en matris.

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

Elementet copy är en matris så att du kan ange mer än en egenskap för resursen.

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

Du kan använda resurs- och egenskapsiterationer tillsammans. Referera till egenskapsiterationen efter namn.

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

Exempelmallar

I följande exempel visas ett vanligt scenario för att skapa fler än ett värde för en egenskap.

Mall Beskrivning
VM-distribution med ett variabelt antal datadiskar Distribuerar flera datadiskar med en virtuell dator.

Nästa steg