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


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

Чтобы по желанию развернуть ресурс или модуль в Bicep, используйте выражение if. if Выражение включает условие, разрешающее значение true или false. 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')

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