Условное развертывание ресурсов
Вы можете использовать условия в коде Bicep для развертывания ресурсов только при наличии конкретных ограничений.
Например, для вашей компании по производству игрушек необходимо развернуть ресурсы в различных окружениях. При их развертывании в рабочей среде необходимо убедиться, что для логических серверов Azure SQL включен аудит. Но при развертывании ресурсов в средах разработки вы не хотите включать аудит. Вы хотите использовать один шаблон для развертывания ресурсов во всех средах.
В этом уроке вы узнаете, как условно развертывать ресурсы.
Использование базовых условий
При развертывании ресурса в Bicep можно указать ключевое слово if
, за которым должно следовать условие. Условие должно разрешаться в логическое значение (True или False). Если указано значение True, ресурс развертывается. Если указано значение False, ресурс не развертывается.
Как правило, условия создаются на основе значений предоставленных параметров. Например, указанный ниже код развертывает учетную запись хранения, только если для параметра deployStorageAccount
указано значение true
.
param deployStorageAccount bool
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (deployStorageAccount) {
name: 'teddybearstorage'
location: resourceGroup().location
kind: 'StorageV2'
// ...
}
Обратите внимание, что ключевое слово if
находится в той же строке, что и определение ресурса.
Использование выражений как условий
Предыдущий пример был довольно примитивен. Параметр deployStorageAccount
имел тип bool
, поэтому было ясно, имеет ли он значение true
или false
.
В Bicep условия могут также включать выражения. В следующем примере код развертывает ресурс аудита SQL только в том случае, если значение параметра environmentName
равно Production
:
@allowed([
'Development'
'Production'
])
param environmentName string
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (environmentName == 'Production') {
parent: server
name: 'default'
properties: {
}
}
Обычно рекомендуется создать переменную для выражения, которое используется в качестве условия. Таким образом шаблон проще понимать и читать. Приведем пример:
@allowed([
'Development'
'Production'
])
param environmentName string
var auditingEnabled = environmentName == 'Production'
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
Зависимость от условно развернутых ресурсов
При условном развертывании ресурсов иногда необходимо учитывать то, как Bicep оценивает зависимости между ними.
Давайте напишем код Bicep для развертывания параметров аудита SQL. Файл Bicep также должен объявить ресурс учетной записи хранения, как показано ниже:
@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@2024-05-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
Обратите внимание, что в учетной записи также есть условие. Это означает, что она не будет развернута для нерабочих сред. Теперь ресурс параметров аудита SQL может ссылаться на сведения об учетной записи хранения:
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-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 : ''
}
}
Обратите внимание, что этот код Bicep использует оператор вопросительного знака (?
) в свойствах storageEndpoint
и storageAccountAccessKey
. При развертывании кода Bicep в рабочей среде выражения оцениваются с учетом сведений из учетной записи хранения. При развертывании кода в нерабочей среде выражения оцениваются как пустые строки (''
).
У вас может возникнуть вопрос, зачем нужен этот код, так как auditingSettings
и auditStorageAccount
имеют одинаковое условие, и поэтому вам никогда не нужно развертывать ресурс параметров аудита SQL без учетной записи хранения. Хотя это и так, Azure Resource Manager оценивает выражения свойств перед условиями ресурсов. Это означает, что если код Bicep не имеет этого выражения, развертывание завершится ошибкой ResourceNotFound
.
Примечание.
Нельзя определить два ресурса с одинаковыми именами в одном файле Bicep, а затем условно развернуть только один из них. Развертывание завершится ошибкой, так как Resource Manager интерпретирует это как конфликт.
Если у вас есть несколько ресурсов с одинаковым условием для развертывания, можно использовать модули Bicep. Вы можете создать модуль, который развертывает все ресурсы, а затем поместить условие в объявление модуля в основной файл Bicep.