Share 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 matchar sant eller falskt. När villkoret if är sant distribueras resursen. När värdet är falskt skapas inte resursen. Värdet kan bara tillämpas på hela resursen eller modulen.

Kommentar

Villkorsstyrd distribution överlappar inte underordnade resurser. Om du vill distribuera en resurs villkorligt och dess underordnade resurser måste du använda samma villkor för varje resurstyp.

Utbildningsresurser

Om du hellre vill lära dig mer om villkor via stegvis vägledning kan du läsa Skapa flexibla Bicep-mallar 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 har distribuerats. Du testar 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. 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@2018-05-01' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

I nästa exempel distribueras en modul villkorligt.

param deployZone bool

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

Villkor kan användas med beroendedeklarationer. För explicita beroenden tar Azure Resource Manager automatiskt bort det 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 orsaka 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 antingen 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@2022-09-01' = if (newOrExisting == 'new') {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

resource saExisting 'Microsoft.Storage/storageAccounts@2022-09-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 distribueras. Annars används det befintliga lagringskontot.

Varning

Om du refererar till en villkorligt distribuerad resurs som inte har distribuerats. Du får ett felmeddelande om att resursen inte har definierats i mallen.

Körningsfunktioner

Om du använder en referens - eller listfunktion med en resurs som är villkorligt distribuerad utvärderas funktionen även om resursen inte distribueras. Du får ett fel om funktionen refererar till en resurs som inte finns.

Använd villkorsuttrycket ?: operator för att kontrollera 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@2023-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