copy öğesini kullanarak birden çok kaynak örneği oluşturma
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.