Distribuzione condizionale nei modelli di ARM

A volte è necessario distribuire facoltativamente una risorsa in un modello di Azure Resource Manager (modello di ARM). Usare l'elemento condition per specificare se la risorsa viene distribuita. Il valore della 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. Per distribuire in modo condizionale una risorsa e le relative risorse figlio, è necessario applicare la stessa condizione a ogni tipo di risorsa.

Suggerimento

È consigliabile Bicep perché offre le stesse funzionalità dei modelli di ARM e la sintassi è più semplice da usare. Per saperne di più, vedi Distribuzioni condizionali.

Condizione di distribuzione

Puoi passare un valore di parametro che indica se una risorsa viene distribuita. L'esempio seguente distribuisce una zona DNS in modo condizionale.

{
  "$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, vedi Server logico Azure SQL.

Risorsa nuova o esistente

È possibile usare la distribuzione condizionale per creare una nuova risorsa o usarne una esistente. L'esempio seguente mostra 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"
      ]
    }
  },
  "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 il parametro newOrExisting è impostato su nuovo, la condizione restituisce true. L'account di archiviazione viene distribuito. In caso contrario, viene usato l'account di archiviazione esistente.

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 la funzione reference o list con una risorsa distribuita in modo condizionale, la funzione viene valutata anche se la risorsa non viene distribuita. Se la funzione fa riferimento a una risorsa che non esiste, viene generato un errore.

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

Puoi impostare una risorsa come dipendente da una risorsa condizionale esattamente come qualsiasi altra risorsa. Quando una risorsa condizionale non viene distribuita, Azure Resource Manager la rimuove automaticamente dalle dipendenze necessarie.

Modalità completa

Se distribuisci 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 la versione 2019-05-10 o successive 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