Bagikan melalui


Penyebaran bersyarat di Bicep dengan ekspresi if

Untuk menyebarkan sumber daya atau modul secara opsional di Bicep, gunakan if ekspresi . Ekspresi if mencakup kondisi yang bernilai true atau false. Ketika kondisi if benar, sumber daya disebarkan. Ketika nilainya salah, sumber daya tidak dibuat. Anda hanya dapat menerapkan nilai ke seluruh sumber daya atau modul.

Peringatan

Penyebaran bersyarat tidak diterapkan ke sumber daya anak. Jika Anda ingin menyebarkan sumber daya utama dan sumber daya anak secara kondisional, Anda harus menerapkan kondisi yang sama pada setiap jenis sumber daya.

Kode diagnostik Bicep BCP318 terjadi ketika Anda mencoba mengakses properti pada sumber daya bersyarat yang mungkin null jika sumber daya tidak disebarkan. Untuk menekan peringatan atau mencegah pengecualian runtime, gunakan operator pengampunan null atau operator dereferensi aman. Untuk informasi selengkapnya, lihat BCP318.

Menentukan kondisi untuk penyebaran

Di Bicep, Anda dapat menyebarkan sumber daya secara kondisional dengan meneruskan parameter yang menentukan apakah sumber daya disebarkan. Uji kondisi dengan ekspresi if dalam deklarasi sumber daya. Contoh berikut menunjukkan sintaks untuk if ekspresi dalam file Bicep. Ini secara kondisional menyebarkan zona Sistem Nama Domain (DNS). Ketika deployZone adalah true, itu mengimplementasikan zona DNS. Ketika deployZone adalah false, ia melewatkan penyebaran zona DNS.

param deployZone bool

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

Contoh berikut secara kondisional menyebarkan modul:

param deployZone bool

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

Anda dapat menggunakan kondisi dengan deklarasi dependensi. Untuk dependensi eksplisit, Azure Resource Manager secara otomatis menghapusnya dari dependensi yang diperlukan saat sumber daya tidak disebarkan. Untuk dependensi implisit, merujuk properti sumber daya kondisional diizinkan tetapi mungkin menghasilkan kesalahan penyebaran.

Sumber daya baru atau yang sudah ada

Anda dapat menggunakan penyebaran kondisional untuk membuat sumber daya baru atau menggunakan sumber daya yang sudah ada. Contoh berikut menunjukkan cara menyebarkan akun penyimpanan baru atau menggunakan akun penyimpanan yang sudah ada.

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

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

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

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

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

Ketika parameter newOrExisting diatur ke baru, kondisi bernilai benar. Akun penyimpanan telah diterapkan. Jika tidak, akun penyimpanan yang ada digunakan.

Peringatan

Jika Anda mereferensikan sumber daya yang disebarkan secara kondisional tetapi sumber daya tidak disebarkan, Anda mendapatkan kesalahan. Pesan kesalahan menyatakan bahwa sumber daya tidak ditentukan dalam templat.

Fungsi runtime

Jika Anda menggunakan fungsi referensi atau daftar dengan sumber daya yang Anda tentukan untuk penyebaran bersyarkat, fungsi akan dievaluasi. Jika sumber daya tidak disebarkan, Anda mendapatkan kesalahan.

Gunakan operator ekspresi bersyarat ?: untuk memastikan bahwa fungsi hanya dievaluasi untuk kondisi saat sumber daya disebarkan. Contoh templat berikut menunjukkan cara menggunakan fungsi ini dengan ekspresi yang hanya valid secara kondisional.

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

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

Langkah berikutnya