Bicep 中使用 if 運算式的條件式部署

若要選擇性地在 Bicep 中部署資源或模組,請使用 if 運算式。 if 運算式包含一個會解析為 true 或 false 的條件。 當 if 條件為 true 時,便會部署資源。 當此值為 false 時,則不會部署資源。 此值只能套用至整個資源或模組。

注意

條件式部署不會串聯至子資源。 如果您想要有條件地部署資源及其子資源,必須將相同的條件套用至每個資源類型。

訓練資源

如果您比較想要透過逐步指導來了解條件,請參閱使用條件和迴圈來建立有彈性的 Bicep 範本

定義部署的條件

在 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 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。 系統便會部署儲存體帳戶。 否則會使用現有的儲存體帳戶。

警告

如果您參考未部署的條件式部署資源, 您將會收到錯誤,指出範本未定義該資源。

執行階段函式

如果您在條件式部署的資源中使用 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')

下一步