كان كل سيرفر جزيرة منعزلة: كيف وحّد Ansible أسطولنا وأنقذنا من جحيم التكوينات المتضاربة؟

بتذكرها زي كإنها إمبارح. الساعة كانت 2 بعد نص الليل، وإحنا بنجهّز لإطلاق ميزة جديدة ومهمة في واحد من تطبيقاتنا. الأدرينالين كان عالي، والقهوة شغّالة، والمعنويات تمام. عملنا “Deploy”، وفتحنا الموقع عشان نتأكد… وفجأة، “Internal Server Error”.

قلبي وقع في رجليّ. شو اللي صار؟ الكود شغال مية المية على سيرفر الاختبار، وشغال على جهازي. بلشنا رحلة البحث والتحري، نفتح ملفات الـ logs، ونفحص كل إشي. أنا وفريقي دخلنا بـ SSH على السيرفر “المنحوس” وبدأنا نقارن. بعد ساعتين من التمحيص والتدقيق، صرخ واحد من الشباب: “لقيتها!”.

المشكلة؟ كانت في نسخة مكتبة `lib-something`… نسخة قديمة شوي على هاد السيرفر بالذات. ليش؟ لأنه زميل سابق، قبل 6 أشهر، عمل تحديث يدوي على السيرفر عشان يحل مشكلة وقتية، ونسي يوثّق اللي عمله أو يطبّقه على باقي السيرفرات. هاد السيرفر كان “جزيرة منعزلة”، إله قوانينه الخاصة وتكويناته الغريبة. يومها، بعد ما حلينا المشكلة، قلت للفريق: “يا جماعة، هاد الحكي ما بنفع يكمل. لازم نلاقي حل جذري”. وكان الحل اسمه Ansible.

لماذا كان كل سيرفر جزيرة منعزلة؟ (جحيم التكوينات اليدوية)

قبل ما نحكي عن المنقذ Ansible، خلينا نفهم أصل المشكلة اللي كلنا بنعاني منها بدرجات متفاوتة. لما يكون عندك سيرفر أو اثنين، فكرة إنك تدخل عليهم بـ SSH وتعمل الإعدادات بشكل يدوي تبدو منطقية وسهلة. لكن شو بصير لما يصيروا 5، 10، أو 100 سيرفر؟ هنا بتبدأ الكارثة اللي بنسميها “جحيم التكوينات اليدوية”، وأعراضها كالتالي:

  • الانحراف التكويني (Configuration Drift): مع الوقت، كل سيرفر بيبدأ يكتسب “شخصيته” الخاصة. هاد عليه نسخة مكتبة أحدث، وهداك ملف الإعدادات فيه سطر زيادة… ومع الوقت بتصير السيرفرات مجموعة جزر متنافرة بدل ما تكون أسطول متناغم.
  • سيرفرات ندفة الثلج (Snowflake Servers): هاد هو السيرفر اللي الكل بخاف يلمسه. سيرفر حساس ومهم جدًا، لكن لا أحد يعرف بالضبط كيف تم إعداده. أي محاولة لتحديثه أو تغييره ممكن تسبب كارثة.
  • صعوبة التوسع (Lack of Scalability): تخيل إنك محتاج تضيف 20 سيرفر ويب جديد لمواجهة الضغط. بالطريقة اليدوية، هاي مهمة بتاخد أيام من العمل المتكرر والممل، ومليئة باحتمالات الخطأ.
  • الخطأ البشري: كلنا بشر، وكلنا بنغلط. أمر خاطئ مثل rm -rf /var/www/ بدل /var/www/tmp ممكن يمسح موقعك بالكامل. الأتمتة بتقلل من هاي المخاطر بشكل كبير.
  • غياب التوثيق والمراجعة: مين اللي غير إعدادات الـ Firewall يوم الثلاثاء؟ وليش؟ بالطريقة اليدوية، الإجابة غالبًا بتكون “الله أعلم”. ما في سجل واضح ومفهوم للتغييرات.

المنقذ Ansible: كيف وحّد أسطولنا؟

وسط هاي الفوضى، ظهر Ansible كحل بسيط وعبقري في نفس الوقت. Ansible هو أداة أتمتة مفتوحة المصدر بتساعدك في إدارة التكوينات (Configuration Management)، ونشر التطبيقات (Application Deployment)، وتنفيذ المهام بشكل مؤتمت (Task Automation).

شو اللي بميزه عن غيره؟ خلينا نشوف.

