Dela via


Egenskaps iteration i ARM-mallar

Den här artikeln visar hur du skapar mer ä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 kan också undvika 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.

Dricks

Vi rekommenderar Bicep eftersom det erbjuder 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. Kopieringselementet 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 egenskapen input .

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.

Iteration av egenskap

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 egenskaps-iteration måste du ange namnet på iterationen. Egenskaps iteration 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 längdfunktionen 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 egenskaps-iterationer tillsammans. Referera till egenskaps-iterationen 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 mer än ett värde för en egenskap.

Mall beskrivning
Distribution av virtuella datorer med ett variabelt antal datadiskar Distribuerar flera datadiskar med en virtuell dator.

Nästa steg