إضافة المرونة باستخدام المعلمات والمتغيرات

مكتمل

تُعد القوالب فعالة بسبب إمكانية إعادة استخدامها. يمكنك استخدام Bicep لكتابة قوالب تقوم بنشر بيئات متعددة أو نُسخ من الموارد الخاصة بك.

تقوم شركة الألعاب الخاصة بك بتشغيل منتجات جديدة بانتظام، وتحتاج إلى استخدام قوالب Bicep لإنشاء موارد Azure المطلوبة لكل تشغيل منتج. يجب تجنب استخدام أسماء الموارد الثابتة. تحتاج العديد من أنواع موارد Azure إلى أسماء فريدة، لذا فإن تضمين الأسماء في القالب لديك يعني أنه لا يمكنك إعادة استخدام القالب لإطلاق منتجات متعددة. يجب عليك أيضاً نشر الموارد في مواقع مختلفة اعتماداً على مكان إطلاق الألعاب، مما يعني أنه لا يمكنك تضمين مواقع الموارد في القالب أيضاً.

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

إشعار

يتم عرض الأوامر في هذه الوحدة لتوضيح المفاهيم. لا تشغّل الأوامر الآن. ستتدرب على ما تتعلمه هنا قريبا.

المعلمات والمتغيرات

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

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

عادةً يكون من الجيد استخدام معلمات للأشياء التي ستتغير بين كل عملية نشر، مثل:

  • أسماء الموارد التي يجب أن تكون فريدة.
  • المواقع التي سيتم نشر الموارد فيها.
  • الإعدادات التي تؤثر على تسعير الموارد، مثل وحدات SKU، ومستويات التسعير، وأعداد المثيلات الخاصة بها.
  • بيانات الاعتماد والمعلومات اللازمة للوصول إلى الأنظمة الأخرى غير المعرفة في القالب.

عادة ما تكون المتغيرات خيارا جيدا عندما تستخدم نفس القيم لكل عملية نشر، ولكنك تريد جعل قيمة قابلة لإعادة الاستخدام داخل القالب، أو عندما تريد استخدام التعبيرات لإنشاء قيمة معقدة. يمكنك أيضا استخدام المتغيرات للموارد التي لا تحتاج إلى أسماء فريدة.

تلميح

من المهم استخدام التسمية المناسبة للمعلمات والمتغيرات، بحيث تكون القوالب لديك سهلة القراءة والفهم. تأكد من استخدام أسماء واضحة ووصفية ومتسقة.

إضافة معلمة

في Bicep، يمكنك تعريف المعلمة كالتالي:

param appServiceAppName string

دعونا نعرف كيفية عمل كل جزء من هذا التعريف:

  • param يخبر Bicep بأنك تقوم بتعريف معلمة.
  • appServiceAppName هو اسم المعلمة. إذا كنت تقوم بنشر القالب يدويا، فقد يطلب منك إدخال قيمة، لذلك من المهم أن يكون الاسم واضحا ومفهولا. إن الاسم أيضاً هو طريقة إشارتك إلى قيمة المعلمة داخل القالب، تماماً كما هو الحال مع الأسماء الرمزية للمورد.
  • string هو نوع المعلمة. يمكنك تحديد عدة أنواع مختلفة لمعلمات Bicep، بما في ذلك string للنص والأرقام intbool والقيم المنطقية الصحيحة أو الخاطئة. يمكنك أيضًا تمرير المزيد من المعلمات المعقدة باستخدام النوعين array وobject.

تلميح

حاول عدم تعميم القوالب أكثر من اللازم باستخدام عدد كبير جداً من المعلمات. يجب استخدام أقل عدد من المعلمات التي تحتاجها لسيناريو عملك. تذكر أنه يمكنك دائمًا تغيير القوالب في المستقبل إذا تغيرت متطلباتك.

توفير القيم الافتراضية

