在 Bicep 中使用 if 表达式进行条件部署

若要选择在 Bicep 中部署资源或模块,请使用 if 表达式。 if 表达式包含解析为 true 或 false 的条件。 当 if 条件为 true 时,将部署资源。 如果值为 false,则未创建该资源。 值只能应用到整个资源或模块。

注意

条件部署不会级联到子资源。 如果要有条件地部署资源及其子资源,需要对每种资源类型应用相同的条件。

定义部署条件

在 Bicep 中,你可以通过传入指定是否部署资源的参数来有条件地部署资源。 可以在资源声明中使用 if 表达式来测试条件。 以下示例显示了 Bicep 文件中 if 表达式的语法。 它会按条件部署 DNS 区域。 当 deployZonetrue 时,它将部署 DNS 区域。 如果 deployZonefalse 时,它将跳过部署 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 资源管理器会在资源不部署时,自动将其从必需依赖项中删除。 对于隐式依赖项,允许引用条件资源的属性,但这样可能会导致部署错误。

新资源或现有资源

可以使用条件部署来创建新资源或使用现有资源。 以下示例演示如何部署新的存储帐户或使用现有存储帐户。

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。 将部署存储帐户。 否则使用现有的存储帐户。

警告

如果引用未部署的按条件部署资源。 你将收到一条错误,指出该资源未在模板中定义。

运行时函数

如果对条件性部署的资源使用 referencelist 函数,则会对该函数进行评估,即使资源尚未部署。 如果该函数引用某个不存在的资源,则会出现错误。

使用条件表达式 ?: 运算符可确保仅在部署资源时才针对条件来计算函数。 以下示例模板演示了如何将此函数与仅在特定条件下有效的表达式配合使用。

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

后续步骤