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
- Consultare il modulo Learn Creare modelli Bicep flessibili usando condizioni e cicli.
- Per consigli sulla creazione di file Bicep, vedere Procedure consigliate per Bicep.
- Per creare più istanze di una risorsa, vedere Cicli iterativi in Bicep.