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

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

Примечание.

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

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

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

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

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

param deployZone bool

resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = 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@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)

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

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

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

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

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

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

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')

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