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