Implementare un trasformatore e un agente di raccolta della proprietà in un modello di Azure Resource Manager
Nell'articolo Usare gli oggetti come parametri in un ciclo di copia in un modello di azure Resource Manager è possibile vedere come archiviare i valori delle proprietà delle risorse in un oggetto e come applicarli a una risorsa durante la distribuzione. Si tratta di un modo molto utile per gestire i parametri, ma è necessario eseguire il mapping delle proprietà dell'oggetto alle proprietà delle risorse ogni volta che si usa l'oggetto nel modello.
Per risolvere questo problema, è possibile implementare un modello di trasformazione e agente di raccolta delle proprietà che esegue l'iterazione della matrice di oggetti e lo trasforma nello schema JSON per la risorsa.
Importante
Per attuare questo approccio è necessario conoscere approfonditamente i modelli e le funzioni di Resource Manager.
Verrà ora esaminato un esempio che implementa un agente di raccolta proprietà e un trasformatore per distribuire un gruppo di sicurezza di rete. Il diagramma seguente mostra come i modelli sono correlati alle risorse in tali modelli:
Il modello di chiamata include due risorse:
- Collegamento di modello che richiama il modello dell'agente di raccolta
- Risorsa del gruppo di sicurezza di rete da distribuire
Il modello dell'agente di raccolta include due risorse:
- Una risorsa di ancoraggio
- Collegamento di modello che richiama il modello di trasformazione in un ciclo di copia
Il modello di trasformazione include una singola risorsa: un modello vuoto con una variabile che trasforma il codice source
JSON nello schema JSON previsto dalla risorsa del gruppo di sicurezza di rete nel modello principale.
Oggetto parametro
L'oggetto parametro di Use objects as parameters in a copy loop in an Azure Resource Manager template (Usa oggetti come parametri in un ciclo di copia) in un modello di Azure Resource Manager.securityRules
Il modello di trasformazione trasforma ogni oggetto nella securityRules
matrice nello schema JSON previsto dalla risorsa del gruppo di sicurezza di rete nel modello chiamante.
{
"$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"
}
]
}
}
}
}
Prima di tutto viene esaminato il modello di trasformazione.
Modello di trasformazione
Il modello di trasformazione include due parametri che vengono passati dal modello dell'agente di raccolta:
-
source
è un oggetto che riceve uno degli oggetti valore della proprietà dalla matrice della proprietà. Nell'esempio ogni oggetto dellasecurityRules
matrice viene passato uno alla volta. -
state
è una matrice che riceve i risultati concatenati di tutte le trasformazioni precedenti. Questa è la raccolta di JSON trasformati.
I parametri sono simili ai seguenti:
{
"$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": []
}
},
Il modello definisce anche una variabile denominata instance
che trasforma l'oggetto source
nello schema JSON richiesto:
"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]"
}
}
]
}
Infine, l'oggetto output
del modello concatena le trasformazioni raccolte del state
parametro con la trasformazione corrente eseguita dalla instance
variabile :
"resources": [],
"outputs": {
"collection": {
"type": "array",
"value": "[concat(parameters('state'), variables('instance'))]"
}
}
Si esaminerà quindi il modello dell'agente di raccolta per vedere come passa i valori dei parametri.
Modello dell'agente di raccolta
Il modello dell'agente di raccolta include tre parametri:
-
source
è la matrice completa dell'oggetto parametro. Viene passato dal modello chiamante. Ha lo stesso nome delsource
parametro nel modello di trasformazione, ma esiste una differenza fondamentale: anche se si tratta della matrice completa, viene passato un solo elemento matrice alla volta al modello di trasformazione. -
transformTemplateUri
è l'URI del modello di trasformazione. Lo definiamo come parametro per la riutilizzabilità del modello. -
state
è una matrice inizialmente vuota che viene passata al modello di trasformazione. Archivia la raccolta di oggetti parametro trasformati al termine del ciclo di copia.
I parametri sono simili ai seguenti:
"parameters": {
"source": {
"type": "array"
},
"transformTemplateUri": {
"type": "string"
},
"state": {
"type": "array",
"defaultValue": []
}
}
Successivamente, viene definita una variabile denominata count
. Il suo valore è la lunghezza della matrice dell'oggetto parametro source
:
"variables": {
"count": "[length(parameters('source'))]"
}
Viene usato per il numero di iterazioni nel ciclo di copia.
Osservare ora le risorse. Si definiscono due risorse:
-
loop-0
è la risorsa in base zero per il ciclo di copia. -
loop-
è concatenata al risultato della funzionecopyIndex(1)
per generare un nome univoco basato sull'iterazione per la risorsa, che inizia con1
.
Le risorse sono simili a quanto segue:
"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]" }
}
}
}
]
Verranno ora esaminati più in dettaglio i parametri passati al modello di trasformazione nel modello annidato. Come indicato in precedenza, il parametro source
passa l'oggetto corrente nella matrice dell'oggetto parametro source
. Il state
parametro è la posizione in cui si verifica la raccolta, perché accetta l'output dell'iterazione precedente del ciclo di copia e lo passa all'iterazione corrente. Si noti che la reference()
funzione usa la copyIndex()
funzione senza alcun parametro per fare riferimento all'oggetto name
modello collegato precedente.
Infine, output
del modello restituisce output
dell'ultima iterazione del modello di trasformazione:
"outputs": {
"result": {
"type": "array",
"value": "[reference(concat('loop-', variables('count'))).outputs.collection.value]"
}
}
Può sembrare controintuitivo restituire l'ultima output
iterazione del modello di trasformazione nel modello chiamante, perché sembra che sia stata archiviata nel source
parametro . Tuttavia, è l'ultima iterazione del modello di trasformazione che contiene la matrice completa di oggetti proprietà trasformati ed è ciò che si vuole restituire.
Infine, è opportuno esaminare come chiamare il modello dell'agente di raccolta dal modello di chiamata.
Modello di chiamata
Il modello di chiamata definisce un solo parametro denominato networkSecurityGroupsSettings
:
...
"parameters": {
"networkSecurityGroupsSettings": {
"type": "object"
}
}
Successivamente, il modello definisce una sola variabile denominata collectorTemplateUri
:
"variables": {
"collectorTemplateUri": "[uri(deployment().properties.templateLink.uri, 'collector.template.json')]"
}
Questo è l'URI per il modello dell'agente di raccolta usato dalla risorsa modello collegata:
{
"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')]"
}
}
}
}
Vengono passati due parametri al modello dell'agente di raccolta:
-
source
è la matrice dell'oggetto proprietà. In questo esempio è il parametronetworkSecurityGroupsSettings
. -
transformTemplateUri
è la variabile appena definita con l'URI del modello dell'agente di raccolta.
Infine, la risorsa Microsoft.Network/networkSecurityGroups
assegna direttamente output
del modello collegato collector
alla proprietà 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]"
}
}
Provare il modello
Un modello di esempio è disponibile in GitHub. Per distribuire il modello, clonare il repository ed eseguire questi comandi dell'interfaccia della riga di comando di Azure:
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
Passaggi successivi
- Azure Resource Manager
- Che cosa sono i modelli di Azure Resource Manager?
- Esercitazione: Creare e distribuire il primo modello di Resource Manager
- Esercitazione: Aggiungere una risorsa al modello di Azure Resource Manager
- Procedure consigliate per i modelli di Resource Manager
- Documentazione di Azure Resource Manager
- Documentazione dei modelli di Resource Manager