Sdílet prostřednictvím


Implementace transformátoru vlastností a kolektoru v šabloně Azure Resource Manager

V článku Použití objektů jako parametrů ve smyčce kopírování v šabloně Azure Resource Manager se dozvíte, jak do objektu uložit hodnoty vlastností prostředku a jak je během nasazení použít na prostředek. Jedná se o velmi užitečný způsob správy parametrů, ale vyžaduje mapování vlastností objektu na vlastnosti prostředku při každém použití objektu v šabloně.

Tento problém můžete obejít implementací šablony transformace vlastností a kolektoru, která iteruje pole objektů a transformuje ho do schématu JSON pro daný prostředek.

Důležité

Tento přístup vyžaduje důkladné znalosti Resource Manager šablon a funkcí.

Podívejme se na příklad, který implementuje kolektor vlastností a transformátor pro nasazení skupiny zabezpečení sítě. Následující diagram znázorňuje, jak naše šablony souvisejí s prostředky v těchto šablonách:

Architektura kolektoru vlastností a transformátoru

Naše šablona volání obsahuje dva prostředky:

  • Odkaz na šablonu, který vyvolá naši šablonu kolektoru
  • Prostředek skupiny zabezpečení sítě, který se má nasadit

Naše šablona kolektoru obsahuje dva prostředky:

  • Prostředek ukotvení
  • Odkaz na šablonu, který vyvolá šablonu transformace ve smyčce kopírování

Naše šablona transformace obsahuje jeden prostředek: prázdnou šablonu s proměnnou, která transformuje json source na schéma JSON, které očekává prostředek skupiny zabezpečení sítě v hlavní šabloně.

Objekt parametru

Použijeme náš securityRules objekt parametru z tématu Použití objektů jako parametrů ve smyčce kopírování v šabloně Azure Resource Manager. Naše šablona transformace transformuje každý objekt v securityRules poli do schématu JSON, které očekává prostředek skupiny zabezpečení sítě v naší volající šabloně.

{
    "$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"
                    }
                ]
            }
        }
    }
}

Podívejme se nejprve na naši šablonu transformace .

Transformovat šablonu

Naše šablona transformace obsahuje dva parametry, které se předávají ze šablony kolektoru:

  • source je objekt, který přijímá jeden z objektů hodnoty vlastnosti z pole vlastností. V našem příkladu securityRules se každý objekt z pole předává po jednom.
  • state je pole, které přijímá zřetězené výsledky všech předchozích transformací. Toto je kolekce transformovaného formátu JSON.

Naše parametry vypadají takto:

{
    "$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": []
        }
    },

Naše šablona také definuje proměnnou s názvem instance , která transformuje objekt source na požadované schéma JSON:

"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]"
            }
        }
    ]
}

output Nakonec z naší šablony zřetězí shromážděné transformace našeho state parametru s aktuální transformací, kterou provádí naše instance proměnná:

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

V dalším kroku se podíváme na naši šablonu kolektoru , abychom zjistili, jak předává hodnoty parametrů.

Šablona kolektoru

Naše šablona kolektoru obsahuje tři parametry:

  • source je naše kompletní pole objektů parametru. Předává se šablonou volání. Má stejný název jako source parametr v naší šabloně transformace, ale je tu jeden zásadní rozdíl: i když se jedná o úplné pole, předáváme do šablony transformace najednou pouze jeden prvek pole.
  • transformTemplateUri je identifikátor URI naší šablony transformace. Definujeme ho jako parametr pro opakované použití šablony.
  • state je původně prázdné pole, které předáme do šablony transformace. Ukládá kolekci objektů transformovaných parametrů po dokončení smyčky kopírování.

Naše parametry vypadají takto:

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

Dále definujeme proměnnou s názvem count. Jeho hodnota je délka pole objektu parametru source :

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

Používáme ho pro počet iterací ve smyčce kopírování.

Teď se podíváme na naše prostředky. Definujeme dva prostředky:

  • loop-0 je prostředek naší smyčky kopírování založený na nule.
  • loop- zřetězení s výsledkem funkce pro vygenerování jedinečného copyIndex(1) názvu na základě iterace pro náš prostředek, počínaje 1.

Naše prostředky vypadají takto:

"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]" }
            }
        }
    }
]

Pojďme se podrobněji podívat na parametry, které předáváme do šablony transformace ve vnořené šabloně. Vzpomeňte si, že náš source parametr předává aktuální objekt v poli objektu parametru source . Parametr state je místem, kde dojde ke kolekci, protože přebírá výstup předchozí iterace smyčky kopírování a předává ho aktuální iteraci. Všimněte si, že reference() funkce používá copyIndex() funkci bez parametru k odkazování na name předchozí propojený objekt šablony.

output Nakonec metoda naší šablony vrátí output poslední iteraci naší šablony transformace:

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

Může se zdát neintuitivní vrátit output poslední iteraci naší šablony transformace do volající šablony, protože se zdá, že jsme ji uložili do našeho source parametru. Je to ale poslední iterace naší šablony transformace , která obsahuje kompletní pole objektů transformovaných vlastností, a to chceme vrátit.

Nakonec se podíváme na to, jak volat šablonu kolektoru z naší šablony volání.

Šablona volání

Naše šablona volání definuje jeden parametr s názvem networkSecurityGroupsSettings:

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

Dále naše šablona definuje jednu proměnnou s názvem collectorTemplateUri:

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

Toto je identifikátor URI šablony kolektoru , který používá náš propojený prostředek šablony:

{
    "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')]"
            }
        }
    }
}

Šabloně kolektoru předáme dva parametry:

  • source je naše pole objektů vlastností. V našem příkladu je to náš networkSecurityGroupsSettings parametr.
  • transformTemplateUri je proměnná, kterou jsme právě definovali pomocí identifikátoru URI naší šablony kolektoru.

Nakonec náš Microsoft.Network/networkSecurityGroups prostředek přímo přiřadí outputcollector prostředek propojené šablony k jeho securityRules vlastnosti:

"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]"
    }
}

Vyzkoušení šablony

Ukázková šablona je k dispozici na GitHubu. Pokud chcete nasadit šablonu, naklonujte úložiště a spusťte následující příkazy Azure CLI :

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

Další kroky