Bagikan melalui


Penyebaran berskala di Bicep dengan ekspresi if

Untuk menyebarkan sumber daya atau modul secara opsional di Bicep, gunakan if ekspresi . Ekspresi if menyertakan kondisi yang diselesaikan ke true atau false. if Ketika kondisinya benar, sumber daya disebarkan. Saat bernilai false, sumber daya tidak dibuat. Nilai hanya dapat diterapkan ke seluruh sumber daya atau modul.

Catatan

Penyebaran kondisional tidak melakukan kaskade ke sumber daya turunan. Jika Anda ingin meyebarkan sumber daya dan turunannya secara kondisional, Anda harus menerapkan kondisi yang sama untuk setiap jenis sumber daya.

Sumber daya pelatihan

Jika Anda ingin mempelajari kondisi melalui panduan langkah demi langkah, lihat Membangun template Bicep yang fleksibel dengan menggunakan kondisi dan perulangan.

Menentukan kondisi untuk penyebaran

Di Bicep, Anda dapat menyebarkan sumber daya secara kondisional dengan meneruskan parameter yang menentukan apakah sumber daya disebarkan. Anda menguji kondisi dengan if ekspresi dalam deklarasi sumber daya. Contoh berikut menunjukkan sintaks untuk if ekspresi dalam file Bicep. Ini secara kondisional menyebarkan zona DNS. Kapan deployZone , trueia menyebarkan zona DNS. Kapan deployZone , falseia melompati penyebaran zona DNS.

param deployZone bool

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

Contoh berikutnya secara kondisional menyebarkan modul.

param deployZone bool

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

Kondisi dapat digunakan dengan deklarasi dependensi. Untuk dependensi eksplisit, Azure Resource Manager secara otomatis menghapusnya dari dependensi yang diperlukan ketika sumber daya tidak disebarkan. Untuk dependensi implisit, merujuk properti sumber daya kondisional diizinkan tetapi dapat 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@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)

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

Peringatan

Jika Anda mereferensikan sumber daya yang disebarkan secara kondisional yang tidak disebarkan. Anda akan mendapatkan kesalahan yang mengatakan sumber daya tidak ditentukan dalam templat.

Fungsi runtime

Jika Anda menggunakan fungsi referensi atau daftar dengan sumber daya yang diterapkan secara bersyarat, fungsi tersebut dievaluasi meskipun sumber daya tidak diterapkan. Anda mendapatkan kesalahan jika fungsi merujuk ke sumber daya yang tidak ada.

Gunakan operator ungkapan bersyarat ?: untuk memastikan fungsi hanya dievaluasi untuk kondisi saat sumber daya sedang 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@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')

Langkah berikutnya