Dela via


Villkorsstyrda distributioner i Bicep med if-uttrycket

Om du vill distribuera en resurs eller modul i Bicep använder du if uttrycket . Ett if uttryck innehåller ett villkor som utvärderas till sant eller falskt. När villkoret if är sant distribueras resursen. När värdet är falskt skapas inte resursen. Du kan bara använda värdet för hela resursen eller modulen.

Varning

Villkorsstyrd distribution fortplantas inte till underordnade resurser. För att villkorligt distribuera en resurs och dess underordnade resurser måste du använda samma villkor för varje resurstyp.

Bicep-diagnostikkoden BCP318 inträffar när du försöker komma åt en egenskap på en villkorsstyrd resurs som kan vara null om resursen inte distribueras. Om du vill förhindra varningen eller förhindra ett körningsundantag använder du operatorn null-forgiving eller safe-dereference. Mer information finns i BCP318.

Utbildningsresurser

Om du hellre vill lära dig mer om villkor via stegvis vägledning kan du läsa Skapa flexibla Bicep-filer med hjälp av villkor och loopar.

Definiera villkor för distribution

I Bicep kan du villkorligt distribuera en resurs genom att skicka in en parameter som anger om resursen distribueras. Testa villkoret med ett if uttryck i resursdeklarationen. I följande exempel visas syntaxen för ett if uttryck i en Bicep-fil. Den distribuerar villkorligt en DNS-zon (Domain Name System). När deployZone är truedistribuerar den DNS-zonen. När deployZone är falsehoppar den över distributionen av DNS-zonen.

param deployZone bool

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

I följande exempel distribueras en modul villkorligt:

param deployZone bool

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

Du kan använda villkor med beroendedeklarationer. För explicita beroenden tar Azure Resource Manager automatiskt bort dem från de beroenden som krävs när resursen inte distribueras. För implicita beroenden tillåts att referera till en egenskap för en villkorsstyrd resurs, men det kan leda till ett distributionsfel.

Ny eller befintlig resurs

Du kan använda villkorsstyrd distribution för att skapa en ny resurs eller använda en befintlig. I följande exempel visas hur du distribuerar ett nytt lagringskonto eller använder ett befintligt lagringskonto.

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)

När parametern newOrExisting är inställd på ny utvärderas villkoret till sant. Lagringskontot har distribuerats. Annars används det befintliga lagringskontot.

Varning

Om du refererar till en villkorligt distribuerad resurs men resursen inte distribueras får du ett fel. Felmeddelandet anger att resursen inte har definierats i mallen.

Körningsfunktioner

Om du använder en referens - eller listfunktion med en resurs som du anger för villkorsstyrd distribution utvärderas funktionen. Om resursen inte har distribuerats får du ett fel.

Använd villkorsuttrycket ?: operator för att säkerställa att funktionen endast utvärderas för villkor när resursen distribueras. Följande exempelmall visar hur du använder den här funktionen med uttryck som endast är villkorligt giltiga.

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')

Nästa steg