Usare gli oggetti come parametri in un ciclo di copia in un modello Resource Manager Azure

Quando si usano oggetti come parametro nei modelli Resource Manager Azure, è possibile includerli in un ciclo di copia, quindi ecco un esempio che li usa in questo modo:

Questo approccio diventa molto utile in combinazione con il ciclo di copia seriale, in particolare per la distribuzione di risorse figlio.

Per dimostrare questo concetto, si osservi un modello che distribuisce un gruppo di sicurezza di rete con due regole di sicurezza.

Osservare innanzitutto i parametri. Se si osserva il modello si nota che è stato definito un parametro denominato networkSecurityGroupsSettings che include una matrice denominata securityRules. Questa matrice contiene due oggetti JSON che specificano molte impostazioni per la regola di sicurezza.

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

Osservare ora il modello. NSG1 È disponibile una risorsa denominata distribuisce il gruppo di sicurezza di rete, sfrutta anche la funzionalità di iterazione delle proprietà predefinita di ARM. Aggiungendo il ciclo di copia alla sezione delle proprietà di una risorsa nel modello, è possibile impostare dinamicamente il numero di elementi per una proprietà durante la distribuzione. È anche possibile evitare di dover ripetere la sintassi del modello.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "VNetSettings": {
            "type": "object"
        },
        "networkSecurityGroupsSettings": {
            "type": "object"
        }
    },
    "resources": [
        {
            "apiVersion": "2020-05-01",
            "type": "Microsoft.Network/virtualNetworks",
            "name": "[parameters('VNetSettings').name]",
            "location": "[resourceGroup().location]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[parameters('VNetSettings').addressPrefixes[0].addressPrefix]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[parameters('VNetSettings').subnets[0].name]",
                        "properties": {
                            "addressPrefix": "[parameters('VNetSettings').subnets[0].addressPrefix]"
                        }
                    },
                    {
                        "name": "[parameters('VNetSettings').subnets[1].name]",
                        "properties": {
                            "addressPrefix": "[parameters('VNetSettings').subnets[1].addressPrefix]"
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-05-01",
            "type": "Microsoft.Network/networkSecurityGroups",
            "name": "NSG1",
            "location": "[resourceGroup().location]",
            "properties": {
                "copy": [
                    {
                        "name": "securityRules",
                        "count": "[length(parameters('networkSecurityGroupsSettings').securityRules)]",
                        "input": {
                            "description": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].description]",
                            "priority": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].priority]",
                            "protocol": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].protocol]",
                            "sourcePortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].sourcePortRange]",
                            "destinationPortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].destinationPortRange]",
                            "sourceAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].sourceAddressPrefix]",
                            "destinationAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].destinationAddressPrefix]",
                            "access": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].access]",
                            "direction": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].direction]"
                        }
                    }
                ]
            }
        }
    ]
}

È opportuno esaminare più approfonditamente come si specificano i valori delle proprietà nella risorsa figlio securityRules. A tutte la proprietà viene fatto riferimento tramite la funzione parameters(), si usa poi l'operatore punto per fare riferimento alla matrice securityRules, indicizzata in base al valore attuale dell'iterazione. Infine, si usa un altro operatore punto per fare riferimento al nome dell'oggetto.

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/example3-object-param
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/example3-object-param/deploy.json \
    --parameters deploy.parameters.json

Passaggi successivi