معمارية Ansible والمخزون
معمارية Ansible والمخزون
قبل أن تتمكن من إدارة خادم واحد بـ Ansible، تحتاج إلى فهم كيف يصل Ansible إلى ذلك الخادم، وماذا يعرف عن أسطولك، وكيف تنظم مئات أو آلاف الأجهزة في مجموعات منطقية. يغطي هذا الدرس الثلاثة معاً: معمارية SSH عديمة الوكيل، والمخازن الثابتة والديناميكية، ونظام متغيرات المضيف والمجموعة. افهمها صح وكل playbook تكتبه سيعمل. افهمها غلط وستقضي مسيرتك المهنية في تتبع أخطاء الاتصال وتعارضات المتغيرات.
المعمارية عديمة الوكيل: لماذا تهم
تقريباً كل نظام إدارة تهيئة آخر — Chef وPuppet وSaltStack في وضع الوكيل — يتطلب منك تثبيت وصيانة عميل (daemon) على كل مضيف مُدار. هذا العميل يستطلع خادماً مركزياً ويطبق التهيئة ويُبلّغ. العبء التشغيلي حقيقي: العميل نفسه يحتاج تحديثات، ويجب أن يبقى يعمل، ويمكن أن يفشل بطرق تعيق تطبيق التهيئة كلياً.
Ansible مختلف جوهرياً. لا وكيل. عقدة التحكم (حاسوبك المحمول أو مشغّل CI أو خادم بوابة) تتصل بكل عقدة مُدارة عبر SSH (أو WinRM لـ Windows)، تدفع سكريبت Python صغيراً يُسمى module، تنفذه، تجمع النتيجة، وتحذف السكريبت. العقدة المُدارة تحتاج فقط:
- عميل SSH (
sshd) يستمع على منفذ يمكن الوصول إليه - Python 3.x في المسار القياسي (Python 2.7 لا يزال يعمل لكنه وصل نهاية عمره)
- حساب مستخدم يمكن لعقدة التحكم التحقق منه
هذا كل شيء. لا استثناءات جدار حماية لحركة الوكيل الصادرة، ولا تدوير شهادات، ولا حوادث "وكيلي عالق" الساعة الثانية فجراً.
ضبط اتصال SSH لنطاق الإنتاج
افتراضياً، يفتح Ansible اتصال SSH جديداً لكل مهمة على كل مضيف. عند عشرة مضيفين هذا جيد. عند خمسمئة يصبح عنق زجاجة. إعدادان يغيران هذا كلياً:
- SSH multiplexing (ControlMaster): يعيد Ansible استخدام اتصال SSH موجود لمهام متعددة بدلاً من إعادة التحقق في كل مرة. يُفعَّل تلقائياً حين يتضمن
ssh_argsالأعلام الصحيحة. - Pipelining: يُزيل دورة كتابة-الوحدة-على-القرص، التنفيذ، الحذف. بدلاً من ذلك يمرر Ansible الوحدة مباشرة عبر اتصال SSH الموجود. يتطلب تعطيل
requirettyفي/etc/sudoersعلى الهدف (الوضع الافتراضي في Linux الحديث).
ansible.cfg في جذر مستودع Ansible. هذا يجعل المشروع مكتفياً بذاته — مهندس جديد يستنسخ المستودع ويشغل ansible-playbook site.yml دون الحاجة لمعرفة أي إعداد عام. يحمّل Ansible ملفات الإعداد بهذا الترتيب الأولوي: متغير البيئة ANSIBLE_CONFIG ثم ./ansible.cfg ثم ~/.ansible.cfg ثم /etc/ansible/ansible.cfg. الملف المحلي للمشروع يفوز دائماً.المخازن: تعليم Ansible بأسطولك
المخزون هو مصدر الحقيقة الوحيد لـ Ansible بشأن المضيفين الموجودين وكيفية الوصول إليهم. إنه أهم ملف ستكتبه. كل أمر مخصص وكل playbook يبدأ بحل المخزون.
المخزون الثابت (INI و YAML)
أبسط مخزون هو ملف INI عادي. المضيفون يُسردون بعنوان IP أو اسم المضيف، مجمَّعون تحت رؤوس [اسم-المجموعة]. يمكن أن تحتوي المجموعات على مجموعات أخرى باستخدام اللاحقة :children.
صيغة INI تعمل جيداً للأساطيل الصغيرة. للمخازن الأكبر والأكثر تعقيداً، صيغة YAML مفضلة لأنها تدعم هياكل متداخلة دون غموض:
المخزون الديناميكي: معيار الإنتاج
تفشل المخازن الثابتة فور أن تصبح بنيتك التحتية ديناميكية — مجموعات تحجيم تلقائي تطلق وتنهي نسخاً، مهام ECS، عقد Kubernetes. ملف ثابت كتبته الاثنين يكون خطأ يوم الثلاثاء.
يحل Ansible هذا بـ إضافات المخزون الديناميكي. بدلاً من ملف، تشير Ansible إلى سكريبت أو إضافة تستعلم مزود البنية التحتية وتعيد قائمة المضيفين الحالية كـ JSON. كل سحابة كبرى لها إضافة رسمية:
amazon.aws.aws_ec2— تستعلم EC2، تعيد النسخ مجمَّعة حسب العلامات والمنطقة والـ VPC وـASG إلخ.google.cloud.gcp_compute— نسخ GCP Compute Engineazure.azcollection.azure_rm— Azure VMs و VMSScommunity.vmware.vmware_vm_inventory— VMware vSphere
مع حفظ هذا الملف كـ inventory/aws_ec2.yml، يعيد تشغيل ansible-inventory -i inventory/ --list جميع نسخ EC2 الجارية في us-east-1 و eu-west-1 المُعلَّمة بـ Environment=production، مجمَّعة مسبقاً حسب علاماتها. لا تحديثات يدوية مطلوبة حين تضيف Auto Scaling عقدة أو تزيلها.
host_key_checking = False مع مضيفين معروفين ثابتين في pipelines CI — يُعطّل التحقق من SSH بصمت ويفتح الباب لهجمات MITM. النمط الإنتاجي الصحيح هو استخدام إضافة AWS EC2 مع أسماء مضيف private-ip-address وتشغيل عقدة تحكم Ansible داخل نفس الـ VPC (على خادم بوابة أو مشغّل CI في شبكة فرعية خاصة). عندها تُفعّل التحقق من مفتاح المضيف وتملأ ~/.ssh/known_hosts مسبقاً أثناء إعداد النسخة عبر user-data، أو تقبل المفاتيح عند الاتصال الأول عبر شبكة خاصة موثوقة.المجموعات ومتغيرات المضيف والمجموعة
وضع معاملات الاتصال مضمَّنة في ملف المخزون لا يتوسع. هيكل دليل المتغيرات في Ansible يحل هذا بأناقة. حين يجد Ansible دليلاً يُسمى group_vars/ أو host_vars/ بجوار المخزون، يحمّل تلقائياً ملفات المتغيرات منهما.
أولوية المتغيرات: الترتيب الذي ينقذك الساعة الثالثة فجراً
Ansible لديها 22 مستوى لأولوية المتغيرات. لا تحتاج حفظها كلها، لكن تحتاج معرفة أكثر نقاط التعارض شيوعاً:
- الأدنى: الافتراضيات في الدور (
roles/<الاسم>/defaults/main.yml) — مقصودة للتجاوز - متغيرات مجموعة المخزون (
group_vars/all.ymlثم المجموعات المحددة) - متغيرات مضيف المخزون (
host_vars/<اسم_المضيف>.yml) - متغيرات المجموعة والمضيف في الـ playbook
- متغيرات الدور (
roles/<الاسم>/vars/main.yml) — يصعب تجاوزها - متغيرات المهمة (مفتاح
vars:في play) - الأعلى: المتغيرات الإضافية المُمررة بـ
-eفي سطر الأوامر — تفوز دائماً
أكثر خطأ إنتاجي شيوعاً هو أن vars/main.yml في الدور يتجاوز بصمت ملفات group_vars/ لأن متغيرات الدور تقع أعلى من متغيرات المخزون في سلسلة الأولوية. ضع التهيئة التي يجب أن يتمكن المشغّلون من تخصيصها في defaults/main.yml، وليس في vars/main.yml.
--list (يعيد كل المجموعات والمضيفين كـ JSON) و--host <اسم_المضيف> (يعيد متغيرات المضيف). أي سكريبت يتحدث هذه الواجهة يعمل كمخزون لـ Ansible.ملخص
يُزيل تصميم SSH عديم الوكيل في Ansible فئة كاملة من التعقيد التشغيلي — لا دورة حياة وكيل لإدارتها، ولا مستوى تحكم منفصل لتأمينه. المخزون هو مصدر الحقيقة الوحيد لـ Ansible بشأن أسطولك: ملفات INI/YAML ثابتة للبنية التحتية الثابتة، وإضافات ديناميكية للبيئات السحابية حيث تأتي المضيفون وتذهب. ملفات متغيرات المجموعة والمضيف تُبقي التهيئة خارج المخزون وفي YAML مقروء من البشر تحت إدارة الإصدارات. وفهم أولوية المتغيرات يمنع التجاوزات الصامتة التي تتسبب في حوادث إنتاجية. مع توطيد هذه الأسس، أنت جاهز لكتابة أوامرك المخصصة الأولى والـ playbooks في الدروس التالية.