copy öğesini kullanarak birden çok kaynak örneği oluşturma

Tamamlandı

Buraya kadar kaynakları bir şablon içindeki kaynak listesinde bildirdiniz. Bu senaryoda dağıtımda, kaynaklar listesinde belirtilen her öğenin bir örneği oluşturulur. Belirli bir kaynak için birden çok örnek oluşturmak isteyebilirsiniz. Örneğin, bir sanal ağ içinde birden çok alt ağ oluşturmak isteyebilirsiniz.

Birden çok örnek oluşturmayı ve yapıların üzerine yineleme yapmayı planlarken aşağıdaki soruları ve noktaları göz önünde bulundurun:

  • Birden fazla kopyaya ihtiyacım var mı: Daha basit senaryolar için gerekmeyebilirsiniz. Alt ağlar veya sanal makineler gibi daha gelişmiş senaryolarda bulunan kaynaklar için birden çok kopyaya ihtiyaç duyup duymadığınızı düşünmeniz gerekebilir.
  • Bir kaynağa bağımlı mıyım: Normalde Azure Resource Manager, Azure Resource Manager şablonundaki başvuruların işe yaraması için nelerin hangi sırayla oluşturulacağı konusunda iyidir. Ancak, siparişi belirtmeniz gerekebilecek durumlar da vardır.
  • Adlandırma düzeni tanımlama: Kaynaklarınıza anlamlı adlar vermek istiyorsunuz. Bu nedenle dağıtım zamanında geçirilen parametreleri kullanabilirsiniz. Birden çok kopyaya sahip olduğunuzda daha fazla denetim elde etmek ve adlandırmayı mevcut kopyalama dizisindeki yineleme sayısına göre belirlemek isteyebilirsiniz.
  • Kaynak oluşturmayı yapılandırma ve denetleme: Üretim ortamında oluşturulacak kaynak sayısını sınırlamak isteyebilirsiniz. Kaynak oluşturma sürecini seri veya paralel olacak şekilde yapılandırarak bunu yapabilirsiniz.
  • Diğer türleri kopyalama: Birden çok kopyasını oluşturup yineleyebileceğiniz tek şey kaynaklar değildir. Özellikler, değişkenler ve çıkışlar için de bunu yapabilirsiniz.
  • Üst-alt öğe: Kaynaklarınızda üst-alt ilişkileri yapılandırmanız gerekebilir.

Birden çok örnek oluşturma

Tuş vuruşlarınızı kaydetmek için döngü yapılarını kullanabilirsiniz. İhtiyaç duyduğunuz şey yineleniyorsa; ad, tür gibi değerler benzerlik gösteriyorsa ve çok küçük farklar varsa copy öğesini kullanmanız faydalı olabilir.

copy öğesi kaynaklar, özellikler, değişkenler ve çıkışlar gibi farklı yapı türlerinde kullanılabileceğiniz bir JSON bileşenidir. copy öğesinin söz dizimi copy anahtarı ile değer dizisinden oluşur. Örneğin: "copy": [].

Dizi, birden çok öğe alır ve her öğe, bir dizi özellikten oluşan bir {} nesnesidir. Bu özelliklerin içeriği, kullanıldıkları yapı türüne göre değişir. Genellikle tüm copy öğesi yapılarında count özelliği ortaktır. Bu özellik, belirli bir yapı türünden kaç örnek istediğinizi belirler. Çoğu yapıda ayrıca kodunuzun geri kalanında başvurabileceğiniz bir ad sunan name özelliği de bulunur. Diğer özellikler yapıya göre değişiklik gösterir.

Yapmanız gereken seçimler

Şunu sorabilirsiniz: "Öğeyi copy birçok yapı türünde kullanabiliyorsam, hangisini ne zaman ve ne zaman seçmeliyim ve şablonda birden fazla tür kullanabilir miyim?"

