Freigeben über


Bedingte Bereitstellungen in Bicep mit einem if-Ausdruck

Um eine Ressource oder ein Modul optional in Bicep bereitzustellen, verwenden Sie einen if-Ausdruck. Ein if-Ausdruck enthält eine Bedingung, die in TRUE oder FALSE aufgelöst wird. Wenn die if-Bedingung TRUE ist, wird die Ressource bereitgestellt. Wenn der Wert FALSE ist, wird die Ressource nicht erstellt. Sie können den Wert nur auf die gesamte Ressource oder das gesamte Modul anwenden.

Warnung

Die bedingte Bereitstellung wird nicht an untergeordnete Ressourcen weitergegeben. Wenn Sie eine Ressource und ihre untergeordneten Ressourcen bedingt bereitstellen möchten, müssen Sie dieselbe Bedingung auf jeden Ressourcentyp anwenden.

Bicep-Diagnosecode BCP318 tritt auf, wenn Sie versuchen, auf eine Eigenschaft für eine bedingte Ressource zuzugreifen, die null sein kann, wenn die Ressource nicht bereitgestellt wird. Um die Warnung zu unterdrücken oder eine Laufzeit-Ausnahme zu verhindern, verwenden Sie den "null-forgiving"-Operator oder den "safe-dereference"-Operator. Weitere Informationen finden Sie unter BCP318.

Definieren der Bedingung für die Bereitstellung

In Bicep können Sie eine Ressource bedingt bereitstellen, indem Sie einen Parameter übergeben, der angibt, ob die Ressource bereitgestellt wird. Testen Sie die Bedingung mit einem if Ausdruck in der Ressourcendeklaration. Das folgende Beispiel zeigt die Syntax für einen if-Ausdruck in einer Bicep-Datei. Sie stellt bedingt eine Dns-Zone (Domain Name System) bereit. Wenn deployZonetrue ist, wird die DNS-Zone implementiert. Wenn deployZone gleich false ist, wird die Bereitstellung der DNS-Zone übersprungen.

param deployZone bool

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

Im folgenden Beispiel wird ein Modul bedingt bereitgestellt:

param deployZone bool

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

Sie können Bedingungen mit Abhängigkeitsdeklarationen verwenden. Bei expliziten Abhängigkeiten entfernt Azure Resource Manager diese automatisch aus den erforderlichen Abhängigkeiten, wenn die Ressource nicht bereitgestellt wird. Für implizite Abhängigkeiten ist das Verweisen auf eine Eigenschaft einer bedingten Ressource zulässig, kann aber zu einem Bereitstellungsfehler führen.

Neue oder vorhandene Ressource

Sie können bedingte Bereitstellung verwenden, um eine neue Ressource zu erstellen oder eine vorhandene zu verwenden. Das folgende Beispiel zeigt, wie Sie ein neues Speicherkonto bereitstellen oder ein vorhandenes Speicherkonto verwenden.

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

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

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

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

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

Wenn der Parameter newOrExisting auf new festgelegt ist, wird die Bedingung zu „true“ ausgewertet. Das Speicherkonto wird bereitgestellt. Andernfalls wird das vorhandene Speicherkonto verwendet.

Warnung

Wenn Sie auf eine bedingt bereitgestellte Ressource verweisen, die Ressource jedoch nicht bereitgestellt wird, wird eine Fehlermeldung angezeigt. Die Fehlermeldung gibt an, dass die Ressource in der Vorlage nicht definiert ist.

Laufzeitfunktionen

Wenn Sie eine Referenz - oder Listenfunktion mit einer Ressource verwenden, die Sie für die bedingte Bereitstellung angeben, wird die Funktion ausgewertet. Wenn die Ressource nicht bereitgestellt wird, wird eine Fehlermeldung angezeigt.

Verwenden Sie den bedingten Ausdruck ?: Operator, um sicherzustellen, dass die Funktion nur für Bedingungen ausgewertet wird, wenn die Ressource bereitgestellt wird. In der folgenden Beispielvorlage wird gezeigt, wie Sie diese Funktion mit Ausdrücken verwenden, die nur bedingt gültig sind.

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

resource vmName_omsOnboarding 'Microsoft.Compute/virtualMachines/extensions@2025-04-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ächste Schritte