Distribuzione condizionale nei modelli di ARM

A volte è necessario distribuire facoltativamente una risorsa in un modello di Azure Resource Manager (modello arm). Usare l'elemento condition per specificare se la risorsa viene distribuita. Il valore per la condizione viene risolto in true o false. Quando il valore è true, la risorsa viene creata. Quando il valore è false, la risorsa non viene creata. Il valore può essere applicato solo all'intera risorsa.

Nota

La distribuzione condizionale non si propaga alle risorse figlio. Se si vuole distribuire in modo condizionale una risorsa e le relative risorse figlio, è necessario applicare la stessa condizione a ogni tipo di risorsa.

Suggerimento

È consigliabile usare Bicep perché offre le stesse funzionalità dei modelli arm e la sintassi è più semplice da usare. Per altre informazioni, vedere Distribuzioni condizionali.

Condizione di distribuzione

È possibile passare un valore di parametro che indica se una risorsa viene distribuita. Nell'esempio seguente viene distribuita in modo condizionale una 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"
    }
  ]
}

Per un esempio più complesso, vedere Azure SQL server logico.

Risorsa nuova o esistente

È possibile usare la distribuzione condizionale per creare una nuova risorsa o usarne una esistente. L'esempio seguente illustra come distribuire un nuovo account di archiviazione o usare un account di archiviazione esistente.

{
  "$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"
      ]
    }
  },
  "functions": [],
  "resources": [
    {
      "condition": "[equals(parameters('newOrExisting'), 'new')]",
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-06-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS",
        "tier": "Standard"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    }
  ]
}

Quando il parametro newOrExisting è impostato su nuovo, la condizione restituisce true. L'account di archiviazione viene distribuito. Tuttavia, quando newOrExisting è impostato su esistente, la condizione restituisce false e l'account di archiviazione non viene distribuito.

Per un modello di esempio completo che usa l'elemento condition, vedere Macchina virtuale con una Rete virtuale nuova o esistente, archiviazione e indirizzo IP pubblico.

Funzioni di runtime

Se si usa una funzione di riferimento o elenco con una risorsa distribuita in modo condizionale, la funzione viene valutata anche se la risorsa non viene distribuita. Viene visualizzato un errore se la funzione fa riferimento a una risorsa che non esiste.

Usare la funzione if per assicurarsi che la funzione venga valutata solo per le condizioni quando la risorsa viene distribuita. Vedere la funzione if per un modello di esempio che usa if e reference con una risorsa distribuita in modo condizionale.

Si imposta una risorsa come dipendente da una risorsa condizionale esattamente come qualsiasi altra risorsa. Quando una risorsa condizionale non viene distribuita, Azure Resource Manager lo rimuove automaticamente dalle dipendenze necessarie.

Modalità completa

Se si distribuisce un modello con modalità completa e una risorsa non viene distribuita perché condition restituisce false, il risultato dipende dalla versione dell'API REST usata per distribuire il modello. Se si usa una versione precedente alla versione 2019-05-10, la risorsa non viene eliminata. Con 2019-05-10 o versione successiva, la risorsa viene eliminata. Le versioni più recenti di Azure PowerShell e dell'interfaccia della riga di comando di Azure eliminano la risorsa quando la condizione è false.

Passaggi successivi