Bu sorunun yanıtı kullanım örneğinize göre değişir. Kaynak yinelemesi, bir kaynaktan birden çok kopya oluşturmanızı sağlar ve birden çok depolama hesabına ihtiyacınız varsa makul bir seçenektir. Diğer taraftan özellik yinelemesi, bir kaynak içinde birden çok özellik oluşturmanızı sağlar. Bu sayede, yazacağınız kod miktarından ve zamandan tasarruf yapabilirsiniz. Ayrıca şablonunuzdaki yinelenen bölümleri en iyi siz bilirsiniz.

copy öğesini şablonunuzda birçok yerde kullanabilirsiniz. copy öğesini kullanarak birden çok kaynak oluşturabilir ve aynı zamanda aynı şablon içinde birden çok benzer değişken oluşturabilirsiniz.

Nasıl çalışır

copy öğesi, copy deyiminizin değerlendirilmesi ve gerekli bileşenlerin oluşturulmasıyla çalışır. Değiştirme, deyimi içinde copy tanımladığınız ve alanda istediğiniz kadar tekrarlanan sonucudur copy .

Aşağıdaki örnekte copy kullanan bir tanımın nasıl görünebileceği gösterilmektedir:

"copy": [
  {
    "name": "dataDisks",
    "count": 2,
    "input": {
      "diskSizeGB": 1023,
      "lun": "[copyIndex('dataDisks')]",
      "createOption": "Empty"
    }
  }
]

count: 2 girişine dikkat edin. 2 değeri, yukarıdaki ifadenin iki girişten oluşacak şekilde genişlemesini istediğiniz anlamına gelir. Sonuç aşağıdadır:

