الأوامر الفورية والوحدات
الأوامر الفورية والوحدات
قبل أن تكتب أول playbook، تحتاج إلى فهم الوحدة الذرية للعمل في Ansible: الوحدة (module). كل ما تفعله Ansible — نسخ ملف، أو إعادة تشغيل خدمة، أو تثبيت حزمة، أو الاستعلام من API — يتم عبر تشغيل وحدة على عقدة مُدارة. تتيح لك الأوامر الفورية (Ad-hoc commands) استدعاء وحدة واحدة مباشرةً من طرفيتك دون الحاجة إلى playbook، مما يجعلها أسرع طريقة لاستكشاف مكتبة وحدات Ansible وتشخيص البنية التحتية الحية. على نطاق شركات التقنية الكبرى، تُعدّ الأوامر الفورية أيضاً الخطوة الأولى الآمنة عندما تحتاج إلى فحص أسطول خوادم قبل الالتزام بتغيير آلي.
نموذج الوحدة (Module)
الوحدة في Ansible هي برنامج مستقل بذاته — عادةً Python، لكن أيضاً PowerShell أو Ruby أو سكريبت shell — تُحوّله Ansible إلى العقدة المُدارة، تُنفّذه، ثم تحذفه. تقبل كل وحدة مجموعة من المعاملات المُسمّاة، وتنفّذ إجراءً منطقياً واحداً بالضبط، وتُعيد نتيجة JSON تتضمن علامة changed وأي بيانات ذات صلة. لا تُشغّل عقدة التحكم الوحدة بنفسها أبداً؛ بل تُنسّق فقط عملية النقل وتجمع النتيجة.
يعني هذا التصميم أن الوحدات تدرك المنصة. تكتشف وحدة package ما إذا كانت المضيفة تستخدم apt أو yum أو dnf أو homebrew وتُفوّض إلى الأداة الصحيحة تلقائياً. تكتب مهمة واحدة؛ وتتكيف Ansible مع عائلة نظام تشغيل كل عقدة. هذا التجريد هو ما يجعل playbooks في Ansible قابلةً للنقل عبر أساطيل غير متجانسة.
{"changed": false, "failed": false}. مفتاح changed هو ما يقود تقارير الأداء الخاملي وإشعارات المعالج (handler). إذا أعادت مهمة changed: false، تتخطى Ansible أي أهداف notify — لا إعادة تشغيل خدمات غير ضرورية عند التكرار.الأداء الخامل: العقد التي يجب على كل وحدة الوفاء بها
الأداء الخامل (Idempotency) يعني أن تشغيل نفس مهمة Ansible مرتين ينتج عنه بالضبط نفس الحالة النهائية كتشغيلها مرةً واحدة، دون أي آثار جانبية في التشغيل الثاني. هذه ليست ميزة اختيارية — بل هي العقد الهندسي الذي يجعل Ansible آمنةً للتشغيل في خطوط الأنابيب الآلية، ومهام cron، وحلقات المعالجة دون إشراف بشري.
تفحص الوحدة المكتوبة جيداً الحالة الحالية قبل التصرف. تفحص وحدة file ما إذا كان الملف يمتلك فعلاً الأذونات المستهدفة قبل استدعاء chmod. وتفحص وحدة user ما إذا كان الحساب موجوداً بالفعل قبل استدعاء useradd. إذا كانت الحالة المطلوبة تتطابق بالفعل مع الواقع، تُعيد الوحدة changed: false وتخرج فوراً. عندما تبني وحداتك الخاصة أو مهام shell، أنت المسؤول عن تطبيق هذا الفحص بنفسك — الإخفاق في ذلك يحوّل Ansible إلى أداة تشغيل سكريبتات مدمّرة بدلاً من أداة تكوين تعريفية.
shell وcommand ليستا أبداً خاملتَي الأداء بشكل افتراضي. سيفشل ansible all -m shell -a "useradd deploy" في كل تشغيل لاحق لأن useradd يُعيد خطأً حين يكون الحساب موجوداً بالفعل. استخدم وحدة user بدلاً من ذلك. احتفظ بـshell/command للعمليات التي لا توجد لها وحدة مخصصة، وأضف دائماً وسيطة creates أو removes (أو شرط when مدعوماً بحقيقة) لاستعادة الأداء الخامل.صيغة الأمر الفوري
الشكل العام للأمر الفوري هو:
<pattern> هو أي مجموعة في الـ inventory، أو اسم مضيف، أو نمط glob. الخيارات الشائعة التي ستستخدمها يومياً:
-i— مسار ملف أو مجلد الـ inventory (الافتراضي:/etc/ansible/hosts)-u— المستخدم البعيد (الافتراضي: المستخدم المحلي الحالي)-b— become (الترقية إلى sudo)--become-method— طريقة الترقية (sudo،su،doas)-f— عدد العمليات المتوازية (الافتراضي: 5؛ اضبطها على 50+ للأساطيل الكبيرة)-v / -vvv— مستوى التفصيل؛-vvvvيُظهر مُخرجات تصحيح SSH--check— وضع التشغيل الجاف؛ تُبلّغ الوحدات بما ستفعله دون إجراء تغييرات فعلية--diff— يُظهر الفرق قبل وبعد للمهام التي تُعدّل الملفات
الوحدات التي ستستخدمها كل يوم
تُضمّن Ansible أكثر من 7,000 وحدة عبر مجموعاتها. من الناحية العملية، 90٪ من عمل البنية التحتية تغطيه اثنا عشر وحدة أساسية. فيما يلي كل واحدة مع أمر حقيقي يمثّل الاستخدام الإنتاجي:
وحدة setup — المخزون الحي لأسطولك
تستحق وحدة setup (المعروفة أيضاً بـجمع الحقائق) اهتماماً خاصاً. عند تشغيل أي playbook تستدعي Ansible وحدة setup أولاً (ما لم تضبط gather_facts: false) لبناء مخزون JSON غني لكل عقدة مُدارة: إصدار النواة، وجميع عناوين IP والواجهات، وتوپولوجيا الذاكرة والمعالج، ونقاط تحميل الأقراص، ونوع مدير الحزم، ومسار مترجم Python، وعشرات غيرها. استعلامات الحقائق الفورية لا غنى عنها في الإنتاج:
setup عبر 500 مضيف في بداية كل playbook 20-60 ثانية من تكاليف SSH المتسلسلة. فعّل تخزين الحقائق مؤقتاً في ansible.cfg (fact_caching = redis أو jsonfile) لإبقاء الحقائق بين التشغيلات. تعمل دائماً عمليات نشر Ansible على نطاق Google بتخزين الحقائق مؤقتاً؛ تُجبَر الحقائق الجديدة فقط للمضيفات التي انضمت حديثاً إلى الأسطول أو أجرت تحديثاً للنواة مؤخراً.التوازي وخيار -f
عدد الشعب الافتراضي في Ansible هو 5 — تُشغّل المهام على 5 مضيفات كحد أقصى في آنٍ واحد. بالنسبة لأسطول مكوّن من 200 عقدة، تستغرق مهمة مدتها 30 ثانية دقيقتين. ارفع -f ليتناسب مع اتصالات عقدة التحكم المتاحة (عادةً 50–100 لحاسوب Ansible مخصص) وإعداد MaxSessions في SSH daemon:
--check --diff أولاً. تحترم معظم الوحدات وضع الفحص وتُبلّغ بما ستُغيّره بالضبط دون لمس أي شيء. هذا يعادل terraform plan في عالم الأوامر الفورية — وتجاهله هو كيف يُعيد المهندسون تشغيل 200 خدمة إنتاجية في آنٍ واحد في الثانية الثانية من الليل.الأوامر الفورية هي أسرع حلقة تعلم في Ansible: نفّذ وحدة، اقرأ JSON، عدّل المعاملات، نفّذ مجدداً. ببناء ذاكرة عضلية مع هذه الأوامر، ستكتب playbooks أكثر ذكاءً — لأن الـ playbook ليست سوى تسلسل قابل للتكرار ومُصدَّر بالإصدار من نفس استدعاءات الوحدات التي أتقنتها هنا.