Distribuzioni condizionali in Bicep con l'espressione if

Per distribuire facoltativamente una risorsa o un modulo in Bicep, usare l'espressione if. Un'espressione if include una condizione che viene risolta in true o false. Quando la condizione if è true, la risorsa viene distribuita. Quando il valore è false, la risorsa non viene creata. Il valore può essere applicato solo all'intera risorsa o modulo.

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.

Risorse di formazione

Se si preferisce ottenere informazioni sulle condizioni tramite istruzioni dettagliate, vedere Creare modelli Bicep flessibili usando condizioni e cicli.

Definire la condizione per la distribuzione

In Bicep, è possibile distribuire una risorsa in modo condizionale passando un parametro che specifica se la risorsa venga distribuita. La condizione viene testata con un'espressione if nella dichiarazione della risorsa. Nell'esempio seguente, viene illustrata la sintassi di un'espressione if in un file Bicep. Distribuisce in modo condizionale una zona DNS. Quando deployZone è true, distribuisce la zona DNS. Quando deployZone è false, non effettua la distribuzione della zona DNS.

param deployZone bool

resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

Nell'esempio seguente, un modulo viene distribuito in modo condizionale.

param deployZone bool

module dnsZone 'dnszones.bicep' = if (deployZone) {
  name: 'myZoneModule'
}

Le condizioni possono essere usate con dichiarazioni di dipendenza. Per le dipendenze esplicite, Azure Resource Manager lo rimuove automaticamente dalle dipendenze necessarie quando la risorsa non viene distribuita. Per le dipendenze implicite, è consentito fare riferimento a una proprietà di una risorsa condizionale, ma questo potrebbe generare un errore di distribuzione.

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.

param storageAccountName string
param location string = resourceGroup().location

@allowed([
  'new'
  'existing'
])
param newOrExisting string = 'new'

resource saNew 'Microsoft.Storage/storageAccounts@2023-04-01' = if (newOrExisting == 'new') {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

resource saExisting 'Microsoft.Storage/storageAccounts@2023-04-01' existing = if (newOrExisting == 'existing') {
  name: storageAccountName
}

output storageAccountId string = ((newOrExisting == 'new') ? saNew.id : saExisting.id)

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.

Avviso

Se si fa riferimento a una risorsa distribuita in modo condizionale che non è stata distribuita. Verrà visualizzato un errore che indica che la risorsa non è definita nel modello.

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 l'operatore espressione condizionale ?: per assicurarsi che le condizioni della funzione vengano valutate solo quando la risorsa viene distribuita. Il modello di esempio seguente illustra come usare questa funzione con espressioni valide solo in modo condizionale.

param vmName string
param location string
param logAnalytics string = ''

resource vmName_omsOnboarding 'Microsoft.Compute/virtualMachines/extensions@2024-03-01' = if (!empty(logAnalytics)) {
  name: '${vmName}/omsOnboarding'
  location: location
  properties: {
    publisher: 'Microsoft.EnterpriseCloud.Monitoring'
    type: 'MicrosoftMonitoringAgent'
    typeHandlerVersion: '1.0'
    autoUpgradeMinorVersion: true
    settings: {
      workspaceId: ((!empty(logAnalytics)) ? reference(logAnalytics, '2022-10-01').customerId : null)
    }
    protectedSettings: {
      workspaceKey: ((!empty(logAnalytics)) ? listKeys(logAnalytics, '2022-10-01').primarySharedKey : null)
    }
  }
}

output mgmtStatus string = ((!empty(logAnalytics)) ? 'Enabled monitoring for VM!' : 'Nothing to enable')

Passaggi successivi