Variabel iteration i ARM-mallar

Den här artikeln visar hur du skapar fler än ett värde för en variabel i din Azure Resource Manager-mall (ARM-mall). Genom att lägga till elementet copy i variabelavsnittet i mallen kan du dynamiskt ange antalet objekt för en variabel under distributionen. Du kan också undvika att behöva upprepa mallsyntaxen.

Du kan också använda kopiera med resurser, egenskaper i en resurs 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

Kopieringselementet har följande allmänna format:

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

Egenskapen name är ett värde som identifierar loopen. Egenskapen count anger hur många iterationer du vill ha för variabeln.

Egenskapen input anger de egenskaper som du vill upprepa. Du skapar en matris med element som skapats från värdet i egenskapen input . Det kan vara en enskild egenskap (t.ex. en sträng) eller ett objekt med flera egenskaper.

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.

Variabel iteration

I följande exempel visas hur du skapar en matris med strängvärden:

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

Föregående mall returnerar en matris med följande värden:

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

I nästa exempel visas hur du skapar en matris med objekt med tre egenskaper - name, diskSizeGBoch 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')]"
    }
  }
}

Föregående exempel returnerar en matris med följande värden:

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

Kommentar

Variabel iteration stöder ett offsetargument. Förskjutningen måste komma efter namnet på iterationen, till exempel copyIndex('diskNames', 1). Om du inte anger ett förskjutningsvärde är standardvärdet 0 för den första instansen.

Du kan också använda elementet copy i en variabel. I följande exempel skapas ett objekt som har en matris som ett av dess värden.

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

Föregående exempel returnerar ett objekt med följande värden:

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

I nästa exempel visas de olika sätt som du kan använda copy med variabler.

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

Exempelmallar

I följande exempel visas vanliga scenarier för att skapa fler än ett värde för en variabel.

Mall beskrivning
Kopiera variabler Visar de olika sätten att iterera på variabler.
Flera säkerhetsregler Distribuerar flera säkerhetsregler till en nätverkssäkerhetsgrupp. Den konstruerar säkerhetsreglerna från en parameter. Parametern finns i flera NSG-parameterfiler.
Kopiera lagring med variabler Exempel på hur du itererar en variabel och skapar flera lagringskonton.

Nästa steg