Iteracja zmiennych w szablonach usługi ARM

W tym artykule pokazano, jak utworzyć więcej niż jedną wartość dla zmiennej w szablonie usługi Azure Resource Manager (szablon arm). copy Dodając element do sekcji zmiennych szablonu, można dynamicznie ustawić liczbę elementów zmiennej podczas wdrażania. Należy również unikać powtarzania składni szablonu.

Możesz również użyć kopiowania z zasobami, właściwościami w zasobie i danych wyjściowych.

Porada

Zalecamy Bicep , ponieważ oferuje te same możliwości co szablony usługi ARM, a składnia jest łatwiejsza w użyciu. Aby dowiedzieć się więcej, zobacz pętle.

Składnia

Element copy ma następujący ogólny format:

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

Właściwość name jest dowolną wartością identyfikującą pętlę. Właściwość count określa liczbę iteracji, które chcesz wykonać dla zmiennej.

Właściwość input określa właściwości, które chcesz powtórzyć. Można utworzyć tablicę elementów skonstruowanych na podstawie wartości we input właściwości. Może to być pojedyncza właściwość (na przykład ciąg) lub obiekt z kilkoma właściwościami.

Limity kopiowania

Liczba nie może przekraczać 800.

Liczba nie może być liczbą ujemną. Może to być zero, jeśli wdrożysz szablon z najnowszą wersją interfejsu wiersza polecenia platformy Azure, programu PowerShell lub interfejsu API REST. W szczególności należy użyć:

  • Azure PowerShell 2.6 lub nowszym
  • Interfejs wiersza polecenia platformy Azure w wersji 2.0.74 lub nowszej
  • Interfejs API REST w wersji 2019-05-10 lub nowszej
  • Połączone wdrożenia muszą używać interfejsu API w wersji 2019-05-10 lub nowszej dla typu zasobu wdrożenia

Wcześniejsze wersje programu PowerShell, interfejsu wiersza polecenia i interfejsu API REST nie obsługują zera dla liczby.

Iteracja zmiennej

W poniższym przykładzie pokazano, jak utworzyć tablicę wartości ciągu:

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

Powyższy szablon zwraca tablicę z następującymi wartościami:

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

W następnym przykładzie pokazano, jak utworzyć tablicę obiektów z trzema właściwościami — name, diskSizeGBi 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')]"
    }
  }
}

Powyższy przykład zwraca tablicę z następującymi wartościami:

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

Uwaga

Iteracja zmiennej obsługuje argument przesunięcia. Przesunięcie musi pochodzić po nazwie iteracji, takiej jak copyIndex('diskNames', 1). Jeśli nie podasz wartości przesunięcia, wartość domyślna to 0 dla pierwszego wystąpienia.

Można również użyć copy elementu w zmiennej. Poniższy przykład tworzy obiekt, który ma tablicę jako jedną z jego wartości.

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

Powyższy przykład zwraca obiekt z następującymi wartościami:

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

W następnym przykładzie przedstawiono różne sposoby użycia ze copy zmiennymi.

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

Przykładowe szablony

W poniższych przykładach przedstawiono typowe scenariusze tworzenia więcej niż jednej wartości dla zmiennej.

Template Opis
Kopiowanie zmiennych Demonstruje różne sposoby iterowania zmiennych.
Wiele reguł zabezpieczeń Wdraża kilka reguł zabezpieczeń w sieciowej grupie zabezpieczeń. Tworzy reguły zabezpieczeń z parametru. Aby uzyskać parametr, zobacz wiele plików parametrów sieciowej grupy zabezpieczeń.
Kopiowanie magazynu ze zmiennymi Przykład sposobu iteracji zmiennej i tworzenia wielu kont magazynu.

Następne kroki