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. Der Wert kann nur auf die gesamte Ressource bzw. auf das gesamte Modul angewendet werden.

Hinweis

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.

Schulungsressourcen

Wenn Sie Bedingungen lieber anhand einer Schritt-für-Schritt-Anleitung lernen möchten, lesen Sie Flexible Bizeps-Vorlagen mithilfe von Bedingungen und Schleifen erstellen.

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 ist. Sie testen die Bedingung mit einem if-Ausdruck in der Ressourcendeklaration. Das folgende Beispiel zeigt die Syntax für einen if-Ausdruck in einer Bicep-Datei. Dieser Ausdruck dient zur bedingungsbasierten Bereitstellung einer DNS-Zone. Wenn deployZone gleich true ist, wird die DNS-Zone bereitgestellt. Wenn deployZone gleich false ist, wird die Bereitstellung der DNS-Zone übersprungen.

param deployZone bool

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

Im nächsten Beispiel wird ein Modul bedingt bereitgestellt.

param deployZone bool

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

Bedingungen können mit Abhängigkeitsdeklarationen verwendet werden. Bei expliziten Abhängigkeiten entfernt Azure Resource Manager sie automatisch aus den erforderlichen Abhängigkeiten, wenn die Ressource nicht bereitgestellt wird. Bei impliziten Abhängigkeiten kann zwar auf eine Eigenschaft einer bedingten Ressource verwiesen werden, dies kann allerdings einen Bereitstellungsfehler zur Folge haben.

Neue oder vorhandene Ressource

Sie können bedingte Bereitstellung verwenden, um eine neue Ressource zu erstellen oder eine vorhandene zu verwenden. Im folgenden Beispiel wird gezeigt, wie ein neues Speicherkonto bereitgestellt oder ein vorhandenes Speicherkonto verwendet wird.

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)

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 nicht bereitgestellt wird. Sie erhalten eine Fehlermeldung, die besagt, dass die Ressource in der Vorlage nicht definiert ist.

Laufzeitfunktionen

Bei Verwendung einer Funktion vom Typ reference oder list mit einer Ressource, die bedingt bereitgestellt wird, wird die Funktion auch dann ausgewertet, wenn die Ressource nicht bereitgestellt wird. Es wird eine Fehlermeldung angezeigt, wenn die Funktion auf eine nicht vorhandene Ressource verweist.

Verwenden Sie den Operator Bedingter Ausdruck ?:, 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@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ächste Schritte