Een eigenschappentransformator en -collector implementeren in een Azure Resource Manager sjabloon
In een -object als parameter gebruiken ineen Azure Resource Manager sjabloon , hebt u geleerd hoe u waarden van resource-eigenschappen kunt opslaan in een object en deze tijdens de implementatie kunt toepassen op een resource. Hoewel dit een zeer handige manier is om uw parameters te beheren, moet u nog steeds de eigenschappen van het object telkens wanneer u deze in uw sjabloon gebruikt, aan resource-eigenschappen toevoegen.
Als u dit wilt omkeren, kunt u een eigenschappentransformator en een collector-sjabloon implementeren die uw objectmatrix itereert en deze transformeert in het JSON-schema dat door de resource wordt verwacht.
Belangrijk
Voor deze aanpak moet u een goed begrip hebben van de Resource Manager en functies.
Laten we eens kijken hoe we een eigenschappenverzamelaar en transformator kunnen implementeren met een voorbeeld dat een netwerkbeveiligingsgroep implementeert. In het onderstaande diagram ziet u de relatie tussen onze sjablonen en onze resources in deze sjablonen:

Onze aanroepsjabloon bevat twee resources:
- Een sjabloonkoppeling die onze collectorsjabloon aanroept.
- De resource van de netwerkbeveiligingsgroep die moet worden geïmplementeerd.
Onze collectorsjabloon bevat twee resources:
- Een ankerresource.
- Een sjabloonkoppeling die de transformatiesjabloon in een kopieerlus aanroept.
Onze transformatiesjabloon bevat één resource: een lege sjabloon met een variabele die onze JSON transformeert naar het JSON-schema dat wordt verwacht door onze netwerkbeveiligingsgroepresource in de source hoofdsjabloon.
Parameterobject
We gebruiken ons securityRules parameterobject van objecten als parameters. Met onze transformatiesjabloon wordt elk object in de matrix getransformeerd in het JSON-schema dat wordt verwacht door de securityRules netwerkbeveiligingsgroepresource in onze aanroepsjabloon.
{
"$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"
}
]
}
}
}
}
Laten we eerst onze transformatiesjabloon bekijken.
Sjabloon transformeren
Onze transformatiesjabloon bevat twee parameters die worden doorgegeven vanuit de collectorsjabloon:
sourceis een object dat een van de eigenschapswaardeobjecten van de eigenschaps array ontvangt. In ons voorbeeld wordt elk object uit de"securityRules"matrix één voor één doorgegeven.stateis een matrix die de samenvoegde resultaten van alle vorige transformaties ontvangt. Dit is de verzameling van getransformeerde JSON.
Onze parameters zien er als volgende uit:
{
"$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": []
}
},
Onze sjabloon definieert ook een variabele met de naam instance . Hiermee wordt de werkelijke transformatie van ons source object in het vereiste JSON-schema uitgevoerd:
"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]"
}
}
]
}
Ten slotte worden met de van onze sjabloon de verzamelde transformaties van output onze parameter state samenvoegt met de huidige transformatie die door onze variabele wordt instance uitgevoerd:
"resources": [],
"outputs": {
"collection": {
"type": "array",
"value": "[concat(parameters('state'), variables('instance'))]"
}
}
Laten we nu eens kijken naar onze collectorsjabloon om te zien hoe deze de parameterwaarden doorgeeft.
Collectorsjabloon
Onze collectorsjabloon bevat drie parameters:
sourceis onze volledige matrix met parameterobjecten. Deze wordt doorgegeven door de aanroepende sjabloon. Deze heeft dezelfde naam als de parameter in de transformatiesjabloon, maar er is één belangrijk verschil dat u mogelijk al hebt opgemerkt: dit is de volledige matrix, maar we geven slechts één element van deze matrix tegelijk door aan desourcetransformatiesjabloon.transformTemplateUriis de URI van onze transformatiesjabloon. We definiëren deze hier als een parameter voor herbruikbaarheid van sjablonen.stateis een in eerste instantie lege matrix die we doorgeven aan onze transformatiesjabloon. Het slaat de verzameling getransformeerde parameterobjecten op wanneer de kopieerlus is voltooid.
Onze parameters zien er als volgende uit:
"parameters": {
"source": {
"type": "array"
},
"transformTemplateUri": {
"type": "string"
},
"state": {
"type": "array",
"defaultValue": []
}
}
Vervolgens definiëren we een variabele met de naam count . De waarde is de lengte van de source matrix van het parameterobject:
"variables": {
"count": "[length(parameters('source'))]"
}
Zoals u misschien vermoedt, gebruiken we deze voor het aantal iteraties in onze kopieerlus.
Laten we nu eens kijken naar onze resources. We definiëren twee resources:
loop-0is de op nul gebaseerde resource voor onze kopieerlus.loop-wordt samenvoegd met het resultaat van de functie omcopyIndex(1)een unieke, op iteratie gebaseerde naam voor onze resource te genereren, te beginnen met1.
Onze resources zien er als volgende uit:
"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]" }
}
}
}
]
Laten we eens kijken naar de parameters die we doorgeven aan de transformatiesjabloon in de geneste sjabloon. Zoals eerder is gezegd, geeft onze source parameter het huidige object door in de matrix van het source parameterobject. De parameter is waar de verzameling plaatsvindt, omdat de uitvoer van de vorige iteratie van onze kopieerlus wordt gebruikt. U ziet dat de functie de functie zonder parameter gebruikt om te verwijzen naar het van het vorige gekoppelde sjabloonobject en deze doorgeeft aan de huidige state — reference() copyIndex() name — iteratie.
Ten slotte output retourneert de van onze sjabloon de output van de laatste iteratie van onze transformatiesjabloon:
"outputs": {
"result": {
"type": "array",
"value": "[reference(concat('loop-', variables('count'))).outputs.collection.value]"
}
}
Het lijkt misschien niet intuïtief om de van de laatste iteratie van onze transformatiesjabloon te retourneren aan onze aanroepsjabloon, omdat deze in onze output parameter werd source opgeslagen. Onthoud echter dat dit de laatste iteratie van onze transformatiesjabloon is die de volledige matrix van getransformeerde eigenschapsobjecten bevat en dat is wat we willen retourneren.
Laten we ten slotte eens kijken hoe we de collectorsjabloon aanroepen vanuit onze aanroepsjabloon.
Sjabloon aanroepen
Onze aanroepsjabloon definieert één parameter met de naam networkSecurityGroupsSettings :
...
"parameters": {
"networkSecurityGroupsSettings": {
"type": "object"
}
}
Vervolgens definieert onze sjabloon één variabele met de naam collectorTemplateUri :
"variables": {
"collectorTemplateUri": "[uri(deployment().properties.templateLink.uri, 'collector.template.json')]"
}
Zoals u zou verwachten, is dit de URI voor de collectorsjabloon die wordt gebruikt door onze gekoppelde sjabloonresource:
{
"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')]"
}
}
}
}
We geven twee parameters door aan de collectorsjabloon:
sourceis onze eigenschapsobject array. In ons voorbeeld is dit onzenetworkSecurityGroupsSettingsparameter.transformTemplateUriis de variabele die we zojuist hebben gedefinieerd met de URI van de collectorsjabloon.
Ten slotte wijst Microsoft.Network/networkSecurityGroups onze resource de van de output gekoppelde sjabloonresource rechtstreeks collector toe aan de eigenschap securityRules :
"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]"
}
}
De sjabloon uitproberen
Er is een voorbeeldsjabloon beschikbaar op GitHub. Als u de sjabloon wilt implementeren, kloont u de repo en voert u de volgende Azure CLI-opdrachten uit:
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