ARM şablonlarında kaynak yinelemesi

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

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

Bir kaynağın dağıtılıp dağıtılmayacağını belirtmeniz gerekiyorsa bkz. condition öğesi.

İ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

Kaynağın birden çok örneğini copy dağıtmak için öğesini şablonunuzun resources bölümüne ekleyin. copy öğesi aşağıdaki genel biçime sahiptir:

"copy": {
  "name": "<name-of-loop>",
  "count": <number-of-iterations>,
  "mode": "serial" <or> "parallel",
  "batchSize": <number-to-deploy-serially>
}

name özelliği, döngüsü tanımlayan herhangi bir değerdir. özelliği, count kaynak türü için istediğiniz yineleme sayısını belirtir.

mode Kaynakların paralel olarak mı yoksa sırayla mı dağıtılacağını belirtmek için ve batchSize özelliklerini kullanın. Bu özellikler Seri veya Paralel olarak açıklanmıştır.

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

Kopyalama döngüsü ile tam mod dağıtımı kullanırken dikkatli olun. Tam modla bir kaynak grubuna yeniden dağıtıyorsanız, kopyalama döngüsünü çözümledikten sonra şablonda belirtilmeyen tüm kaynaklar silinir.

Kaynak yinelemesi

Aşağıdaki örnek, parametresinde storageCount belirtilen depolama hesabı sayısını oluşturur.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "storageCount": {
      "type": "int",
      "defaultValue": 3
    }
  },
  "resources": [
    {
      "copy": {
        "name": "storagecopy",
        "count": "[length(range(0, parameters('storageCount')))]"
      },
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}storage{1}', range(0, parameters('storageCount'))[copyIndex()], uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {}
    }
  ]
}

Her kaynağın adının döngüdeki geçerli yinelemeyi copyIndex() döndüren işlevini içerdiğine dikkat edin. copyIndex() sıfır tabanlıdır. Bu nedenle, aşağıdaki örnek:

"name": "[format('storage{0}', copyIndex())]",

Şu adları oluşturur:

  • depolama0
  • depolama1
  • depolama2

Dizin değerini dengelemek için işlevde copyIndex() bir değer geçirebilirsiniz. Yineleme sayısı yine copy öğesinde belirtilir, ancak değeri belirtilen değere copyIndex göre uzaklıktır. Bu nedenle, aşağıdaki örnek:

"name": "[format('storage{0}', copyIndex(1))]",

Şu adları oluşturur:

  • depolama1
  • depolama2
  • depolama3

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

Aşağıdaki örnek, parametresinde sağlanan her ad için bir depolama hesabı oluşturur.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageNames": {
      "type": "array",
      "defaultValue": [
        "contoso",
        "fabrikam",
        "coho"
      ]
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": [
    {
      "copy": {
        "name": "storagecopy",
        "count": "[length(parameters('storageNames'))]"
      },
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}{1}', parameters('storageNames')[copyIndex()], uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {}
    }
  ]
}

Dağıtılan kaynaklardan değerler döndürmek istiyorsanız çıkışlar bölümünde kopyalamayı kullanabilirsiniz.

Sembolik ad kullan

Sembolik ad , kaynak kopyalama döngülerine atanır. Döngü dizini sıfır tabanlıdır. Aşağıdaki örnekte, myStorages[1] kaynak döngüsündeki ikinci kaynağa başvurur.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "storageCount": {
      "type": "int",
      "defaultValue": 2
    }
  },
  "resources": {
    "myStorages": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}storage{1}', copyIndex(), uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": "[parameters('storageCount')]"
      }
    }
  },
  "outputs": {
    "storageEndpoint":{
      "type": "object",
      "value": "[reference('myStorages[1]').primaryEndpoints]"
    }
  }
}

Dizin bir çalışma zamanı değeriyse, başvuruyu kendiniz biçimlendirin. Örneğin:

"outputs": {
  "storageEndpoint":{
    "type": "object",
    "value": "[reference(format('myStorages[{0}]', variables('runtimeIndex'))).primaryEndpoints]"
  }
}

Sembolik adlar dependsOn dizilerinde kullanılabilir. Sembolik ad bir kopyalama döngüsü içinse, döngüdeki tüm kaynaklar bağımlılık olarak eklenir. Daha fazla bilgi için bkz. Döngüdeki kaynaklara bağlıdır.

