إضافة المرونة باستخدام المعلمات والمتغيرات
تُعد القوالب فعالة بسبب إمكانية إعادة استخدامها. يمكنك استخدام Bicep لكتابة قوالب تقوم بنشر بيئات متعددة أو نُسخ من الموارد الخاصة بك.
ستقوم شركة الألعاب بإطلاق منتجات جديدة بانتظام، وتحتاج إلى استخدام قوالب Bicep لإنشاء موارد Azure المطلوبة لكل عملية من عمليات إطلاق المنتج. يجب تجنب استخدام أسماء الموارد الثابتة. تحتاج العديد من أنواع موارد Azure إلى أسماء فريدة، لذا فإن تضمين الأسماء في القالب لديك يعني أنه لا يمكنك إعادة استخدام القالب لإطلاق منتجات متعددة. يجب عليك أيضاً نشر الموارد في مواقع مختلفة اعتماداً على مكان إطلاق الألعاب، مما يعني أنه لا يمكنك تضمين مواقع الموارد في القالب أيضاً.
في هذه الوحدة، ستتعرف على المعلمات والمتغيرات، وهما ميزتان لـ Bicep يمكنهما جعل القوالب لديك مرنة وقابلة لإعادة الاستخدام. ستتعرف أيضًا على التعبيرات.
ملاحظة
تُعرض الأوامر في هذه الوحدة لتوضيح المفاهيم. لا تقم بتشغيل الأوامر بعد. ستتدرب على ما تتعلمه هنا قريبًا.
المعلمات والمتغيرات
تتيح لك المعلمة إمكانية إحضار القيم من خارج ملف القالب. على سبيل المثال، إذا كان شخص ما يقوم بنشر القالب يدوياً باستخدام Azure CLI أو PowerShell، فسيتم طلب توفير قيم لكل معلمة. ويمكنه أيضاً إنشاء ملف معلمة، الذي يقوم بسرد جميع المعلمات والقيم الذي يريد استخدامها للنشر. إذا تم نشر القالب من عملية تلقائية مثل تدفقات النشر، يمكن أن توفر التدفقات قيم المعلمة.
يتم تعريف متغير وتعيينه داخل القالب. تتيح لك المتغيرات تخزين المعلومات المهمة في مكان واحد والإشارة إليها خلال القالب بأكمله، دون الحاجة إلى نسخها ولصقها.
عادةً يكون من الجيد استخدام معلمات للأشياء التي ستتغير بين كل عملية نشر، مثل:
- أسماء الموارد التي تحتاج إلى أن تكون فريدة
- مواقع لتوزيع الموارد فيها
- الإعدادات التي تؤثر على تسعير الموارد، مثل وحدات SKU، ومستويات التسعير، وأعداد المثيلات الخاصة بها
- بيانات الاعتماد والمعلومات اللازمة للوصول إلى الأنظمة الأخرى غير المعرفة في القالب
عادة ما تكون المتغيرات خياراً جيداً عندما تستخدم القيم نفسها لكل عملية نشر، ولكنك تريد أن تجعل القيمة قابلة لإعادة الاستخدام داخل القالب، أو تريد استخدام التعبيرات لإنشاء قيمة معقدة. يمكنك أيضاً استخدام متغيرات لأسماء الموارد التي لا تحتاج إلى أسماء فريدة.
تلميح
من المهم استخدام التسمية المناسبة للمعلمات والمتغيرات، بحيث تكون القوالب لديك سهلة القراءة والفهم. تأكد من استخدام أسماء واضحة ووصفية ومتسقة.
إضافة معلمة
في Bicep، يمكنك تعريف المعلمة كالتالي:
param appServiceAppName string
دعونا نعرف كيفية عمل كل جزء من هذا التعريف:
paramيخبر Bicep بأنك تقوم بتعريف معلمة.appServiceAppNameهو اسم المعلمة. إذا كان شخص ما يقوم بنشر القالب يدوياً، فقد يُطلب منه إدخال قيمة، لذا من المهم أن يكون الاسم واضحاً ومفهوماً. إن الاسم أيضاً هو طريقة إشارتك إلى قيمة المعلمة داخل القالب، تماماً كما هو الحال مع الأسماء الرمزية للمورد.stringهو نوع المعلمة. يمكنك تحديد أنواع عديدة مختلفة لمعلمات Bicep، بما في ذلكstring(للنص)، وint(للأرقام)، وbool(للقيم المنطقية صواب/خطأ). يمكنك أيضًا تمرير المزيد من المعلمات المعقدة باستخدام النوعينarrayوobject.
تلميح
حاول عدم تعميم القوالب أكثر من اللازم باستخدام عدد كبير جداً من المعلمات. يجب استخدام أقل عدد من المعلمات التي تحتاجها لسيناريو عملك. تذكر أنه يمكنك دائمًا تغيير القوالب في المستقبل إذا تغيرت متطلباتك.
توفير القيم الافتراضية
يمكنك توفير قيمة افتراضية لإحدى المعلمات بشكل اختياري. بتحديد قيمة افتراضية، فإنك تجعل المعلمة اختيارية بشكل فعال. يمكن للشخص الذي يقوم بنشر القالب تحديد قيمة إذا أراد ذلك، ولكن إذا لم يرد ذلك، فسيستخدم Bicep القيمة الافتراضية بدلاً من ذلك.
إليك كيفية إضافة قيمة افتراضية:
param appServiceAppName string = 'toy-product-launch-1'
ملاحظة
في هذا المثال، يحتوي اسم تطبيق Azure App Service على قيمة افتراضية للتعليمات البرمجية المضمنة. هذه ليست فكرة جيدة، لأن تطبيقات App Service تحتاج إلى أسماء فريدة. سيمكنك إصلاح هذا قريباً.
استخدام قيم المعلمات في القالب
بعد الإعلان عن معلمة، يمكنك الرجوع إليها في بقية القالب. لنعرف كيف يمكنك استخدام المعلمة الجديدة ضمن تعريف المورد:
resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = {
name: appServiceAppName
location: 'westus3'
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@2021-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 في وحدة SKUP2v3لأداء أعلى. - في البيئات غير الإنتاجية، سيتم نشر حسابات التخزين في وحدة SKU
Standard_LRS(تخزين للتكرار محلياً). سيتم نشر خطط App Service في وحدةF1SKU مجاناً.
من إحدى الطرق لتنفيذ متطلبات العمل هذه هي استخدام المعلمات لتحديد كل وحدة من وحدات 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_GRSSKU. بخلاف ذلك، استخدم وحدةStandard_LRSSKU. - بالنسبة للمتغير
appServicePlanSkuName، إذا تم تعيين المعلمةenvironmentTypeإلىprod، فاستخدم وحدةP2V3SKU والمستوىPremiumV3. بخلاف ذلك، استخدم وحدةF1SKU.
تلميح
عند إنشاء تعبيرات متعددة الأجزاء مثل ذلك، فمن الأفضل استخدام المتغيرات بدلاً من تضمين التعبيرات مباشرةً في خصائص الموارد. وهذا يجعل قوالبك أسهل في القراءة والفهم، لأنها تمنع تكدس تعريفات الموارد الخاصة بك بالمنطق.
بعد أن أصبحت لديك الآن المعلمات، والمتغيرات، والتعبيرات في القالب الخاص بك، ففي كل مرة يطلب منك قسم التسويق نشر موقع ويب جديد لعملية إطلاق اللعبة التالية، يمكنك إعادة استخدام القالب ونشر مجموعة جديدة من الموارد بسرعة. كل ما عليك فعله هو توفير بعض قيم المعلمات الجديدة لكل بيئة تقوم بنشرها، وستكون قد انتهيت!
هل تحتاج إلى مساعدة؟ راجع دليل استكشاف الأخطاء وإصلاحها الذي نقدمه أو يمكنك توفير ملاحظات معينة عبر الإبلاغ عن مشكلة.