Implementação condicional nos modelos do ARM
Por vezes, tem de implementar opcionalmente um recurso num modelo de Resource Manager do Azure (modelo arm). Utilize o condition
elemento para especificar se o recurso está implementado. O valor da condição é resolvido como verdadeiro ou falso. Quando o valor é verdadeiro, o recurso é criado. Quando o valor é falso, o recurso não é criado. O valor só pode ser aplicado a todo o recurso.
Nota
A implementação condicional não é propagada para recursos subordinados. Se quiser implementar condicionalmente um recurso e os respetivos recursos subordinados, tem de aplicar a mesma condição a cada tipo de recurso.
Dica
Recomendamos o Bicep porque oferece as mesmas capacidades que os modelos do ARM e a sintaxe é mais fácil de utilizar. Para saber mais, veja Implementações condicionais.
Condição de implementação
Pode transmitir um valor de parâmetro que indica se um recurso está implementado. O exemplo seguinte implementa condicionalmente uma zona DNS.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"deployZone": {
"type": "bool"
}
},
"functions": [],
"resources": [
{
"condition": "[parameters('deployZone')]",
"type": "Microsoft.Network/dnsZones",
"apiVersion": "2018-05-01",
"name": "myZone",
"location": "global"
}
]
}
Para obter um exemplo mais complexo, veja SQL do Azure servidor lógico.
Recurso novo ou existente
Pode utilizar a implementação condicional para criar um novo recurso ou utilizar um existente. O exemplo seguinte mostra como implementar uma nova conta de armazenamento ou utilizar uma conta de armazenamento existente.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"newOrExisting": {
"type": "string",
"defaultValue": "new",
"allowedValues": [
"new",
"existing"
]
}
},
"resources": [
{
"condition": "[equals(parameters('newOrExisting'), 'new')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
},
{
"condition": "[equals(parameters('newOrExisting'), 'existing')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[parameters('storageAccountName')]"
}
],
"outputs": {
"storageAccountId": {
"type": "string",
"value": "[if(equals(parameters('newOrExisting'), 'new'), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]"
}
}
}
Quando o parâmetro newOrExisting
é definido como novo, a condição é avaliada como verdadeira. A conta de armazenamento é implementada. Caso contrário, é utilizada a conta de armazenamento existente.
Para obter um modelo de exemplo completo que utiliza o condition
elemento, veja VM com um Rede Virtual novo ou existente, Armazenamento e IP Público.
Funções de runtime
Se utilizar uma função de referência ou lista com um recurso que é implementado condicionalmente, a função é avaliada mesmo que o recurso não esteja implementado. Receberá um erro se a função se referir a um recurso que não existe.
Utilize a função if para se certificar de que a função só é avaliada relativamente a condições quando o recurso é implementado. Veja a função if de um modelo de exemplo que utiliza if
e reference
com um recurso implementado condicionalmente.
Define um recurso como dependente de um recurso condicional exatamente como faria com qualquer outro recurso. Quando um recurso condicional não é implementado, o Azure Resource Manager remove-o automaticamente das dependências necessárias.
Modo completo
Se implementar um modelo com o modo completo e um recurso não for implementado porque condition
é avaliado como falso, o resultado depende da versão da API REST que utilizar para implementar o modelo. Se utilizar uma versão anterior a 2019-05-10, o recurso não será eliminado. Com a versão 2019-05-10 ou posterior, o recurso é eliminado. As versões mais recentes do Azure PowerShell e da CLI do Azure eliminam o recurso quando a condição é falsa.
Passos seguintes
- Para um módulo do Learn que abrange a implementação condicional, veja Gerir implementações de cloud complexas com funcionalidades avançadas do modelo do ARM.
- Para obter recomendações sobre a criação de modelos, veja Melhores práticas do modelo arm.
- Para criar várias instâncias de um recurso, veja Iteração de recursos em modelos do ARM.