"dataDisks": [
{
  "lun": 0,
  "createOption": "Empty",
  "diskSizeGB": 1023
},
{
  "lun": 1,
  "createOption": "Empty",
  "diskSizeGB": 1023
}

name özelliğinin değerinin özellik adı olduğunu, input özelliğinin içeriklerinin ise yinelenen JSON kodunun bir parçası olduğunu görebilirsiniz.

Dekont

copy ifadesi ve çıkışı, kullanılan ifade türüne göre değişir. Önceki örnek, bir ifade bir dizi yinelenen deyime dönüştürüldüğünde gerçekleştirilen işlemleri göstermesi açısından iyi bir referanstır.

copy deyimiyle ilgili belirli limitler vardır. Şu an için en fazla 800 giriş kopyalanabilir.

Önemli

Sınırlamalar hakkında tam bilgi için ARM şablonlarında kaynak yinelemesi bölümüne bakın.

Yinelemeyi denetleme

Dizideki belirli dizinlere başvurmanıza yardımcı olan yardımcı işlevleri vardır. copyIndex() işlevi geçerli dizini döndürür. Örneğin, üçüncü yinelenen giriş için copyIndex(), 2 değerini döndürür. copyIndex() söz dizimi aşağıdaki şekilde görünür:

copyIndex(loopName, offset)

copyIndex() işlevinde iki farklı giriş parametresi vardır: loopName ve offset. offset parametresi her zaman isteğe bağlıdır ve geçerli dizinden uzaklığı belirtmek için kullanılır. offset değeri olarak eklediğiniz değer, geçerli dizine eklenir. Geçerli dizin 2 döndürürse ve uzaklık değeri olarak 1 belirtirseniz copyIndex() işlevi 3 değerini döndürür.

loopName parametresi kullanıldığı yere bağlı olarak isteğe bağlı veya zorunludur. properties yapısında kullanıldığında zorunlu, resources dizisinde kullanıldığında ise isteğe bağlıdır. Aşağıda zorunlu olduğu yere bir örnek verilmiştir:

"properties": {
    "storageProfile": {
      "copy": [
        {
          "name": "dataDisks",
          "count": "[parameters('numberOfDataDisks')]",
          "input": {
            "diskSizeGB": 1023,
            "lun": "[copyIndex('dataDisks')]",
            "createOption": "Empty"
          }
        }
      ]
    }
}

copy öğesinin bir properties yapısı içinde nasıl kullanıldığına ve copyIndex() öğesinde, copyIndex('dataDisks') olarak belirtilmiş loopName bulunduğuna dikkat edin.

Aşağıda loopName öğesinin zorunlu olmadığı yere bir örnek verilmiştir:

{
  "type": "Microsoft.Network/virtualNetworks",
  "apiVersion": "2018-04-01",
  "name": "[concat(parameters('vnetname'), copyIndex())]",
}

Burada bir kaynak bildirilmiş ve copyIndex(), kaynak bağlamında kullanıldığı için parametre olmadan çağrılmıştır.

Dağıtımı yapılandırma

copy öğesini kaynaklar için kullandığınızda birbirine benzeyen kaynaklar oluşturmuş olursunuz.

Bazen kaynakların oluşturulma şeklini ve sırasını denetlemek isteyebilirsiniz. Sıralamayı denetleme nedenlerinden bazıları şunlar olabilir:

  • Ortam sınırlamaları. Dağıtım yaptığınız ortama bağlı olarak ortamın dağıtımdan etkilenme durumunu sınırlamak isteyebilirsiniz. Üretim ortamında aynı anda etkilenebilecek kaynak sayısını sınırlamak mantıklıdır. Aynı anda dağıtılan kaynak sayısını denetlemek için dağıtım modu ayarını yapılandırabilirsiniz.
  • Bağımlılıklar. İhtiyacınız olan kaynağı oluşturmadan önce başka bir kaynağın oluşturulmuş olmasını şart koşabilirsiniz. Bu tür bir bağımlılığı ifade etmek için dependsOn adlı yapıdan faydalanabilirsiniz.

Dağıtım modları ve copy

copy yapısı tarafından oluşturulan bir dizi kaynağın başka bir kaynaktan önce oluşturulmasını sağlamak isteyebilirsiniz. Böyle bir durumda bunu ifade etmeniz gerekir. Burada Resource Manager tarafından kullanılan dağıtım modlarının önemli olduğunu unutmayın. Desteklenen iki mod vardır:

  • Seri. Bir kaynağın bu dağıtım moduna ayarlanması, kaynakların sırayla oluşturulacağı anlamına gelir. Ayrıca bu modu kullanarak dağıtılacak kaynak sayısını belirlemek için bir batchSize özelliği de ayarlamanız beklenir. Önceki bir toplu iş tamamlanmadan önce yeni bir toplu iş başlatılamaz. Süreci bu şekilde sınırlama özelliği, üretim ortamında faydalı olabilir. Örneğin, herhangi bir anda durumdan etkilenen kaynak sayısını sınırlamak önemli olabilir.
  • Paralel. Bu mod, varsayılan dağıtım modudur. Yüksek aktarım hızı sunma avantajı sayesinde şablon daha hızlı bir şekilde işlenir. Ancak bu modda sıralama garantisi sunulamadığından üretim ortamı için uygun olmayabilir.

Bağımlılıklar

copy öğesi bağlamında kaynağa, bağımlılıkla birlikte hangi bölümü beklediği değerini iletmeniz gerekir. Bu bağımlılığı gerçekleştirmek için aşağıdaki JSON kodunda olduğu gibi adıyla başvurmanız gerekir:

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2015-06-15",
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",
      "dependsOn": ["storagecopy"],
    }
  ]

copy öğesinin storagecopy değeri olan bir name özelliğine sahip olduğunu unutmayın. Depolama hesabı gibi bir bağımlı kaynak, copy öğesinin işleminin bitmesini bekler. Bu, "dependsOn": ["storagecopy"] ile ifade edilir.

Bu nedenle, ARM şablonu, bu iki kaynak arasında seri dağıtım moduna geçer. Bu durum dağıtımın aktarım hızını etkileyebilir ancak belirli bir dağıtım sırasına uygun hareket edilmesini istediğiniz için öncelik buna verilir.