كانت خوادمنا نسخًا مشوهة: كيف أنقذنا Ansible من جحيم “الانحراف في الإعدادات” (Configuration Drift)؟

بتذكرها زي كأنه امبارح. الساعة كانت 2 بعد نص الليل، وأنا قاعد براجع شوية كود لمشروع ذكاء اصطناعي، وفجأة بتوصلني رسالة طوارئ على نظام المراقبة: “Server-Prod-03 is DOWN”. قلبي نقزني، هاد السيرفر بالذات عليه خدمة أساسية لواحد من أكبر عملائنا. الدنيا قايمة قاعدة والفريق كله صحي من نومه.

الخطة كانت بسيطة وواضحة (أو هيك كنا مفكرين): بنشغل سيرفر جديد من القالب (Image) اللي جهزناه، بنعمل توجيه لحركة المرور عليه، والمشكلة بتنحل خلال دقايق. وفعلاً، خلال ربع ساعة كان السيرفر الجديد شغال. لكن المصيبة… الخدمة عليه ما اشتغلت! بتظهر أخطاء غريبة وعجيبة ما شفناها قبل هيك.

قضينا الساعات الثلاث اللي بعدها في حالة من الجنون المطلق. بنقارن ملفات الإعدادات سطر بسطر بين نسخة احتياطية قديمة للسيرفر المعطوب وبين السيرفر الجديد. اكتشفنا الكارثة: السيرفر القديم كان عبارة عن وحش هجين، مليان تعديلات يدوية “مستعجلة”، مكتبات تم تثبيتها بـapt-get سريع عشان “يمشي الحال” لمشكلة ظهرت قبل 6 شهور، وتغييرات في صلاحيات الملفات عملها مطور ترك الشركة من زمان. ولا إشي من هاد كان موثّق.

في هذيك الليلة، أدركت إنه مشكلتنا مش مجرد سيرفر واقع. مشكلتنا أعمق بكثير، إلها اسم علمي ورسمي: الانحراف في الإعدادات (Configuration Drift). خوادمنا ما كانت نسخ متطابقة، كانت نسخ مشوهة، وكل واحد فيهم “كائن فريد” بنخاف نقرب عليه. وهون كانت بداية رحلتنا مع Ansible.

ما هو “الانحراف في الإعدادات” (Configuration Drift)؟ وليش هو كابوس؟

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

هذا الانحراف هو كابوس حقيقي لأي فريق DevOps أو إدارة أنظمة، لأنه يسبب:

  • فوضى وعدم اتساق: سيرفرين المفروض يكونوا زي بعض بالزبط، واحد بتشتغل عليه الخدمة والثاني لأ. ليش؟ “الله أعلم”.
  • صعوبة في التشخيص: بتضيع ساعات وأيام في محاولة معرفة سبب مشكلة بتظهر على سيرفر واحد فقط.
  • مخاطر أمنية: التعديلات اليدوية “السريعة” غالباً ما تتجاوز الإجراءات الأمنية المتبعة، وممكن تفتح ثغرات بدون ما حدا يعرف.
  • ولادة “الخوادم الثلجية” (Snowflake Servers): كل سيرفر بصير حالة فريدة من نوعها، مثل ندفة الثلج، الكل بخاف يلمسه أو يعمل عليه تحديث لأنه “إذا اشتغل، لا تلمسه”.
  • بطء كارثي في التعافي: زي ما صار معنا، استعادة الخدمة بعد عطل بتصير مهمة شبه مستحيلة لأنك ما بتقدر تبني نسخة مطابقة للسيرفر القديم بسهولة.

العودة للجذور: كيف كنا ندير الأمور “على البركة”

قبل ما نتبنى الحلول الحديثة، كانت طريقتنا في إدارة الخوادم، بصراحة، فوضوية. كانت بتعتمد على مزيج من:

  1. بروتوكول “SSH and Pray”: بدنا نثبت برنامج؟ ادخل على كل سيرفر بـ SSH، اكتب الأمر، وادعي إنه ما يضرب إشي.
  2. السكريبتات السحرية (Bash Scripts): كتبنا سكريبتات Bash لكل إشي تقريباً. كانت أحسن من الشغل اليدوي، لكن مشكلتها إنها مش “Idempotent” (عَوديّة). يعني لو شغلت السكريبت مرتين، ممكن يضيف نفس السطر مرتين في ملف الإعدادات ويسبب كارثة.
  3. تعديلات الطوارئ البشرية: “يا أبو عمر، بدنا نركب مكتبة X ضروري للديمو بعد ساعة”. حاضر. sudo apt-get install lib-x-dev. هل حدا وثّق هاد التغيير؟ طبعاً لأ، “مش فاضيين”.

هذا المزيج القاتل هو الوصفة المثالية لحدوث الانحراف في الإعدادات. كنا بنطفي حرايق، ما كنا بنبني نظام مستقر.

الحل السحري (مش سحر، بس شغل مرتب): مرحباً Ansible!

