Bicep'te if ifadesiyle koşullu dağıtımlar

İsteğe bağlı olarak Bicep'te bir kaynak veya modül dağıtmak için ifadesini if kullanın. İfade if , true veya false olarak çözümleyen bir koşul içerir. if Koşul true olduğunda kaynak dağıtılır. Değer false olduğunda kaynak oluşturulmaz. Değer yalnızca kaynağın veya modülün tamamına uygulanabilir.

Dekont

Koşullu dağıtım alt kaynaklara art arda gelmez. Bir kaynağı ve alt kaynaklarını koşullu olarak dağıtmak istiyorsanız, her kaynak türüne aynı koşulu uygulamanız gerekir.

Eğitim kaynakları

Adım adım yönergeler aracılığıyla koşullar hakkında bilgi edinmek isterseniz bkz . Koşulları ve döngüleri kullanarak esnek Bicep şablonları oluşturma.

Dağıtım koşulunu tanımlama

Bicep'te, kaynağın dağıtılıp dağıtılmadığını belirten bir parametre geçirerek bir kaynağı koşullu olarak dağıtabilirsiniz. Koşulu kaynak bildiriminde bir if ifadeyle test edebilirsiniz. Aşağıdaki örnekte, Bicep dosyasındaki bir if ifadenin söz dizimi gösterilmektedir. Bir DNS bölgesini koşullu olarak dağıtır. olduğunda deployZonetrue, DNS bölgesini dağıtır. olduğunda deployZonefalse, DNS bölgesini dağıtmayı atlar.

param deployZone bool

resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

Sonraki örnek, bir modülü koşullu olarak dağıtır.

param deployZone bool

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

Koşullar bağımlılık bildirimleriyle kullanılabilir. Açık bağımlılıklar için Azure Resource Manager, kaynak dağıtılmadığında gerekli bağımlılıklardan otomatik olarak kaldırır. Örtük bağımlılıklar için, koşullu kaynağın özelliğine başvurmaya izin verilir, ancak dağıtım hatasına neden olabilir.

Yeni veya mevcut kaynak

Koşullu dağıtımı kullanarak yeni bir kaynak oluşturabilir veya var olan bir kaynağı kullanabilirsiniz. Aşağıdaki örnekte yeni bir depolama hesabının nasıl dağıtılacağı veya mevcut bir depolama hesabının nasıl kullanılacağı gösterilmektedir.

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)

Parametresi newOrExisting yeni olarak ayarlandığında koşul true olarak değerlendirilir. Depolama hesabı dağıtılır. Aksi takdirde mevcut depolama hesabı kullanılır.

Uyarı

Dağıtılmayan koşullu olarak dağıtılan bir kaynağa başvurursanız. Kaynağın şablonda tanımlanmadığını belirten bir hata alırsınız.

Çalışma zamanı işlevleri

Koşullu olarak dağıtılan bir kaynakla bir başvuru veya liste işlevi kullanırsanız, kaynak dağıtılmasa bile işlev değerlendirilir. İşlev var olmayan bir kaynağa başvuruyorsa bir hata alırsınız.

İşlevin yalnızca kaynak dağıtıldığında koşullar için değerlendirildiğinden emin olmak için ?: koşullu ifadesini kullanın. Aşağıdaki örnek şablonda bu işlevin yalnızca koşullu olarak geçerli ifadelerle nasıl kullanılacağı gösterilmektedir.

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

Sonraki adımlar