كان كل سيرفر جزيرة منعزلة: كيف وحّد 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.

أبو عمر

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

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

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

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

آخر المدونات

برمجة وقواعد بيانات

تحديثات قاعدة البيانات بدون توقف: كيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من جحيم التوقفات المجدولة؟

هل سئمت من إيقاف الخدمة مع كل تحديث لهيكلة قاعدة البيانات؟ أشارككم قصة حقيقية وكيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من ليالي النشر الطويلة والمُجهدة،...

4 يونيو، 2026 قراءة المزيد
الشبكات والـ APIs

كانت إعادة المحاولة كارثة: كيف أنقذتنا مفاتيح عدم تكرار العمليات (Idempotency Keys) من جحيم الفواتير المزدوجة؟

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

4 يونيو، 2026 قراءة المزيد
الحوسبة السحابية

من التوقف التام إلى النجاة: كيف أنقذتنا استراتيجية “الضوء المرشد” (Pilot Light) يوم انقطعت السحابة؟

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

4 يونيو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

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

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

4 يونيو، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

من الانتظار لأيام إلى الدفع في ثوانٍ: كيف أنقذتنا شبكات الدفع الفوري من جحيم التحويلات البنكية؟

أسرد لكم من واقع تجربتي كـ "أبو عمر"، كيف عانينا من بطء وتكلفة التحويلات البنكية الدولية، وكيف جاءت شبكات الدفع الفوري ومعيار ISO 20022 لتكون...

4 يونيو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كان كل خادم لدينا ‘ندفة ثلج’ فريدة: كيف أنقذنا ‘الكود كبنية تحتية’ (IaC) من جحيم الانجراف اليدوي؟

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

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

كانت تغطية الاختبارات 100% لكن الأخطاء تتسرب: كيف أنقذنا “الاختبار الطفري” من جحيم الثقة الزائفة؟

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

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