بعد ليلة الكارثة، عقدنا اجتماع طارئ، وكان القرار واضح: “لازم نغير كل إشي”. بعد بحث وتقييم لعدة أدوات مثل Chef و Puppet و SaltStack، استقر رأينا على Ansible. ليش؟ لعدة أسباب وجيهة جداً:

  • بدون عملاء (Agentless): هادي كانت الميزة القاتلة. Ansible ما بحتاج تثبيت أي برامج خاصة (عملاء) على الخوادم اللي بدك تديرها. كل اللي بحتاجه هو اتصال SSH وصلاحيات مناسبة. يعني “ما بغلب” وبتقدر تبدأ باستخدامه على بنيتك التحتية الحالية فوراً.
  • بسيط ومقروء (YAML): لغة Ansible هي YAML، وهي لغة بسيطة جداً وقريبة من اللغة الإنجليزية. ما بتحتاج تكون مبرمج محترف عشان تكتب “وصفة” (Playbook). بتحس حالك بتوصف الحالة اللي بدك ياها، مش بتكتب أوامر. زي ما بتحكي مع ابن آدم.
  • العَوديّة (Idempotency): هاد هو المفهوم الجوهري. لما تطلب من Ansible يتأكد إنه برنامج Nginx مثبت، هو بفحص أول. إذا كان مثبت، ما بعمل إشي وبخبرك “OK”. إذا ما كان مثبت، بثبته وبخبرك “Changed”. لو شغلت نفس الأمر مليون مرة، النتيجة النهائية رح تكون نفسها دائماً: Nginx مثبت. هاد المبدأ هو اللي بقتل الانحراف في الإعدادات من جذوره.

من الفوضى إلى النظام: تطبيق Ansible على أرض الواقع

الكلام النظري حلو، بس خلينا نشوف كيف طبقنا هاد الحكي عملياً. رح أمشي معكم خطوة بخطوة في مثال بسيط جداً: إعداد خادم ويب باستخدام Nginx.

الخطوة الأولى: جرد الأصول (Inventory)

أول إشي، بدك تخبر Ansible عن الخوادم اللي عندك. بتعمل ملف بسيط اسمه inventory.ini وبتحط فيه عناوين IP أو أسماء النطاقات لخوادمك، وبتقدر تقسمهم لمجموعات.


# inventory.ini

[webservers]
server1.example.com
server2.example.com

[db_servers]
db1.example.com

هيك، لما بدك تنفذ أمر على كل خوادم الويب، بس بتكتب webservers.

الخطوة الثانية: كتابة الوصفة (Playbook)

الـ Playbook هو قلب Ansible. هو ملف YAML اللي بتوصف فيه الحالة النهائية اللي بدك سيرفراتك توصللها. هاد مثال على Playbook بسيط بتأكد من تثبيت وتشغيل Nginx ونسخ ملف إعدادات مخصص.


# playbook.yml
---
- name: Configure Web Servers
  hosts: webservers
  become: yes  # هذا يعني "run as sudo" أو "become root"

  tasks:
    - name: Ensure Nginx is installed at the latest version
      apt:
        name: nginx
        state: latest # تأكد أنه مثبت وبأحدث إصدار
        update_cache: yes

    - name: Ensure Nginx service is running and enabled on boot
      service:
        name: nginx
        state: started # تأكد أن الخدمة شغالة
        enabled: yes   # تأكد أنها تعمل تلقائيا عند إعادة التشغيل

    - name: Copy custom Nginx configuration file
      template:
        src: templates/nginx.conf.j2 # مسار ملف القالب على جهازك
        dest: /etc/nginx/sites-available/default # المسار على السيرفر الهدف
      notify:
        - Restart Nginx # إذا تغير هذا الملف، نفّذ الـ handler اللي اسمه Restart Nginx

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted # أعد تشغيل خدمة Nginx

لاحظ جمال وسهولة القراءة. كل مهمة (task) إلها اسم واضح. أنت لا تقول “ثبّت Nginx”، أنت تقول “تأكد أن Nginx مثبت” (state: latest). هذا هو الفرق الجوهري.

الخطوة الثالثة: التنفيذ والمراقبة

الآن، كل ما عليك فعله هو تشغيل هذا الأمر من جهازك:

ansible-playbook -i inventory.ini playbook.yml

Ansible رح يتصل بكل سيرفر في مجموعة webservers، وينفذ المهام واحدة تلو الأخرى. وفي النهاية رح يعطيك ملخص زي هيك:


PLAY RECAP *********************************************************************
server1.example.com : ok=3   changed=2   unreachable=0    failed=0
server2.example.com : ok=4   changed=1   unreachable=0    failed=0
  • ok: المهمة تم فحصها والحالة كانت صحيحة، لم يتم إجراء أي تغيير.
  • changed: تم إجراء تغيير للوصول للحالة المطلوبة (مثلاً، تثبيت برنامج أو تعديل ملف).

