Uso de objetos como parámetros en un bucle de copia en una plantilla de Azure Resource Manager
Cuando usa objetos como parámetros en las plantillas de Azure Resource Manager, es posible que quiera incluirlos en un bucle de copia, así que aquí le indicamos un ejemplo que los usa de esa manera:
Este enfoque se vuelve muy útil cuando se combina con el ciclo de copia en serie, particularmente para implementar recursos secundarios.
Para demostrarlo, vamos una plantilla que implementa un grupo de seguridad de red (NSG) con dos reglas de seguridad.
Primero, echemos un vistazo a nuestros parámetros. Si observamos nuestra plantilla, veremos que hemos definido un parámetro llamado networkSecurityGroupsSettings, que incluye una matriz llamada securityRules. Esta matriz contiene dos objetos JSON que especifican una serie de valores para una regla de seguridad.
{
"$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"
}
]
}
}
}
}
Ahora, echemos un vistazo a la plantilla. Tenemos un recurso llamado NSG1 que implementa el grupo de seguridad de red y que también aprovecha la característica de iteración de propiedades incorporada de ARM; al agregar un bucle de copia a la sección de propiedades de un recurso en la plantilla, puede establecer dinámicamente el número de elementos de una propiedad durante la implementación. Asimismo, evitará tener que repetir la sintaxis de la plantilla.
{
"$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]"
}
}
]
}
}
]
}
Vamos a echar un vistazo más de cerca a cómo se especifican los valores de propiedad en el recurso secundario securityRules. Para hacer referencia a todas las propiedades, se usa la función parameters() y, a continuación, se usa el operador punto para hacer referencia a la matriz securityRules, indexada por el valor actual de la iteración. Por último, se usa otro operador punto para hacer referencia al nombre del objeto.
Prueba de la plantilla
GitHub tiene una plantilla de ejemplo a su disposición. Para implementar la plantilla, clone el repositorio y ejecute los siguientes comandos de la CLI de 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
Pasos siguientes
- Aprenda a crear una plantilla que recorre en iteración una matriz de objetos y los transforma en un esquema JSON. Consulte Implementación de un recopilador y transformador de propiedades en una plantilla de Azure Resource Manager