يمكنك توفير قيمة افتراضية لإحدى المعلمات بشكل اختياري. عند تحديد قيمة افتراضية، تصبح المعلمة اختيارية. يمكن للشخص الذي يقوم بنشر القالب تحديد قيمة إذا أراد ذلك، ولكن إذا لم يكن كذلك، فإن Bicep يستخدم القيمة الافتراضية.

إليك كيفية إضافة قيمة افتراضية:

param appServiceAppName string = 'toy-product-launch-1'

إشعار

في هذا المثال، يحتوي اسم تطبيق Azure App Service على قيمة افتراضية للتعليمات البرمجية المضمنة. هذه ليست فكرة جيدة، لأن تطبيقات App Service تحتاج إلى أسماء فريدة. سيمكنك إصلاح هذا قريباً.

استخدام قيم المعلمات في القالب

بعد الإعلان عن معلمة، يمكنك الرجوع إليها في بقية القالب. لنعرف كيف يمكنك استخدام المعلمة الجديدة ضمن تعريف المورد:

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: 'eastus'
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

لاحظ أن القالب يستخدم الآن قيمة المعلمة لتعيين اسم المورد لمورد التطبيق، بدلا من قيمة تعليمات برمجية مضمنة.

تلميح

يعرض لك ملحق Bicep لـ Visual Studio Code مؤشرات مرئية لإعلامك إذا كنت لا تتبع الممارسات الموصى بها. على سبيل المثال، يحذرك عند تعريف معلمة لا تستخدمها. تعمل أداة تحليل Bicep على تشغيل عمليات التحقق هذه باستمرار أثناء عملك.

إضافة متغير

يمكنك تعريف متغير بهذه الطريقة:

var appServicePlanName = 'toy-product-launch-plan'

يتم تعريف المتغيرات بطريقة مشابهة للمعلمات، ولكن هناك بعض الاختلافات:

  • استخدم الكلمة الأساسية var لإخبار Bicep بأنك تُعلن عن متغير.
  • يجب توفير قيمة للمتغير.
  • لا تحتاج المتغيرات إلى أنواع. يمكن ل Bicep تحديد النوع استنادا إلى القيمة التي قمت بتعيينها.

Expressions

عند كتابة القوالب، غالباً لا تريد قيم تعليمات برمجية مضمنة أو حتى طلب تحديدها في المعلمة. بدلاً من ذلك، ستريد اكتشاف قيم عند تشغيل القالب. على سبيل المثال، ربما تريد توزيع جميع الموارد في القالب إلى منطقة Azure واحدة - أي المنطقة التي أنشأت فيها مجموعة الموارد. أو قد تحتاج إلى إنشاء اسم فريد لمورد استناداً إلى إستراتيجية تسمية معينة تستخدمها شركتك تلقائياً.

تُعد التعبيرات في Bicep ميزة فعالة تساعدك على التعامل مع جميع السيناريوهات المهمة. دعونا نلقِ نظرة على بعض الأماكن إذ يمكنك استخدام التعبيرات في قالب Bicep.

مواقع الموارد

عند كتابة قالب ونشره، غالباً لا تحتاج إلى تحديد موقع كل مورد على حدة. بدلا من ذلك، قد يكون لديك قاعدة عمل بسيطة تنص، بشكل افتراضي، على نشر كافة الموارد في نفس الموقع الذي تم إنشاء مجموعة الموارد فيه.

في Bicep، يمكنك إنشاء معلمة باسم location ثم استخدام تعبير لتعيين قيمتها:

param location string = resourceGroup().location

لاحظ القيمة الافتراضية لتلك المعلمة. يستخدم دالة تسمى resourceGroup() تمنحك حق الوصول إلى معلومات حول مجموعة الموارد التي يتم نشر القالب فيها. في هذا المثال، يستخدم القالب خاصية location. من الشائع استخدام هذا النهج لتوزيع مواردك في نفس منطقة Azure، مثل مجموعة الموارد.

إذا كان شخص ما يقوم بنشر هذا القالب، فقد يختار تجاوز القيمة الافتراضية هنا واستخدام موقع آخر.

إشعار

يمكن توزيع بعض الموارد الموجودة في Azure إلى مواقع معينة فقط. قد تحتاج إلى معلمات منفصلة لتعيين مواقع هذه الموارد.

