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:
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říkladusecurityRules
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 jakosource
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éhocopyIndex(1)
názvu na základě iterace pro náš prostředek, počínaje1
.
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í output
collector
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
- Azure Resource Manager
- Co je šablona ARM?
- Kurz: Vytvoření a nasazení první šablony ARM
- Kurz: Přidání prostředku do šablony ARM
- Osvědčené postupy pro šablony ARM
- Dokumentace ke službě Azure Resource Manager
- Dokumentace k šablonám ARM