Bedingtes Bereitstellen von Ressourcen
Sie können Bedingungen in Ihrem Bicep-Code verwenden, um Ressourcen nur dann bereitzustellen, wenn bestimmte Einschränkungen gelten.
Beispielsweise müssen Sie in Ihrem Spielwarenunternehmen Ressourcen für verschiedene Umgebungen bereitstellen. Wenn Sie sie in einer Produktionsumgebung bereitstellen, müssen Sie sicherstellen, dass für Ihre logischen Azure SQL-Server die Überwachungsfunktion aktiviert ist. Wenn Sie jedoch Ressourcen in Entwicklungsumgebungen bereitstellen, möchten Sie die Überwachung nicht aktivieren. Sie möchten eine einzige Vorlage verwenden, um Ressourcen in all Ihren Umgebungen bereitzustellen.
In dieser Lerneinheit erfahren Sie, wie Sie Ressourcen bedingt bereitstellen.
Verwenden grundlegender Bedingungen
Bei der Bereitstellung einer Ressource in Bicep können Sie das Schlüsselwort if
gefolgt von einer Bedingung angeben. Die Bedingung muss in einen booleschen Wert (TRUE oder FALSE) ausgewertet werden. Wenn der Wert TRUE lautet, wird die Ressource bereitgestellt. Lautet der Wert FALSE, wird die Ressource nicht bereitgestellt.
Es ist gängige Praxis, Bedingungen basierend auf den Werten der von Ihnen angegebenen Parameter zu erstellen. Der folgende Code stellt beispielsweise ein Speicherkonto nur dann bereit, wenn der Parameter „deployStorageAccount
“ auf true
festgelegt ist:
param deployStorageAccount bool
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (deployStorageAccount) {
name: 'teddybearstorage'
location: resourceGroup().location
kind: 'StorageV2'
// ...
}
Beachten Sie, dass sich das Schlüsselwort if
in derselben Zeile wie die Ressourcendefinition befindet.
Verwenden von Ausdrücken als Bedingungen
Das vorherige Beispiel war recht einfach. Der Parameter deployStorageAccount
war vom Typ bool
, daher ist klar ersichtlich, ob er den Wert true
oder false
aufweist.
In Bicep können Bedingungen auch Ausdrücke enthalten. Im folgenden Beispiel stellt der Code eine SQL-Überwachungsressource nur dann bereit, wenn der Wert des Parameters environmentName
gleich Production
ist:
@allowed([
'Development'
'Production'
])
param environmentName string
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (environmentName == 'Production') {
parent: server
name: 'default'
properties: {
}
}
Es ist in der Regel ratsam, eine Variable für den Ausdruck zu erstellen, den Sie als Bedingung verwenden. Auf diese Weise ist Ihre Vorlage einfacher zu verstehen und zu lesen. Hier sehen Sie ein Beispiel:
@allowed([
'Development'
'Production'
])
param environmentName string
var auditingEnabled = environmentName == 'Production'
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
Abhängen von bedingt bereitgestellten Ressourcen
Wenn Sie Ressourcen bedingt bereitstellen, ist es gelegentlich wichtig zu wissen, wie Bicep die Abhängigkeiten zwischen ihnen auswertet.
Wir verfassen jetzt Bicep-Code für die Bereitstellung von SQL-Überwachungseinstellungen. In der Bicep-Datei muss außerdem eine Speicherkontoressource deklariert werden, wie hier gezeigt:
@allowed([
'Development'
'Production'
])
param environmentName string
param location string = resourceGroup().location
param auditStorageAccountName string = 'bearaudit${uniqueString(resourceGroup().id)}'
var auditingEnabled = environmentName == 'Production'
var storageAccountSkuName = 'Standard_LRS'
resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
name: auditStorageAccountName
location: location
sku: {
name: storageAccountSkuName
}
kind: 'StorageV2'
}
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
Beachten Sie, dass auch das Speicherkonto eine Bedingung aufweist. Dies bedeutet, dass es ebenfalls nur für Produktionsumgebungen bereitgestellt wird. Die Ressource für SQL-Überwachungseinstellungen kann jetzt auf die Details des Speicherkontos verweisen:
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
state: 'Enabled'
storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
}
}
Beachten Sie, dass dieser Bicep-Code den Fragezeichenoperator (?
) in den Eigenschaften storageEndpoint
und storageAccountAccessKey
verwendet. Wenn der Bicep-Code in einer Produktionsumgebung bereitgestellt wird, werden die Ausdrücke anhand der Details aus dem Speicherkonto ausgewertet. Wenn der Code in einer Nicht-Produktionsumgebung bereitgestellt wird, werden die Ausdrücke zu einer leeren Zeichenfolge (''
) ausgewertet.
Sie fragen sich vielleicht, warum dieser Code notwendig ist, da auditingSettings
und auditStorageAccount
beide dieselbe Bedingung aufweisen und Sie daher nie eine Ressource für SQL-Überwachungseinstellungen ohne Speicherkonto bereitstellen müssen. Auch wenn dies zutrifft, wertet Azure Resource Manager Eigenschaftsausdrücke vor den Bedingungen für die Ressourcen aus. Das bedeutet Folgendes: Wenn der Bicep-Code daher diesen Ausdruck nicht enthält, tritt bei der Bereitstellung der Fehler ResourceNotFound
auf.
Hinweis
Sie können keine zwei Ressourcen mit dem gleichen Namen in derselben Bicep-Datei definieren und dann nur eine davon bedingt bereitstellen. Die Bereitstellung ist nicht möglich, weil Resource Manager dies als Konflikt betrachtet.
Wenn Sie über mehrere Ressourcen mit der gleichen Bedingung für die Bereitstellung verfügen, sollten Sie die Verwendung von Bicep-Modulen in Betracht ziehen. Sie können ein Modul erstellen, das alle Ressourcen bereitstellt, und dann eine Bedingung für die Moduldeklaration in Ihrer Bicep-Hauptdatei festlegen.