Utilizar objetos como parâmetros num ciclo de cópia num modelo de Resource Manager do Azure
Quando utiliza objetos como parâmetros no Azure Resource Manager modelos (modelos arm), pode incluí-los num ciclo de cópia. Esta técnica é muito útil quando é combinada com um ciclo de cópia em série, especialmente para implementar recursos subordinados.
Para demonstrar esta abordagem, vamos analisar um modelo que implementa um grupo de segurança de rede (NSG) com duas regras de segurança.
Primeiro, vamos ver os nossos parâmetros. Quando olhamos para o nosso modelo, vemos que definimos um parâmetro com o nome networkSecurityGroupsSettings
que inclui uma matriz com o nome securityRules
. Esta matriz contém dois objetos JSON, cada um dos quais especifica definições que definem uma regra de segurança.
{
"$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"
}
]
}
}
}
}
Agora, vamos ver o nosso modelo. Temos um recurso com o nome NSG1
que implementa o NSG. Também utiliza a funcionalidade de iteração de propriedades incorporada do ARM. Ao adicionar um ciclo de cópia à secção de propriedades de um recurso no modelo, pode definir dinamicamente o número de itens de uma propriedade durante a implementação. Também evita ter de repetir a sintaxe do modelo.
{
"$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": {
"name": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].name]",
"properties": {
"description": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].description]",
"priority": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].priority]",
"protocol": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].protocol]",
"sourcePortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].sourcePortRange]",
"destinationPortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].destinationPortRange]",
"sourceAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].sourceAddressPrefix]",
"destinationAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].destinationAddressPrefix]",
"access": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].access]",
"direction": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex('securityRules')].direction]"
}
}
}
]
}
}
]
}
Vamos ver mais detalhadamente como especificamos os nossos valores de propriedade no securityRules
recurso subordinado. Todas as nossas propriedades são referenciadas através da parameters()
função. Em seguida, utilizamos o operador de pontos para referenciar a nossa securityRules
matriz e indexá-la pelo valor atual da iteração. Por fim, utilizamos outro operador de pontos para referenciar o nome do objeto.
Experimentar o modelo
Está disponível um modelo de exemplo no GitHub. Para implementar o modelo, clone o repositório e execute os seguintes comandos da CLI do 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
Passos seguintes
- Azure Resource Manager
- O que são modelos do ARM?
- Tutorial: Criar e implementar o seu primeiro modelo do ARM
- Tutorial: Adicionar um recurso ao modelo do ARM
- Melhores práticas de modelo do ARM
- Documentação do Azure Resource Manager
- Documentação do modelo do ARM