Condividi tramite


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:

architettura dell'agente di raccolta e del trasformatore della proprietà

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 della securityRules 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 del source 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 funzione copyIndex(1) per generare un nome univoco basato sull'iterazione per la risorsa, che inizia con 1.

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 parametro networkSecurityGroupsSettings.
  • 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