نشر الموارد بشكل مشروط

مكتمل

يمكنك استخدام الشروط في تعليمات Bicep البرمجية الخاصة بك لنشر الموارد فقط عند وجود قيود معينة.

على سبيل المثال، في شركة الألعاب الخاصة بك، تحتاج إلى نشر موارد في بيئات مختلفة. عند نشرها إلى بيئة إنتاج، تحتاج إلى التأكد من تمكين التدقيق لخوادم Azure SQL المنطقية. ولكن عند نشر الموارد في بيئات التطوير، لا تريد تمكين التدقيق. تريد استخدام قالب واحد لنشر الموارد في جميع البيئات الخاصة بك.

في هذه الوحدة، ستتعلم كيفية نشر الموارد بشكل مشروط.

استخدام الشروط الأساسية

عند نشر مورد في Bicep، يمكنك توفير الكلمة الأساسية if متبوعة بشرط. يجب أن يُحل الشرط إلى قيمة منطقية (صواب أو خطأ). إذا كانت القيمة صواب، يتم نشر المورد. إذا كانت القيمة خطأ، فلن يتم نشر المورد.

من الشائع إنشاء شروط استنادًا إلى قيم المعلمات التي توفرها. على سبيل المثال، تقوم التعليمات البرمجية التالية بنشر حساب تخزين فقط عند تعيين المعلمة deployStorageAccount إلى true:

param deployStorageAccount bool

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

لاحظ أن الكلمة الأساسية if على نفس السطر مثل تعريف المورد.

استخدام التعبيرات كشروط

كان المثال السابق أساسيًا جدًا. كانت المعلمة deployStorageAccount من النوع bool، لذا من الواضح ما إذا كانت قيمتها true أو false.

في Bicep، يمكن أن تتضمن الشروط تعبيرات أيضًا. في المثال التالي، تقوم التعليمات البرمجية بنشر مورد تدقيق SQL فقط عندما تكون قيمة المعلمة environmentName تساوي Production:

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

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

عادة ما يكون إنشاء متغيّر للتعبير الذي تستخدمه كشرط فكرة جيدة. بهذه الطريقة، يكون القالب الخاص بك أسهل في الفهم والقراءة. إليك مثال:

@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: {
  }
}

الاعتماد على الموارد المنشورة بشروط

عند نشر الموارد بشكل مشروط، ستحتاج أحيانًا إلى أن تكون على علم بكيفية تقييم Bicep للتبعيات بينها.

لنواصل كتابة بعض تعليمات Bicep البرمجية لنشر إعدادات تدقيق SQL. يحتاج ملف Bicep أيضًا إلى الإعلان عن مورد حساب تخزين، كما هو موضح هنا:

@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: {
  }
}

لاحظ أن حساب التخزين لديه شرط أيضًا. وهذا يعني أنه لن يتم نشره لبيئات غير الإنتاج أيضًا. ويمكن الآن لموارد إعدادات تدقيق SQL الإشارة لتفاصيل حساب التخزين:

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 : ''
  }
}

لاحظ أن تعليمة Bicep البرمجية تلك تستخدم عامل تشغيل علامة الاستفهام (?) ضمن خصائص storageEndpoint وstorageAccountAccessKey. عند نشر تعليمات Bicep البرمجية إلى بيئة إنتاج، يتم تقييم التعبيرات إلى التفاصيل من حساب التخزين. عند نشر التعليمات البرمجية إلى بيئة عدم إنتاج، يتم تقييم التعبيرات إلى سلسلة فارغة ('').

قد تتساءل لما قد تكون تلك التعليمات البرمجية ضرورية، لأن كلا auditingSettings وauditStorageAccount بهما نفس الشرط،، ولذلك لن تحتاج أبدًا إلى نشر مورد إعدادات تدقيق SQL بدون حساب تخزين. على الرغم من أن هذا صحيح، يقوم Azure Resource Manager بتقييم تعبيرات الخاصية قبل المشروطة على الموارد. وهذا يعني أنه إذا لم يكن رمز Bicep يحتوي على هذا التعبير، فسيفشل النشر مع وجود ResourceNotFound خطأ.

إشعار

لا يمكنك تعريف موردين بنفس الاسم في نفس ملف Bicep ثم نشر واحد منهم فقط بشكل مشروط. سيفشل النشر، لأن Resource Manager ينظر إلى هذا على أنه تعارض.

إذا كان لديك العديد من الموارد، لها نفس الشرط للنشر، ففكر في استخدام وحدات Bicep النمطية. يمكنك إنشاء وحدة نمطية تنشر جميع الموارد، ثم وضع شرط على إعلان الوحدة النمطية في ملف Bicep الرئيسي.