Поделиться через


Условные развертывания в Bicep с выражением if

Чтобы по желанию развернуть ресурс или модуль в Bicep, используйте выражение if. if Выражение включает условие, определяющее истинность или ложность. if Если условие имеет значение true, ресурс развертывается. Если значение false, ресурс не создан. Значение можно применить только ко всему ресурсу или модулю.

Примечание.

Условное развертывание не распространяется каскадом на дочерние ресурсы. Если требуется условно развернуть ресурс и его дочерние ресурсы, необходимо применить одно и то же условие к каждому типу ресурсов.

Обучающие материалы

Если вы предпочитаете изучать условия с пошаговыми инструкциями, обратитесь к Созданию гибких шаблонов Bicep с помощью условий и циклов.

Определение условия развертывания

В Bicep можно условно развернуть ресурс, передав параметр, который определяет, нужно ли развернуть ресурс. Проверьте условие при помощи if выражения в объявлении ресурса. В следующем примере показан синтаксис выражения if в файле Bicep. Он условно развертывает зону доменных имен (DNS). Когда deployZonetrue, он развертывает зону DNS. Если deployZone является false, он пропускает развертывание зоны DNS.

param deployZone bool

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

Следующий пример условно развертывает модуль:

param deployZone bool

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

Условия можно использовать с объявлениями зависимостей. Для явных зависимостей Azure Resource Manager автоматически удаляет их из необходимых зависимостей, когда ресурс не развернут. Для неявных зависимостей ссылка на свойство условного ресурса разрешена, но может привести к ошибке развертывания.

Новый или существующий ресурс

Вы можете воспользоваться условным развертыванием, чтобы создать новый ресурс или использовать существующий. В следующем примере показано, как развернуть новую учетную запись хранения или использовать существующую учетную запись хранения.

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

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

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

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

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

Если для параметра newOrExisting задано значение new, условие принимает значение true. Учетная запись хранения развертывается. В противном случае используется существующая учетная запись хранения.

Предупреждение

Если вы ссылаетесь на условно развернутый ресурс, но ресурс не развернут, вы получите ошибку. Сообщение об ошибке указывает, что ресурс не определен в шаблоне.

Функции времени выполнения

Если вы используете функцию ссылки или списка вместе с ресурсом, который вы указываете для условного развертывания, функция будет оценена. Если ресурс не развернут, вы получите ошибку.

Используйте условное выражение ?: оператор, чтобы убедиться, что функция вычисляется только для условий при развертывании ресурса. В следующем примере шаблона показано использование этой функции с выражениями, которые являются только условно допустимыми.

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

resource vmName_omsOnboarding 'Microsoft.Compute/virtualMachines/extensions@2024-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')

Следующие шаги