ARM şablonlarında özellik yinelemesi

Bu makalede, Azure Resource Manager şablonunuzda (ARM şablonu) bir özelliğin birden fazla örneğini nasıl oluşturacağınız gösterilir. Şablonunuzda bir kaynağın özellikler bölümüne kopyalama döngüsü ekleyerek, dağıtım sırasında bir özelliğin öğe sayısını dinamik olarak ayarlayabilirsiniz. Şablon söz dizimlerini yinelemekten de kaçınabilirsiniz.

Bir özelliğe kopyalama döngüsü uygularken bile kopyalama döngüsünü yalnızca üst düzey kaynaklarla kullanabilirsiniz. Bir alt kaynağı en üst düzey kaynağa dönüştürme hakkında bilgi edinmek için bkz. Alt kaynak için yineleme.

Kopyalama döngüsünü kaynaklar, değişkenler ve çıkışlarla da kullanabilirsiniz.

İpucu

ARM şablonlarıyla aynı özellikleri sunduğundan ve söz diziminin kullanımı daha kolay olduğundan Bicep'i öneririz. Daha fazla bilgi edinmek için bkz. döngüler.

Syntax

Bir özelliğin copy öğe sayısını ayarlamak için öğesini şablonunuzun resources bölümüne ekleyin. copy öğesi aşağıdaki genel biçime sahiptir:

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

için name, oluşturmak istediğiniz kaynak özelliğinin adını belirtin.

özelliği, count özellik için istediğiniz yineleme sayısını belirtir.

input özelliği, yinelemek istediğiniz özellikleri belirtir. özelliğindeki input değerden bir öğe dizisi oluşturursunuz.

Kopyalama sınırları

Sayı 800'ü aşamaz.

Sayı negatif bir sayı olamaz. Şablonu Azure CLI, PowerShell veya REST API'nin son sürümüyle dağıtırsanız sıfır olabilir. Özellikle şunları kullanmanız gerekir:

  • Azure PowerShell 2.6 veya üzeri
  • Azure CLI 2.0.74 veya üzeri
  • REST API sürüm 2019-05-10 veya üzeri
  • Bağlı dağıtımlar, dağıtım kaynak türü için API sürüm 2019-05-10 veya üzerini kullanmalıdır

PowerShell, CLI ve REST API'nin önceki sürümleri sayım için sıfırı desteklemez.

Özellik yinelemesi

Aşağıdaki örnekte, bir sanal makinedeki özelliğe kopyalama döngüsünün dataDisks nasıl uygulanacağı gösterilmektedir:

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

Bir özellik yinelemesinin içinde copyIndex kullanırken yinelemenin adını sağlamanız gerektiğine dikkat edin. Özellik yinelemesi, uzaklık bağımsız değişkenlerini de destekler. Uzaklık yinelemenin adından sonra gelmelidir, örneğin copyIndex('dataDisks', 1).

Dağıtılan şablon şu hale gelir:

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

Dizideki her öğede yineleme yapabileceğinizden, dizilerle çalışırken kopyalama işlemi yararlıdır. Yineleme sayısını belirtmek ve copyIndex dizideki geçerli dizini almak için dizideki length işlevini kullanın.

Aşağıdaki örnek şablon, dizi olarak geçirilen veritabanları için bir yük devretme grubu oluşturur.

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

copy öğesi bir dizi olduğundan kaynak için birden fazla özellik belirtebilirsiniz.

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

Kaynak ve özellik yinelemelerini birlikte kullanabilirsiniz. Ada göre özellik yinelemesine başvurun.

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

Örnek şablonlar

Aşağıdaki örnekte, bir özellik için birden fazla değer oluşturmaya yönelik yaygın bir senaryo gösterilmektedir.

Şablon Açıklama
Değişken sayıda veri diski ile VM dağıtımı Bir sanal makine ile birkaç veri diski dağıtır.

Sonraki adımlar