Aracılığıyla paylaş


ARM şablonlarında özellik yinelemesi

Bu makalede, Azure Resource Manager şablonunuzda (ARM şablonu) bir özelliğin birden fazla örneğinin nasıl oluşturulacağı gösterilmektedir. Ş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. Alt kaynağı en üst düzey kaynağa dönüştürme hakkında bilgi edinmek için bkz . Alt kaynak yinelemesi.

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.

Sözdizimi

Bir özelliğin copy öğe sayısını ayarlamak için öğesini şablonunuzun kaynaklar 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 özelliği için istediğiniz yineleme sayısını belirtir.

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

Sınırları kopyalama

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 sayma için sıfırı desteklemez.

Özellik yinelemesi

Aşağıdaki örnekte, 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 yinelemesinde copyIndex kullanırken yinelemenin adını sağlamanız gerektiğine dikkat edin. Özellik yinelemesi ayrıca 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 şöyle olur:

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

Dizilerdeki 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 içeren VM dağıtımı Bir sanal makine ile çeşitli veri diskleri dağıtır.

Sonraki adımlar