Seri veya Paralel

Varsayılan olarak, Resource Manager kaynakları paralel olarak oluşturur. Şablondaki toplam 800 kaynak sınırı dışında paralel olarak dağıtılan kaynak sayısına bir sınır uygulamaz. Bunların oluşturulma sırası garanti değildir.

Ancak, kaynakların sırayla dağıtılacağını belirtmek isteyebilirsiniz. Örneğin, bir üretim ortamını güncelleştirirken güncelleştirmeleri kademelendirin, böylece herhangi bir anda yalnızca belirli bir sayı güncelleştirilsin.

Bir kaynağın birden fazla örneğini seri olarak dağıtmak için seri olarak ve batchSize bir kerede dağıtılacak örnek sayısına ayarlayınmode. Seri modda, Resource Manager döngüdeki önceki örneklerde bir bağımlılık oluşturur, bu nedenle önceki toplu iş tamamlanana kadar tek bir toplu iş başlatmaz.

için batchSize değeri copy öğesindeki değerini count aşamaz.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": [
    {
      "copy": {
        "name": "storagecopy",
        "count": 4,
        "mode": "serial",
        "batchSize": 2
      },
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}storage{1}', range(0, 4)[copyIndex()], uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {}
    }
  ]
}

mode özelliği, varsayılan değer olan paralel değeri de kabul eder.

Alt kaynak için yineleme

Alt kaynak için kopyalama döngüsü kullanamazsınız. Normalde başka bir kaynağın içinde iç içe olarak tanımladığınız birden fazla kaynak örneği oluşturmak için, bunun yerine bu kaynağı en üst düzey kaynak olarak oluşturmanız gerekir. Üst kaynakla ilişkiyi tür ve ad özellikleri aracılığıyla tanımlarsınız.

Örneğin, bir veri kümesini genellikle bir veri fabrikası içinde alt kaynak olarak tanımladığınız varsayalım.

{
  "resources": [
    {
      "type": "Microsoft.DataFactory/factories",
      "name": "exampleDataFactory",
      ...
      "resources": [
        {
          "type": "datasets",
          "name": "exampleDataSet",
          "dependsOn": [
            "exampleDataFactory"
          ],
          ...
        }
      ]
      ...
    }
  ]
}

Birden fazla veri kümesi oluşturmak için veri fabrikasının dışına taşıyın. Veri kümesinin veri fabrikasıyla aynı düzeyde olması gerekir, ancak yine de veri fabrikasının alt kaynağıdır. Tür ve ad özellikleri aracılığıyla veri kümesi ve veri fabrikası arasındaki ilişkiyi korursunuz. Tür artık şablondaki konumundan çıkarılamayacak olduğundan, tam türü şu biçimde sağlamanız gerekir: {resource-provider-namespace}/{parent-resource-type}/{child-resource-type}.

Veri fabrikasının bir örneğiyle üst/alt ilişki kurmak için, veri kümesi için üst kaynak adını içeren bir ad sağlayın. {parent-resource-name}/{child-resource-name} biçimini kullanın.

Aşağıdaki örnekte uygulama gösterilmektedir.

"resources": [
{
  "type": "Microsoft.DataFactory/factories",
  "name": "exampleDataFactory",
  ...
},
{
  "type": "Microsoft.DataFactory/factories/datasets",
  "name": "[format('exampleDataFactory/exampleDataSet{0}', copyIndex())]",
  "dependsOn": [
    "exampleDataFactory"
  ],
  "copy": {
    "name": "datasetcopy",
    "count": "3"
  },
  ...
}]

Örnek şablonlar

Aşağıdaki örneklerde, bir kaynağın veya özelliğin birden fazla örneğini oluşturmaya yönelik yaygın senaryolar gösterilmektedir.

Şablon Description
Depolamayı kopyalama Adında dizin numarası olan birden fazla depolama hesabı dağıtır.
Seri kopya depolama Bir kerede birkaç depolama hesabı dağıtır. Ad dizin numarasını içerir.
Depolamayı diziyle kopyalama Birkaç depolama hesabı dağıtır. Ad, diziden bir değer içerir.
Kaynak grubunu kopyalama Birden çok kaynak grubu dağıtır.

Sonraki adımlar