أهم مبادئ Ansible

  • بلا عملاء (Agentless): هاي هي الميزة القاتلة! على عكس أدوات أخرى مثل Puppet أو Chef، Ansible لا يتطلب تثبيت أي برنامج أو “عميل” على السيرفرات اللي بدك تديرها. كل اللي بحتاجه هو اتصال SSH (اللي هو موجود أصلًا على 99% من سيرفرات لينكس) و Python. هاد معناه إنك بتقدر تبدأ باستخدامه فورًا على بنيتك التحتية الحالية بدون تغييرات معقدة.
  • بسيط ومقروء (YAML): ملفات الإعداد في Ansible، اللي بنسميها Playbooks، مكتوبة بلغة YAML. هاي اللغة سهلة القراءة والكتابة جدًا، لدرجة إن مديرك غير التقني ممكن يفهم شو اللي بصير. هي عبارة عن قائمة مهام واضحة ومباشرة.
  • اللامتغيرية (Idempotency): هاد مصطلح تقني شوي، بس فكرته بسيطة. لو طلبت من Ansible يتأكد من وجود مستخدم اسمه “omar”، في المرة الأولى رح ينشئ المستخدم. لو شغّلت نفس الأمر مرة ثانية، Ansible رح يشوف إنه “omar” موجود أصلًا، فما رح يعمل إشي. هو لا يكرر العمل، بل يضمن أن “الحالة النهائية” صحيحة. هاد المبدأ يمنع حدوث مشاكل غير متوقعة ويجعل عملياتك آمنة وقابلة للتكرار.

من النظرية إلى التطبيق: أول “Playbook” لنا

الحكي النظري حلو، بس خلينا نشوف الموضوع بشكل عملي. تخيل إنه هدفنا هو إعداد سيرفرات الويب الخاصة فينا. بدنا نتأكد إنه Nginx مُثبّت وشغّال، وعليه صفحة رئيسية مخصصة.

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

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


# inventory.ini

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

[dbservers]
db1.example.com

في هاد المثال، عرّفنا مجموعة اسمها webservers فيها 3 سيرفرات، ومجموعة dbservers فيها سيرفر واحد.

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

الآن، بنكتب الـ “وصفة” أو “كتاب اللعب” اللي بوضح لـ Ansible شو لازم يعمل. بنعمل ملف اسمه setup_nginx.yml.


---
- name: Configure and setup Nginx on web servers
  hosts: webservers
  become: yes # هذا يعني تنفيذ الأوامر بصلاحيات الـ root (مثل sudo)

  tasks:
    - name: 1. Update APT cache and install Nginx
      ansible.builtin.apt:
        name: nginx
        state: present # تأكد من أنه موجود (present)
        update_cache: yes

    - name: 2. Ensure Nginx service is started and enabled on boot
      ansible.builtin.service:
        name: nginx
        state: started # تأكد من أن الخدمة تعمل (started)
        enabled: yes   # تأكد من أنها تبدأ مع إقلاع النظام

    - name: 3. Copy our custom index page
      ansible.builtin.copy:
        src: ./files/index.html   # الملف المصدر على جهازك
        dest: /var/www/html/index.html # المسار على السيرفر الهدف
        owner: www-data
        group: www-data
        mode: '0644'

لاحظ كيف إن الـ Playbook مقروء زي قصة: “اسمع يا Ansible، على كل السيرفرات في مجموعة webservers، استخدم صلاحيات الـ root، ونفّذ المهام التالية: أولًا، ثبت Nginx. ثانيًا، تأكد إنه شغال. ثالثًا، انسخ هاي الصفحة الرئيسية.”

الخطوة الثالثة: التنفيذ!

الآن كل اللي علينا نعمله هو نشغّل الأمر من جهازنا (اللي عليه Ansible مثبت):


ansible-playbook -i inventory.ini setup_nginx.yml

وبتبدأ السيمفونية. رح تشوف Ansible بيتصل بكل سيرفر في مجموعة webservers واحد ورا الثاني، وبينفذ المهام. الأجمل من هيك، رح يعطيك ملخص في النهاية: كم مهمة نجحت، وكم مهمة غيّرت إشي في النظام (changed)، وكم مهمة فشلت.

نصائح من “الختيار”: كيف تتقن Ansible وتتجنب الفخاخ

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

نصيحة 1: استخدم الأدوار (Roles) لتنظيم عملك

لما تبدأ، رح تحط كل مهامك في ملف Playbook واحد. هاد كويس للبداية، بس مع الوقت رح يصير الملف كبير ومعقد. الحل هو استخدام “الأدوار” (Roles). الـ Role هو عبارة عن مجموعة من المهام والقوالب والملفات والمتغيرات اللي بتتعلق بمكون معين (مثل Nginx, MySQL, Firewall). هيك بتقدر تعيد استخدام “دور Nginx” في مشاريع مختلفة بسهولة.