يمكنك الآن استخدام معلمة موقع المورد داخل القالب، بهذا الشكل:

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

أسماء الموارد

تحتاج العديد من موارد Azure إلى أسماء فريدة. في السيناريو الخاص بك، لديك اثنان من الموارد التي تحتاج إلى أسماء فريدة: حساب التخزين وتطبيق App Service. يجعل طلب تعيين هذه القيم كمعلمات الأمر صعباً على كل من يستخدم القالب، لأنه يحتاج إلى العثور على اسم لم يستخدمه أي شخص آخر.

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

إذا اخترت قيمة أولية جيدة، يمكنك الحصول على نفس الاسم في كل مرة تقوم فيها بنشر نفس مجموعة الموارد، ولكن ستحصل على اسم مختلف كلما قمت بنشر مجموعة مختلفة من الموارد باستخدام نفس القالب. لنلقِ نظرة على كيف يمكن أن تستخدم دالة uniqueString():

param storageAccountName string = uniqueString(resourceGroup().id)

تستخدم القيمة الافتراضية للمعلمة دالة resourceGroup() مرة أخرى، مثلما فعلت عند تعيين موقع المورد. على الرغم من ذلك، ستحصل هذه المرة على معرف مجموعة الموارد. إليك الشكل الذي يظهر به معرف مجموعة الموارد:

/subscriptions/3e57e557-826f-460b-8f1c-4ce38fd53b32/resourceGroups/MyResourceGroup

يشتمل معرف مجموعة الموارد على معرف اشتراك Azure (3e57e557-826f-460b-8f1c-4ce38fd53b32) واسم مجموعة الموارد (MyResourceGroup). غالباً ما يكون معرف مجموعة الموارد مرشحاً جيداً للقيمة الأولية الخاصة بأسماء الموارد، نظراً لما يلي:

  • في كل مرة تقوم فيها بنشر الموارد نفسها، فإنها ستنتقل إلى مجموعة الموارد نفسها. الدالة uniqueString() سوف ترجع نفس القيمة في كل مرة.
  • إذا قمت بالتوزيع في مجموعتين من الموارد المختلفة في اشتراك Azure، فستكون القيمة resourceGroup().id مختلفة نظرًا لاختلاف اسمي مجموعتي الموارد. ستقدم الدالة uniqueString() قيما مختلفة لكل مجموعة من الموارد.
  • إذا قمت بالنشر في اثنين من اشتراكات Azure المختلفة، حتى في حال استخدامك اسم مجموعة الموارد نفسه، فستكون القيمة resourceGroup().id مختلفة نظراً لاختلاف معرف اشتراك Azure. ستقدم الدالة uniqueString() مرة أخرى قيما مختلفة لكل مجموعة من الموارد.

تلميح

غالباً ما تكون فكرة جيدة عند استخدام تعبيرات القالب لإنشاء أسماء الموارد. يحتوي العديد من أنواع موارد Azure على قواعد بشأن الأحرف المسموح بها وطول أسمائها. إن تضمين إنشاء أسماء الموارد في القالب يعني أن أي شخص يستخدم القالب لا يجب أن يتذكر اتباع هذه القواعد بنفسه.

السلاسل المجمعة

إذا كنت تستخدم الدالة uniqueString() فقط لتعيين أسماء الموارد، فربما تحصل على الأسماء الفريدة - ولكنها لن تكون ذات معنى. يجب أن يكون اسم المورد الجيد وصفيا أيضا، بحيث يكون من الواضح ما هو المورد من أجله. غالباً ما تريد إنشاء اسم عن طريق الجمع بين كلمة أو سلسلة ذات معنى مع قيمة فريدة. وبهذه الطريقة، ستحصل على الموارد التي تتضمن أسماء و فريدة ذات معنى.

يحتوي Bicep على ميزة تُسمى استنتاج السلسلة التي تتيح لك إمكانية جمع السلاسل. دعونا نعرف طريقة القيام بذلك:

