Iteracja właściwości w szablonach usługi ARM

W tym artykule pokazano, jak utworzyć więcej niż jedno wystąpienie właściwości w szablonie usługi Azure Resource Manager (szablon arm). Dodając pętlę kopiowania do sekcji właściwości zasobu w szablonie, można dynamicznie ustawić liczbę elementów dla właściwości podczas wdrażania. Należy również unikać powtarzania składni szablonu.

Pętlę kopiowania można używać tylko z zasobami najwyższego poziomu, nawet w przypadku stosowania pętli kopiowania do właściwości. Aby dowiedzieć się więcej o zmianie zasobu podrzędnego na zasób najwyższego poziomu, zobacz Iteracja zasobu podrzędnego.

Możesz również użyć pętli kopiowania z zasobami, zmiennymi i danymi wyjściowymi.

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

copy Dodaj element do sekcji resources szablonu, aby ustawić liczbę elementów dla właściwości. Element copy ma następujący ogólny format:

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

W polu namepodaj nazwę właściwości zasobu, którą chcesz utworzyć.

Właściwość count określa liczbę iteracji, które chcesz wykonać dla właściwości.

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.

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 właściwości

W poniższym przykładzie pokazano, jak zastosować pętlę kopiowania dataDisks do właściwości na maszynie wirtualnej:

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

Zwróć uwagę, że w przypadku korzystania z funkcji copyIndex wewnątrz iteracji właściwości należy podać nazwę iteracji. Iteracja właściwości obsługuje również argument przesunięcia. Przesunięcie musi pochodzić po nazwie iteracji, takiej jak copyIndex('dataDisks', 1).

Wdrożony szablon staje się:

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

Operacja kopiowania jest przydatna podczas pracy z tablicami, ponieważ można iterować poszczególne elementy w tablicy. Użyj funkcji length w tablicy, aby określić liczbę iteracji i copyIndex pobrać bieżący indeks w tablicy.

Poniższy przykładowy szablon tworzy grupę trybu failover dla baz danych, które są przekazywane jako tablica.

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

Element copy jest tablicą, dzięki czemu można określić więcej niż jedną właściwość zasobu.

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

Iteracji zasobów i właściwości można używać razem. Odwołuje się do iteracji właściwości według nazwy.

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

Przykładowe szablony

W poniższym przykładzie przedstawiono typowy scenariusz tworzenia więcej niż jednej wartości dla właściwości.

Template Opis
Wdrażanie maszyny wirtualnej ze zmienną liczbą dysków danych Wdraża kilka dysków danych za pomocą maszyny wirtualnej.

Następne kroki