Aracılığıyla paylaş


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:

özellik toplayıcı ve transformatör mimarisi

Ç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, dizideki securityRules 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 stateinstance 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 parametreyle source 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ı countbir 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 sonucuyla copyIndex(1)1birleş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ı networkSecurityGroupsSettingstek bir parametre tanımlar:

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

Ardından, şablonumuz adlı collectorTemplateUritek 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 parametremizdir networkSecurityGroupsSettings .
  • 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