Kaynakları koşullu olarak dağıtma

Tamamlandı

Kaynakları yalnızca belirli kısıtlamalar olduğunda dağıtmak için Bicep kodunuzdaki koşulları kullanabilirsiniz.

Örneğin, oyuncak şirketinizde kaynakları çeşitli ortamlara dağıtmanız gerekir. Bunları bir üretim ortamına dağıtırken, Azure SQL mantıksal sunucularınız için denetimin etkinleştirildiğinden emin olmanız gerekir. Ancak geliştirme ortamlarına kaynak dağıttığınızda denetimi etkinleştirmek istemezsiniz. Kaynakları tüm ortamlarınıza dağıtmak için tek bir şablon kullanmak istiyorsunuz.

Bu ünitede kaynakları koşullu olarak dağıtmayı öğreneceksiniz.

Temel koşulları kullanma

Bicep'te bir kaynak dağıttığınızda, anahtar sözcüğünü if ve ardından bir koşul sağlayabilirsiniz. Koşul bir Boole (true veya false) değerine çözümlenmelidir. Değer true ise kaynak dağıtılır. Değer false ise, kaynak dağıtılmaz.

Sağladığınız parametrelerin değerlerine göre koşullar oluşturmak yaygın bir durum olabilir. Örneğin, aşağıdaki kod yalnızca deployStorageAccount parametresi olarak ayarlandığında truebir depolama hesabı dağıtır:

param deployStorageAccount bool

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (deployStorageAccount) {
  name: 'teddybearstorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  // ...
}

Anahtar sözcüğün if kaynak tanımıyla aynı satırda olduğuna dikkat edin.

İfadeleri koşul olarak kullanma

Yukarıdaki örnek oldukça basitti. deployStorageAccount parametresi türünde boololduğundan veya falsedeğerine true sahip olup olmadığı açıktır.

Bicep'te koşullar ifadeleri de içerebilir. Aşağıdaki örnekte kod, yalnızca parametre değeri değerine eşit Productionolduğunda environmentName bir SQL denetim kaynağı dağıtır:

@allowed([
  'Development'
  'Production'
])
param environmentName string

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (environmentName == 'Production') {
  parent: server
  name: 'default'
  properties: {
  }
}

Genellikle koşul olarak kullandığınız ifade için bir değişken oluşturmak iyi bir fikirdir. Bu şekilde, şablonunuzu anlamak ve okumak daha kolaydır. Bir örnek aşağıda verilmiştir:

@allowed([
  'Development'
  'Production'
])
param environmentName string

var auditingEnabled = environmentName == 'Production'

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

Koşullu olarak dağıtılan kaynaklara bağımlı

Kaynakları koşullu olarak dağıttığınızda, Bazen Bicep'in aralarındaki bağımlılıkları nasıl değerlendirip değerlendireceğini bilmeniz gerekir.

SQL denetim ayarlarını dağıtmak için bazı Bicep kodu yazmaya devam edelim. Bicep dosyasının da burada gösterildiği gibi bir depolama hesabı kaynağı bildirmesi gerekir:

@allowed([
  'Development'
  'Production'
])
param environmentName string
param location string = resourceGroup().location
param auditStorageAccountName string = 'bearaudit${uniqueString(resourceGroup().id)}'

var auditingEnabled = environmentName == 'Production'
var storageAccountSkuName = 'Standard_LRS'

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
}

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

Depolama hesabının da bir koşulu olduğuna dikkat edin. Bu, üretim dışı ortamlar için de dağıtılmayacağı anlamına gelir. SQL denetim ayarları kaynağı artık depolama hesabı ayrıntılarına başvurabilir:

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

Bu Bicep kodunun ve storageAccountAccessKey özellikleri içindeki soru işareti (?) işlecini kullandığına storageEndpoint dikkat edin. Bicep kodu bir üretim ortamına dağıtıldığında, ifadeler depolama hesabından ayrıntılara değerlendirilir. Kod üretim dışı bir ortama dağıtıldığında ifadeler boş bir dizeye ()'' göre değerlendirilir.

Bu kodun neden gerekli olduğunu merak edebilirsiniz çünkü auditingSettings ve auditStorageAccount her ikisi de aynı koşula sahiptir ve bu nedenle depolama hesabı olmadan bir SQL denetim ayarları kaynağı dağıtmanız gerekmez. Bu doğru olsa da Azure Resource Manager, kaynaklardaki koşullu işlemlerden önce özellik ifadelerini değerlendirir. Bu, Bicep kodunda bu ifade yoksa dağıtımın bir ResourceNotFound hatayla başarısız olacağı anlamına gelir.

Dekont

Aynı Bicep dosyasında aynı ada sahip iki kaynak tanımlayıp yalnızca birini koşullu olarak dağıtamazsınız. Resource Manager bunu çakışma olarak görüntülediğinden dağıtım başarısız olur.

Dağıtım için aynı koşula sahip olan birkaç kaynağınız varsa Bicep modüllerini kullanmayı göz önünde bulundurun. Tüm kaynakları dağıtan bir modül oluşturabilir ve ardından ana Bicep dosyanızdaki modül bildirimine bir koşul koyabilirsiniz.