Ansible / الأساسي: التنفيذ والجرد والحالة النوعية / الدرس 2
كتابة كتب YAML غير ملتبسة
ميز بنية YAML وقواعد المهمة ووسائط الوحدة والقيم القالبية قبل تشخيص التنفيذ.
في هذه الصفحة
أهداف الدرس
- قراءة الخرائط والقوائم والقيم والمسافات والاقتباس.
- فصل كلمات play والمهمة ومعاملات الوحدة.
- حفظ الأنواع عبر YAML والقوالب.
تسبق بنية YAML معنى Ansible
تمثل YAML خرائط وقوائم وقيماً وتحدد المسافة التعشيق والشرطة عنصراً. قد يتحلل شكل لا يناسب Ansible؛ تحتاج tasks مداخل مهام لا خريطة اعتباطية. تصعب tabs والتباين المراجعة. اقرأ الهرمية عند ارتباط خاطئ واجعل ملكية hosts وtasks والوحدة ظاهرة. وإذا كان التعشيق صالحاً نحوياً لكنه يضع قائمة المهام تحت خريطة غير مقصودة، فقد ينجح محلل YAML مع بقاء الوثيقة غير صالحة لواجهة Ansible المطلوبة.
تنتمي الكلمات لمستويات مخطط مختلفة
تنتمي hosts وgather_facts للـ play وwhen وregister وloop وnotify غالباً للمهمة. تقع معاملات الوحدة تحت FQCN أو بنية موثقة. قد يفسر وضعها بجانب الوحدة فعلاً متعارضاً لا خياراً. اقرأ مخطط الوحدة لا نسخة أخرى، والاسم وصف للتقرير لا مفتاح فعل اعتباطياً. فلكل مستوى مسؤولية مختلفة: تحدد كلمات المهمة طريقة تنظيم التنفيذ، بينما تفسر الوحدة معاملاتها وفق مخططها الخاص، ولا يحل اسم المهمة محل ذلك المخطط.
- name: Illustrate typed task data
hosts: lab_nodes
gather_facts: false
vars:
lab_enabled: true
lab_count: 2
tasks:
- name: Describe a declared count
ansible.builtin.debug:
msg: "Count is {{ lab_count }}"
when: lab_enabled
تحلل المثال ولم تشغله Ansible؛ القيمة منطقية وشرط when دون أقواس القالب.
الاقتباس لحفظ نوع القيمة المقصود
قد يصبح غير المقتبس منطقياً أو عددياً أو فارغاً وفق المحلل. اقتبس الإصدار والنمط والمعرف النصي، واقتبس بادئ Jinja ليكون قيمة YAML واحدة. لا يضمن ذلك بقاء كل نتيجة نصاً في التوسعة الحديثة ذات الأنواع والأخطاء الأشد. تحقق من المطلوب ولا تعتمد تحويلًا عرضياً. ولهذا ينبغي توثيق النوع المتوقع في واجهة الدور أو الوحدة، لا الاكتفاء بأن القيمة المعروضة على الشاشة تشبه النص أو العدد الذي أراده الكاتب.
تختلف الأسطر في الكتل الحرفية والمطوية
تحفظ الحرفية الأسطر وتطوي أخرى بعضها لمسافات وتضبط العلامات النهائي. يهم ذلك الإعداد والاختبار. لا يبرر تعدد الأسطر برنامج shell طويلاً؛ قد توضح وحدة أو شيفرة مراجعة العقد. اختبر الناتج البايتي والقواعد التالية لا YAML وحدها. وتستحق المسافات البادئة والأسطر النهائية اختباراً مستقلاً عندما تكون جزءاً من صيغة التطبيق؛ فصحة الوثيقة الخارجية لا تعني صحة كل بايت في الناتج.
فحص الأنواع دون تنفيذ الأتمتة
يكشف المحلل الآمن العدد من النص ولا يستبدل تحقق Ansible. قد تختلف النسخ وطبقة البيانات فسجل المحلي. ضع سياسة للمفاتيح المكررة إذ يقبل بعضها الاستبدال. يحلل المثال نصاً معلناً فقط دون جرد أو وحدة أو اتصال أو حقائق. وينبغي أيضاً أن يرفض مسار التحقق الغموض الذي لا يقبله المشروع، بدلاً من الاعتماد على قبول محلل معين لمفتاح مكرر ثم تبدل سلوكه بعد الترقية.
import yaml
fixture = yaml.safe_load('count: 2\nversion: "2.0"\n')
print(type(fixture['count']).__name__)
print(type(fixture['version']).__name__)
int
str
يحل PyYAML العدد int والإصدار str محلياً؛ هذا رصد محلل لا توسعة Ansible أو وحدة.
الأخطاء الشائعة وإصلاحها
وضع معامل بجانب الفعل
- لماذا يحدث؟
- اختلط مخططا المهمة والوحدة.
- كيف تصلحه؟
- عشش الوسائط تحت FQCN.
- كيف تتجنب تكراره؟
- راجع البنية والمرجع.
تحول معرف نصي لعدد أو منطق
- لماذا يحدث؟
- تُرك التحليل ضمنياً.
- كيف تصلحه؟
- اقتبس النص وافحص النوع التالي.
- كيف تتجنب تكراره؟
- احفظ اختبارات القيم الحدية.
اعتبار نجاح YAML صحة الكتاب
- لماذا يحدث؟
- اختلط التحليل بالدلالة.
- كيف تصلحه؟
- افصل الفحوص الثلاثة.
- كيف تتجنب تكراره؟
- أبلغ طبقة التحقق بدقة.
اختبر فهمك
1. لماذا يقتبس ما يبدأ بـ {{ في YAML؟
اعرض الحل المشروح
يجعل التعبير قيمة واحدة للتحليل ولا يتحقق من المرجع أو يجبر كل ناتج لاحق نصاً؛ لها فحوص نوع وبيانات مستقلة.
2. ما الفحصان لكتلة إعداد مولدة؟
اعرض الحل المشروح
افحص بنية المدخل ثم المحتوى الدقيق وقواعد الهدف؛ قد تطوى الأسطر أو ينتج إعداد مرفوض رغم صحة التعشيق.
أهم ما تعلمته
- افصل تحليل البيانات من دلالة المهمة والوحدة.
- احفظ الأنواع والأسطر عمداً.