Perulangan properti dalam templat ARM

Artikel ini menunjukkan kepada Anda cara membuat lebih dari satu instans properti di templat Azure Resource Manager (templat ARM) Anda. Dengan menambahkan perulangan salin ke bagian properti sumber daya di templat Anda, Anda dapat secara dinamis mengatur jumlah item untuk properti selama penyebaran. Anda juga menghindari keharusan mengulangi sintaksis templat.

Anda hanya dapat menggunakan perulangan salin dengan sumber daya tingkat atas, bahkan saat menerapkan perulangan salin ke properti. Untuk mempelajari tentang mengubah sumber daya anak menjadi sumber daya tingkat teratas, lihat Perulangan untuk sumber daya anak.

Anda juga dapat menggunakan perulangan salinan dengan sumber daya, variabel, dan output.

Tip

Kami merekomendasikan Bicep karena menawarkan kemampuan yang sama dengan templat ARM dan sintaksnya lebih mudah digunakan. Untuk mempelajari selengkapnya, lihat perulangan.

Sintaks

Tambahkan elemen copy ke bagian sumber daya templat Anda untuk mengatur jumlah item untuk properti. Elemen salin memiliki format umum berikut:

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

Untuk name, berikan nama properti sumber daya yang ingin Anda buat.

Properti count menentukan jumlah perulangan yang Anda inginkan untuk properti.

Properti input menentukan properti yang ingin Anda ulangi. Anda membuat array elemen yang dibangun dari nilai dalam input properti.

Batas penyalinan

Jumlahnya tidak bisa melebihi 800.

Hitungannya tidak bisa menjadi angka negatif. Ini bisa nol jika Anda menyebarkan template dengan versi terbaru Azure CLI, PowerShell, atau REST API. Secara khusus, Anda harus menggunakan:

  • Azure PowerShell 2.6 atau yang lebih baru
  • Azure CLI 2.0.74 atau yang lebih baru
  • Rest API versi 2019-05-10 atau lebih tinggi
  • Penerapan tertaut harus menggunakan API versi 2019-05-10 atau yang lebih baru untuk jenis sumber daya penyebaran

Versi PowerShell, CLI, dan REST API yang lebih lama tidak mendukung nol untuk dihitung.

Perulangan properti

Contoh berikut menunjukkan cara menerapkan perulangan salin ke properti dataDisks pada komputer virtual:

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

Perhatikan bahwa saat menggunakan copyIndex di dalam iterasi properti, Anda harus memberikan nama iterasi. Perulangan properti juga mendukung argumen offset. Offset harus muncul setelah nama perulangan, seperti copyIndex('dataDisks', 1).

Templat yang disebarkan menjadi:

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

Operasi salin sangat membantu saat bekerja dengan array karena Anda dapat melakukan perulangan melalui setiap elemen dalam array. Gunakan fungsi panjang pada array untuk menentukan jumlah iterasi, dan copyIndex untuk mengambil indeks saat ini dalam array.

Contoh templat berikut membuat grup kegagalan untuk database yang diteruskan sebagai array.

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

Elemen copy ini adalah array sehingga Anda dapat menentukan lebih dari satu properti untuk sumber daya.

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

Anda dapat menggunakan sumber daya dan iterasi properti bersama-sama. Referensikan perulangan properti berdasarkan nama.

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

Contoh templat

Contoh berikut menunjukkan skenario umum untuk membuat lebih dari satu nilai untuk sebuah properti.

Templat Deskripsi
Penyebaran komputer virtual dengan sejumlah variabel disk data Menyebarkan beberapa disk data dengan komputer virtual.

Langkah berikutnya