نصيحة أبو عمر: أول ما تلاقي حالك بتنسخ وتلصق المهام بين ملفات الـ Playbooks، اعرف إنه حان وقت تحويلهم لـ Role.

نصيحة 2: لا تكرر نفسك! استخدم المتغيرات والقوالب (Variables & Templates)

تخيل لو بدك تستخدم نفس الـ Playbook لإعداد بيئة التطوير (development) وبيئة الإنتاج (production)، لكن مع إعدادات مختلفة شوي. هنا بيجي دور المتغيرات (Variables) وقوالب Jinja2.

بدل ما تكتب إعدادات Nginx بشكل ثابت في ملف، بتقدر تعمل “قالب” (template) اسمه nginx.conf.j2 زي هيك:


# nginx.conf.j2
server {
    listen 80;
    server_name {{ server_name_variable }};
    ...
}

وبعدين في الـ Playbook، بتمرر قيمة المتغير server_name_variable حسب البيئة اللي بتشتغل عليها. هاد هو مبدأ “Infrastructure as Code” في أبهى صوره.

نصيحة 3: حافظ على أسرارك مع Ansible Vault

يا جماعة الخير، إياك ثم إياك ثم إياك تحط كلمات سر أو مفاتيح API في ملفات YAML بشكل نصي واضح! هاد خطأ أمني قاتل. Ansible بيوفر أداة رائعة اسمها ansible-vault بتسمحلك تشفّر الملفات اللي فيها معلومات حساسة.

بتقدر تنشئ ملف مشفر بالأمر: ansible-vault create secrets.yml

ولما تشغّل الـ Playbook، Ansible رح يطلب منك كلمة السر عشان يفك التشفير ويستخدم المتغيرات اللي جواته. نوم هنيء وآمن!

نصيحة 4: قيس قبل ما تغوص (Check & Diff Mode)

قبل ما تطبّق تغيير كبير على سيرفرات الإنتاج، الخوف طبيعي. Ansible بيعطيك أدوات عشان تتطمن. استخدم الخيارات التالية مع أمر التشغيل:

  • --check (أو -C): هاد “وضع الفحص”. Ansible رح يمشي على كل المهام ويورجيك شو “كان رح يغير” بدون ما يغير إشي فعليًا.
  • --diff (أو -D): لما تستخدمه مع وضع الفحص، بيورجيك الفروقات الدقيقة اللي رح تصير في الملفات (مثل ملفات الإعدادات).

استخدام هدول الخيارين مع بعض هو أفضل صديق إلك قبل أي عملية نشر على البيئة الحساسة.

الخلاصة: من جزر منعزلة إلى أسطول موحّد 🚀

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

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

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

الله يوفقكم يا جماعة، ويجعل سيرفراتكم دائمًا changed=0, unreachable=0, failed=0.

أبو عمر

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

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

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

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

آخر المدونات

ادارة الفرق والتنمية البشرية

من جحيم ‘شو الجديد؟’ إلى حوار حقيقي: كيف حوّلت اجتماعاتي الفردية (1-on-1s) من استجواب إلى استثمار في فريقي؟

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

24 مايو، 2026 قراءة المزيد
اختبارات الاداء والجودة

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

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

24 مايو، 2026 قراءة المزيد
نصائح برمجية

كانت شفرتي هرمًا من الشروط المتداخلة: كيف أنقذتني ‘شروط الحماية’ (Guard Clauses) من جحيم الـ Arrow Code؟

أتذكر ليلة كاد فيها الكود أن يدفعني للجنون؛ هرمٌ من الشروط المتداخلة يُعرف بـ "الكود السهمي". في هذه المقالة، أشارككم قصة كيف أنقذتني "شروط الحماية"...

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

من جحيم التبعيات إلى نعيم الاستقلالية: رحلتي مع المعمارية القائمة على الأحداث (EDA)

كانت خدماتنا متشابكة في تبعيات قاتلة تحوّل كل تحديث إلى كابوس. في هذه المقالة، أروي لكم كيف حررتنا "المعمارية القائمة على الأحداث" (Event-Driven Architecture) من...

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

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

في عالم تتكدس فيه آراء المستخدمين بالآلاف، يصبح تجاهلها جحيماً حقيقياً. أسرد لكم قصتي كـ "أبو عمر"، وكيف تحولنا من ضياع تام في بحر المراجعات...

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

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

أتذكر جيداً ذلك الاجتماع الذي كاد أن يدمر معنويات فريقنا. كنا ننفق آلاف الدولارات على التسويق الرقمي، لكن العائد كان محيراً والميزانية أشبه بثقب أسود...

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