Voorwaardelijke implementaties in Bicep met de if-expressie

Als u desgewenst een resource of module in Bicep wilt implementeren, gebruikt u de if expressie. Een if expressie bevat een voorwaarde die wordt omgezet in waar of onwaar. Wanneer de if voorwaarde waar is, wordt de resource geïmplementeerd. Wanneer de waarde onwaar is, wordt de resource niet gemaakt. De waarde kan alleen worden toegepast op de hele resource of module.

Notitie

Voorwaardelijke implementatie wordt niet trapsgewijs naar onderliggende resources. Als u een resource en de onderliggende resources voorwaardelijk wilt implementeren, moet u dezelfde voorwaarde toepassen op elk resourcetype.

Trainingsmateriaal

Zie Flexibele Bicep-sjablonen bouwen met behulp van voorwaarden en lussen als u liever meer wilt weten over voorwaarden door stapsgewijze instructies te volgen.

Voorwaarde voor implementatie definiëren

In Bicep kunt u een resource voorwaardelijk implementeren door een parameter door te geven die aangeeft of de resource is geïmplementeerd. U test de voorwaarde met een if expressie in de resourcedeclaratie. In het volgende voorbeeld ziet u de syntaxis voor een if expressie in een Bicep-bestand. Er wordt voorwaardelijk een DNS-zone geïmplementeerd. Wanneer deployZone is true, wordt de DNS-zone geïmplementeerd. Wanneer deployZone wordt falsede IMPLEMENTATIE van de DNS-zone overgeslagen.

param deployZone bool

resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

In het volgende voorbeeld wordt een module voorwaardelijk geïmplementeerd.

param deployZone bool

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

Voorwaarden kunnen worden gebruikt met afhankelijkheidsdeclaraties. Voor expliciete afhankelijkheden verwijdert Azure Resource Manager deze automatisch uit de vereiste afhankelijkheden wanneer de resource niet wordt geïmplementeerd. Voor impliciete afhankelijkheden is het verwijzen naar een eigenschap van een voorwaardelijke resource toegestaan, maar kan er een implementatiefout optreden.

Nieuwe of bestaande resource

U kunt voorwaardelijke implementatie gebruiken om een nieuwe resource te maken of een bestaande resource te gebruiken. In het volgende voorbeeld ziet u hoe u een nieuw opslagaccount implementeert of een bestaand opslagaccount gebruikt.

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)

Wanneer de parameter newOrExisting is ingesteld op nieuw, resulteert de voorwaarde in waar. Het opslagaccount wordt geïmplementeerd. Anders wordt het bestaande opslagaccount gebruikt.

Waarschuwing

Als u verwijst naar een voorwaardelijk geïmplementeerde resource die niet is geïmplementeerd. Er wordt een foutbericht weergegeven waarin wordt aangegeven dat de resource niet is gedefinieerd in de sjabloon.

Runtime-functies

Als u een verwijzings- of lijstfunctie gebruikt met een resource die voorwaardelijk is geïmplementeerd, wordt de functie geëvalueerd, zelfs als de resource niet is geïmplementeerd. Er wordt een fout weergegeven als de functie verwijst naar een resource die niet bestaat.

Gebruik de voorwaardelijke expressie ?: operator om ervoor te zorgen dat de functie alleen wordt geëvalueerd op voorwaarden wanneer de resource wordt geïmplementeerd. In de volgende voorbeeldsjabloon ziet u hoe u deze functie gebruikt met expressies die alleen voorwaardelijk geldig zijn.

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

Volgende stappen