Bir özellik dönüştürücü ve toplayıcıyı bir Azure Resource Manager uygulama

bir nesneyi bir nesnedeparametre olarak Azure Resource Manager şablonunda, kaynak özelliği değerlerini bir nesnede depolamayı ve dağıtım sırasında bir kaynağa uygulamayı öğrendiniz. Bu, parametrelerinizi yönetmek için çok kullanışlı bir yoldur ancak yine de şablonda her kullansanız nesnenin özelliklerini kaynak özellikleriyle eşlemenizi gerektirir.

Bu durumla ilgili bir çalışma yapmak için nesne dizinizi yenidenlayan ve kaynağın beklenen JSON şemasına dönüştüren bir özellik dönüştürme ve toplayıcı şablonu gerçekleştirebilirsiniz.

Önemli

Bu yaklaşım, şablon ve işlevler hakkında Resource Manager gerektirir.

Şimdi bir ağ güvenlik grubu dağıtan bir örnekle bir özellik toplayıcısı ve dönüştürücü nasıl uygulayabilirsiniz? Aşağıdaki diyagramda şablonlarımız ve bu şablonlar içindeki kaynaklarımız arasındaki ilişki gösterilmiştir:

özellik toplayıcı ve dönüştürücü mimarisi

Çağrı şablonumuz iki kaynak içerir:

  • Toplayıcı şablonlarımızı çağıran bir şablon bağlantısı.
  • Dağıtılanı ağ güvenlik grubu kaynağı.

Toplayıcı şablonumuz iki kaynak içerir:

  • Yer noktası 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'mizi ana şablonda ağ güvenlik grubu kaynağımız tarafından beklenen JSON şemasına dönüştüren değişkenli boş bir şablon.

Parametre nesnesi

Nesnelerden parametre securityRules nesnemizi parametre securityRules Dönüştürme şablonumuz dizide yer alan her nesneyi çağrı şablonumuzda ağ güvenlik grubu kaynağı tarafından beklenen JSON şemasına dönüştürecek.

{
    "$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 şablonumuza bakalım.

Şablonu dönüştürme

Dönüştürme şablonumuz toplayıcı şablonundan geçirilen iki parametre içerir:

  • source , özellik dizisinde özellik değeri nesnelerinden birini alan bir nesnedir. Bizim örneğimizde, diziden "securityRules" her nesne tek tek geçirildi.
  • state , önceki tüm dönüştürmelerin birlenmiş sonuçlarını alan bir dizidir. Bu, dönüştürülmüş JSON koleksiyonudur.

Parametrelerimiz şöyle görünüyor:

{
    "$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 adlı bir değişken instance tanımlar. Nesnemizin gerçek dönüşümlerini gerekli source JSON şemasına gerçekleştirir:

"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 şablonumuz, parametremizin toplanan dönüşümlerini değişkenimiz tarafından outputstate gerçekleştirilen geçerli dönüştürmeyle instance bir arada oluşturur:

"resources": [],
"outputs": {
    "collection": {
        "type": "array",
        "value": "[concat(parameters('state'), variables('instance'))]"
    }
}

Şimdi toplayıcı şablonumuza göz atarak parametre değerlerimizde nasıl geçişler olduğunu göreceğiz.

Toplayıcı şablonu

Toplayıcı şablonumuz üç parametre içerir:

  • source , tam parametre nesne dizimizdir. Çağrı şablonu tarafından geçirildi. Bu, dönüştürme şablonumuzda parametresiyle aynı adı içerir ancak fark etmiş olduğunuz önemli bir fark vardır: bu tam dizidir, ancak bu dizinin yalnızca bir öğesini aynı anda dönüştürme şablonuna source iletiriz. source
  • transformTemplateUri, dönüştürme şablonumuz için transformTemplateUri Şablonu yeniden kullanılabilirlik için burada bir parametre olarak tanımlarız.
  • state, dönüştürme şablonumuza ileteceğimiz başlangıçta boş state Kopyalama döngüsü tamamlandığında dönüştürülmüş parametre nesnelerinin koleksiyonunu depolar.

Parametrelerimiz şöyle görünüyor:

"parameters": {
    "source": {
        "type": "array"
    },
    "transformTemplateUri": {
        "type": "string"
    },
    "state": {
        "type": "array",
        "defaultValue": []
    }
}

Ardından adlı bir değişken tanımlay count var. Değeri parametre nesnesi dizisinin source uzunluğudır:

"variables": {
    "count": "[length(parameters('source'))]"
}

Şüpheli olabileceğiniz gibi, kopyalama döngüsünde yineleme sayısı için bunu kullanıyoruz.

Şimdi kaynaklarımızı bir göz atacağız. İki kaynak tanımlayacağız:

  • loop-0 , kopyalama döngüm 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 copyIndex(1) işlevinin sonucuyla bir 1 oluşturulur.

Kaynaklarımız şöyle görünüyor:

"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 geçmiş şablonda dönüşüm şablonuna aktarmış olduğumuz parametrelere daha yakından bakalım. Daha önce parametremizin source parametre nesnesi dizisinde geçerli nesneyi source iletir olduğunu hatırlayın. parametresi, kopyalama döngümimizin önceki yinelemenin çıkışını kullandığından koleksiyonun bulunduğu yerdir. İşlevin, önceki bağlantılı şablon nesnemize başvuru yapmak için parametresiz işlevini kullandığına ve bunu geçerli yinelemeye aktararak kullandığına dikkat statereference()copyIndex()name edin.

Son olarak, output şablonumuz dönüşüm output şablonumuz için son output

"outputs": {
    "result": {
        "type": "array",
        "value": "[reference(concat('loop-', variables('count'))).outputs.collection.value]"
    }
}

Dönüştürme şablonumuz için son yinelemenin çağrı şablonumuza geri dönmesi uygunsuz görünebilir çünkü bunu parametresimizde output depolamış gibi görünüyor output olabilir. Ancak dönüşüm şablonumuzdaki son yinelemenin dönüştürülmüş özellik nesnelerinin tam dizisini tutan olduğunu ve bunu geri almak istediğini unutmayın.

Son olarak, çağıran şablonumuzdan toplayıcı şablonunu çağırmayagöz atabilirsiniz.

Çağırma şablonu

Çağrı şablonumuz adlı tek bir parametre tanımlar:

...
"parameters": {
    "networkSecurityGroupsSettings": {
        "type": "object"
    }
}

Ardından şablonumuz adlı tek bir değişken collectorTemplateUri tanımlar:

"variables": {
    "collectorTemplateUri": "[uri(deployment().properties.templateLink.uri, 'collector.template.json')]"
}

Beklediğiniz gibi bu, bağlı şablon kaynağımız tarafından kullanılacak toplayıcı şablonunun URI'sidir:

{
    "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 iletiriz:

  • source , özellik nesnesi dizimizdir. Örneğimizde bu bizim networkSecurityGroupsSettings parametremizdir.
  • transformTemplateUri, toplayıcı şablonlarımızın URI'si ile tanımlandığı transformTemplateUri

Son olarak Microsoft.Network/networkSecurityGroups kaynağımız bağlantılı şablon output kaynağının collector özelliğini doğrudan securityRules atar:

"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

üzerinde örnek bir şablon GitHub. Şablonu dağıtmak için, depolamayı kopya edin 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