Azure Resource Manager şablonunda özellik dönüştürücü ve toplayıcı uygulama
Azure Resource Manager şablonunda nesneleri kopyalama döngüsünde parametre olarak kullanma makalesinde, bir nesnede kaynak özelliği değerlerini depolamayı ve dağıtım sırasında bir kaynağa uygulamayı görebilirsiniz. Bu, parametrelerinizi yönetmenin çok yararlı bir yoludur, ancak şablonunuzda nesneyi her kullandığınızda nesnenin özelliklerini kaynak özellikleriyle eşlemenizi gerektirir.
Bu sorunu geçici olarak çözmek için nesne dizinizi yineleyen ve kaynağın JSON şemasına dönüştüren bir özellik dönüştürme ve toplayıcı şablonu uygulayabilirsiniz.
Önemli
Bu yaklaşım, Resource Manager şablonları ve işlevleri derinlemesine anlamanız gerekir.
Bir ağ güvenlik grubu dağıtmak için özellik toplayıcısı ve dönüştürücü uygulayan bir örneğe göz atalım. Aşağıdaki diyagramda şablonlarımızın bu şablonlardaki kaynaklarla nasıl ilişkili olduğu gösterilmektedir:
Çağrı şablonumuz iki kaynak içerir:
- Toplayıcı şablonumuzu çağıran bir şablon bağlantısı
- Dağıtılacak ağ güvenlik grubu kaynağı
Toplayıcı şablonumuz iki kaynak içerir:
- Yer işareti kaynağı
- Dönüştürme şablonunu bir kopyalama döngüsünde çağıran şablon bağlantısı
Dönüştürme şablonumuz tek bir kaynak içerir: JSON'umuzu ana şablondaki ağ güvenlik grubu kaynağımız source
tarafından beklenen JSON şemasına dönüştüren bir değişkene sahip boş bir şablon.
Parametre nesnesi
Azure Resource Manager şablonunda nesneleri kopyalama döngüsünde parametre olarak kullanma bölümünden parametre nesnemizi securityRules
kullanırız.
Dönüştürme şablonumuz, dizideki securityRules
her nesneyi çağrı şablonumuzdaki ağ güvenlik grubu kaynağı tarafından beklenen JSON şemasına dönüştürür.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"networkSecurityGroupsSettings": {
"value": {
"securityRules": [
{
"name": "RDPAllow",
"description": "allow RDP connections",
"direction": "Inbound",
"priority": 100,
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "10.0.0.0/24",
"sourcePortRange": "*",
"destinationPortRange": "3389",
"access": "Allow",
"protocol": "Tcp"
},
{
"name": "HTTPAllow",
"description": "allow HTTP connections",
"direction": "Inbound",
"priority": 200,
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "10.0.1.0/24",
"sourcePortRange": "*",
"destinationPortRange": "80",
"access": "Allow",
"protocol": "Tcp"
}
]
}
}
}
}
Önce dönüşüm şablonumuzu inceleyelim.
Dönüştürme şablonu
Dönüşüm şablonumuz, toplayıcı şablonundan geçirilen iki parametreyi içerir:
-
source
, özellik dizisinden özellik değeri nesnelerinden birini alan bir nesnedir. Örneğimizde, dizidekisecurityRules
her nesne birer birer geçirilir. -
state
, önceki tüm dönüşümlerin birleştirilmiş sonuçlarını alan bir dizidir. Bu, dönüştürülmüş JSON koleksiyonudur.
Parametrelerimiz şöyle görünür:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"source": {
"type": "object"
},
"state": {
"type": "array",
"defaultValue": []
}
},
Şablonumuz ayrıca nesnemizi source
gerekli JSON şemasına dönüştüren adlı instance
bir değişken tanımlar:
"variables": {
"instance": [
{
"name": "[parameters('source').name]",
"properties": {
"description": "[parameters('source').description]",
"protocol": "[parameters('source').protocol]",
"sourcePortRange": "[parameters('source').sourcePortRange]",
"destinationPortRange": "[parameters('source').destinationPortRange]",
"sourceAddressPrefix": "[parameters('source').sourceAddressPrefix]",
"destinationAddressPrefix": "[parameters('source').destinationAddressPrefix]",
"access": "[parameters('source').access]",
"priority": "[parameters('source').priority]",
"direction": "[parameters('source').direction]"
}
}
]
}
Son olarak, output
şablonumuz parametremizin toplanan dönüşümlerini değişkenimiz state
instance
tarafından gerçekleştirilen geçerli dönüşümle birleştirir:
"resources": [],
"outputs": {
"collection": {
"type": "array",
"value": "[concat(parameters('state'), variables('instance'))]"
}
}
Şimdi parametre değerlerimizi nasıl geçtiğini görmek için toplayıcı şablonumuzu inceleyelim.
Toplayıcı şablonu
Toplayıcı şablonumuz üç parametre içerir:
-
source
tam parametre nesne dizimizdir. Çağrı şablonu tarafından geçirilir. Dönüştürme şablonumuzdaki parametreylesource
aynı ada sahiptir, ancak tek bir önemli fark vardır: tam dizi olsa da, dönüştürme şablonuna aynı anda yalnızca bir dizi öğesi geçiririz. -
transformTemplateUri
, dönüşüm şablonumuzun URI'sini oluşturur. Bunu şablon yeniden kullanılabilirliği için bir parametre olarak tanımlarız. -
state
, dönüşüm şablonumuza geçirdiğimiz başlangıçta boş bir dizidir. Kopyalama döngüsü tamamlandıktan sonra dönüştürülmüş parametre nesnelerinin koleksiyonunu depolar.
Parametrelerimiz şöyle görünür:
"parameters": {
"source": {
"type": "array"
},
"transformTemplateUri": {
"type": "string"
},
"state": {
"type": "array",
"defaultValue": []
}
}
Ardından adlı count
bir değişken tanımlayacağız. Değeri, parametre nesnesi dizisinin source
uzunluğudur:
"variables": {
"count": "[length(parameters('source'))]"
}
Bunu kopyalama döngümüzde yineleme sayısı için kullanırız.
Şimdi kaynaklarımıza göz atalım. İki kaynak tanımladık:
-
loop-0
, kopyalama döngümüz için sıfır tabanlı kaynaktır. -
loop-
ile başlayarak kaynağımız için benzersiz bir yineleme tabanlı ad oluşturmak için işlevinin sonucuylacopyIndex(1)
1
birleştirilir.
Kaynaklarımız şöyle görünür:
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2015-01-01",
"name": "loop-0",
"properties": {
"mode": "Incremental",
"parameters": { },
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": { },
"variables": { },
"resources": [ ],
"outputs": {
"collection": {
"type": "array",
"value": "[parameters('state')]"
}
}
}
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2015-01-01",
"name": "[concat('loop-', copyindex(1))]",
"copy": {
"name": "iterator",
"count": "[variables('count')]",
"mode": "serial"
},
"dependsOn": [
"loop-0"
],
"properties": {
"mode": "Incremental",
"templateLink": { "uri": "[parameters('transformTemplateUri')]" },
"parameters": {
"source": { "value": "[parameters('source')[copyindex()]]" },
"state": { "value": "[reference(concat('loop-', copyindex())).outputs.collection.value]" }
}
}
}
]
Şimdi iç içe yerleştirilmiş şablondaki dönüştürme şablonumuza geçirdiğimiz parametrelere daha yakından bakalım. Önceki bölümlerden hatırlayacağınız üzere parametremiz source
geçerli nesneyi parametre nesnesi dizisine source
geçirir.
state
parametresi, kopyalama döngümüzdeki önceki yinelemenin çıkışını alıp geçerli yinelemeye geçirdiğinden koleksiyonun gerçekleştiği yerdir. işlevinin reference()
, önceki bağlantılı şablon nesnesine copyIndex()
başvurmak için parametresiz işlevini kullandığına name
dikkat edin.
Son olarak, output
şablonumuzun değeri, dönüşüm şablonumuzun son yinelemesini döndürüroutput
:
"outputs": {
"result": {
"type": "array",
"value": "[reference(concat('loop-', variables('count'))).outputs.collection.value]"
}
}
Dönüştürme şablonumuzun son yinelemesini çağıran şablonumuza döndürmek output
uygun görünmeyebilir, çünkü bunu parametremizde source
depolamışız gibi görünür. Ancak, dönüştürülen özellik nesnelerinin tam dizisini tutan dönüştürme şablonumuzun son yinelemesidir ve döndürmek istediğimiz budur.
Son olarak, çağrı şablonumuzdan toplayıcı şablonunun nasıl çağrılmasına göz atalım.
Çağrı şablonu
Çağrı şablonumuz adlı networkSecurityGroupsSettings
tek bir parametre tanımlar:
...
"parameters": {
"networkSecurityGroupsSettings": {
"type": "object"
}
}
Ardından, şablonumuz adlı collectorTemplateUri
tek bir değişken tanımlar:
"variables": {
"collectorTemplateUri": "[uri(deployment().properties.templateLink.uri, 'collector.template.json')]"
}
Bu, bağlı şablon kaynağımız tarafından kullanılan toplayıcı şablonunun URI'udur:
{
"apiVersion": "2020-06-01",
"name": "collector",
"type": "Microsoft.Resources/deployments",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('collectorTemplateUri')]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"source": {
"value": "[parameters('networkSecurityGroupsSettings').securityRules]"
},
"transformTemplateUri": {
"value": "[uri(deployment().properties.templateLink.uri, 'transform.json')]"
}
}
}
}
Toplayıcı şablonuna iki parametre geçiririz:
-
source
, özellik nesne dizimizdir. Örneğimizde bu bizim parametremizdirnetworkSecurityGroupsSettings
. -
transformTemplateUri
, toplayıcı şablonumuzun URI'siyle tanımladığımız değişkendir.
Son olarak kaynağımızMicrosoft.Network/networkSecurityGroups
, bağlı şablon kaynağının collector
öğesini doğrudan özelliğine securityRules
ataroutput
:
"resources": [
{
"apiVersion": "2020-05-01",
"type": "Microsoft.Network/networkSecurityGroups",
"name": "networkSecurityGroup1",
"location": "[resourceGroup().location]",
"properties": {
"securityRules": "[reference('collector').outputs.result.value]"
}
}
],
"outputs": {
"instance": {
"type": "array",
"value": "[reference('collector').outputs.result.value]"
}
}
Şablonu deneyin
GitHub'da örnek bir şablon mevcuttur. Şablonu dağıtmak için depoyu kopyalayın ve aşağıdaki Azure CLI komutlarını çalıştırın:
git clone https://github.com/mspnp/template-examples.git
cd template-examples/example4-collector
az group create --location <location> --name <resource-group-name>
az deployment group create -g <resource-group-name> \
--template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example4-collector/deploy.json \
--parameters deploy.parameters.json
Sonraki adımlar
- Azure Resource Manager
- ARM şablonları nelerdir?
- Öğretici: İlk ARM şablonunuzu oluşturma ve dağıtma
- Öğretici: ARM şablonunuza kaynak ekleme
- ARM şablonu en iyi yöntemleri
- Azure Resource Manager belgeleri
- ARM şablonu belgeleri