param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'

تحتوي الآن القيمة الافتراضية للمعلمة storageAccountName على جزأين:

  • toylaunch هي سلسلة ذات تعليمات برمجية مضمنة تساعد أي شخص ينظر إلى المورد المنشور في Azure على فهم الغرض من حساب التخزين.
  • ${uniqueString(resourceGroup().id)} هي طريقة ما لإخبار Bicep بتقييم ناتج الدالة uniqueString(resourceGroup().id)، ثم تسلسلها في السلسلة.

تلميح

في بعض الأحيان ستقوم دالة uniqueString() بإنشاء سلاسل تبدأ برقم. لا تسمح بعض موارد Azure، مثل حسابات التخزين، ببدء أسمائها بالأرقام. وهذا يعني أنها فكرة جيدة لاستخدام استنتاج سلسلة لإنشاء أسماء الموارد، كما في المثال السابق.

تحديد وحدات SKU للموارد

قد أُعجب أعضاء فريقك الآخرون بتعليمات Bicep البرمجية التي قمت بإنشائها إلى الآن. لقد قررت معا أنك ستستخدم القالب الخاص بك لنشر الموارد لدعم جميع عمليات تشغيلك الجديدة.

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

  • في البيئات الإنتاجية، سيتم توزيع حسابات التخزين في وحدة SKU Standard_GRS (تخزين متكرر جغرافيا) لمرونة أعلى. سيتم توزيع خطط App Service في وحدة SKU P2v3 لأداء أعلى.
  • في البيئات غير الإنتاجية، سيتم نشر حسابات التخزين في وحدة SKU Standard_LRS (تخزين للتكرار محلياً). سيتم نشر خطط App Service في وحدة F1 SKU مجاناً.

من إحدى الطرق لتنفيذ متطلبات العمل هذه هي استخدام المعلمات لتحديد كل وحدة من وحدات SKU. ومع ذلك، قد يصبح من الصعب إدارة تحديد كل SKU كمعلمة، خاصة عندما يكون لديك قوالب أكبر. هناك خيار آخر وهو تضمين قواعد العمل في القالب باستخدام مجموعة من المعلمات، والمتغيرات، والتعبيرات.

أولاً، يمكنك تحديد معلمة تشير إلى ما إذا كان النشر لبيئة إنتاجية أو غير إنتاجية:

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

لاحظ أن هذه التعليمة البرمجية تستخدم صيغة جديدة لتحديد قائمة القيم المسموح بها للمعلمة environmentType. لن يسمح Bicep لأي شخص بنشر القالب ما لم يوفر إحدى هذه القيم.

بعد ذلك، يمكنك إنشاء متغيرات تحدد وحدات SKU لاستخدامها لحساب التخزين وخطة App Service استناداً إلى البيئة:

var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2V3' : 'F1'

لاحظ بعض الصيغ الجديدة هنا أيضاً. دعونا نقوم بتصنيفها:

  • (environmentType == 'prod') يتم تقييمها إلى قيمة منطقية (صواب أو خطأ)، اعتمادا على القيمة المسموح بها المستخدمة للمعلمة environmentType .
  • ? يسمى عامل تشغيل ثلاثي، ويقيم عبارة if/then . القيمة بعد ? استخدام عامل التشغيل إذا كان التعبير صحيحا. إذا كان التعبير يقوم بالتقييم إلى خطأ، إذًا فإنه يتم استخدام القيمة التي تلي علامة النقطتين (:).

يمكننا ترجمة هذه القواعد إلى:

  • بالنسبة للمتغير storageAccountSkuName، إذا تم تعيين المعلمة environmentType إلى prod، فاستخدم وحدة Standard_GRS SKU. بخلاف ذلك، استخدم وحدة Standard_LRS SKU.
  • بالنسبة للمتغير appServicePlanSkuName، إذا تم تعيين المعلمة environmentType إلى prod، فاستخدم وحدة P2V3 SKU والمستوى PremiumV3. بخلاف ذلك، استخدم وحدة F1 SKU.

تلميح

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

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