إذا شغلت الأمر مرة ثانية، رح تلاقي كل النتائج ok (إذا ما حدا غير إشي يدوياً). وإذا طلعلك changed، بتعرف فوراً إنه صار في “انحراف” و Ansible قام بإصلاحه. هيك بنكون حولنا Ansible من أداة إعداد إلى نظام مراقبة وتصحيح تلقائي!

نصائح من “أبو عمر” لترويض Ansible

بعد سنين من استخدام Ansible في مشاريع صغيرة وكبيرة، اسمحولي أشارككم شوية نصائح من القلب:

  • ابدأ بسيطاً (Start Simple): لا تحاول أتمتة كل بنيتك التحتية في يوم واحد. ابدأ بمهمة صغيرة ومتكررة، مثلاً التأكد من أن كل الخوادم عليها نفس إعدادات الوقت (NTP) أو نفس المستخدمين بصلاحيات sudo. النجاح في مهمة صغيرة بعطيك دافع وثقة.
  • كل شيء في Git: ملفات الـ Playbooks والـ Inventory هي “بنيتك التحتية ككود” (Infrastructure as Code – IaC). عاملها زي ما بتعامل كود التطبيق تبعك. حط كل إشي على Git. هيك بصير عندك سجل تاريخي لكل تغيير صار على البنية التحتية، ومين عمله، ومتى. “الكود هو الحقيقة الوحيدة” (The Code is the Single Source of Truth).
  • استخدم الأدوار (Roles): لما تكبر مشاريعك، لا تحط كل إشي في ملف Playbook واحد. قسّم شغلك لـ “أدوار” قابلة لإعادة الاستخدام. مثلاً، “دور” لخادم الويب، “دور” لقاعدة البيانات، “دور” للأمان. هذا بخلي شغلك مرتب ومنظم وسهل الصيانة.
  • لا تخف من الفحص الجاف (Embrace the Dry Run): قبل ما تنفذ أي Playbook جديد أو خطير على بيئة الإنتاج، استخدم هذا الأمر: ansible-playbook ... --check. هذا الخيار بخلي Ansible يورجيك شو كان رح يغير، بدون ما يغير أي إشي فعلاً. هادي شبكة الأمان تبعتك. زي ما بنقول “جس النبض قبل ما تغطس”.
  • العب، جرب، واكسر الأشياء (على بيئة تجريبية!): أفضل طريقة لتتعلم هي التجربة. جهّز سيرفرات وهمية (Virtual Machines) عندك على الجهاز باستخدام Vagrant أو Docker، وجرب عليها كل ما يخطر في بالك.

الخلاصة: شغل مرتب ولا شغل كثير؟

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

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

نصيحتي الأخيرة لكل مطور أو مدير أنظمة: استثمر في الأتمتة. قد يبدو الأمر صعباً في البداية، لكن العائد على المدى الطويل لا يقدر بثمن. وتذكر دائماً، “الشغل المرتب بغلب الشغل الكثير”. 🚀

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

اختبارات الاداء والجودة

كانت تحديثات CSS تكسر تصميمنا بصمت: كيف أنقذنا ‘الاختبار البصري التراجعي’ من جحيم ‘يبدو مكسورًا’؟

في كل مرة نُحدّث فيها ملف CSS، كنا نخشى من كارثة بصرية غير متوقعة. أشارككم قصة كيف أنقذنا 'الاختبار البصري التراجعي' من ساعات لا نهائية...

2 مايو، 2026 قراءة المزيد
أتمتة العمليات

كانت أوامرنا حبيسة الطرفية (Terminal): كيف حررنا عملياتنا بـ ‘ChatOps’ وجعلناها في متناول الجميع؟

أنا أبو عمر، مبرمج فلسطيني، وأروي لكم كيف انتقلنا من عالم الأوامر المعقدة والمحصورة في الطرفية (Terminal) إلى بيئة عمل شفافة وتعاونية. في هذه المقالة،...

2 مايو، 2026 قراءة المزيد
​معمارية البرمجيات

كانت خدماتنا جزراً معزولة: كيف أنقذتنا ‘المعمارية القائمة على الأحداث’ من جحيم الاقتران المحكم؟

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

2 مايو، 2026 قراءة المزيد
ذكاء اصطناعي

كان بحثنا عن المعنى أعمى: كيف أنقذتنا ‘قواعد بيانات المتجهات’ من جحيم البحث بالكلمات المفتاحية؟

أنا أبو عمر، وفي هذه المقالة سأشارككم قصة حقيقية عن مشروع كاد أن يفشل بسبب البحث التقليدي، وكيف كانت قواعد بيانات المتجهات (Vector Databases) والبحث...

2 مايو، 2026 قراءة المزيد
تسويق رقمي

ميزانيتنا التسويقية كانت ثقباً أسود: كيف أنقذنا ‘نموذج الإحالة المبني على البيانات’ من جحيم إهدار المال؟

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

2 مايو، 2026 قراءة المزيد
البودكاست