سيرفراتنا كرات ثلج: كيف أنقذنا Ansible من جحيم ‘انحراف الإعدادات’؟

يا جماعة الخير، فيه ليالي في حياة المبرمج ما بنساها، وليلة إطلاق النسخة الجديدة من المشروع كانت واحدة منها. الساعة كانت 2 بعد منتصف الليل، وأنا وفريقي على أعصابنا. ضغطنا زر النشر (Deploy)، والكل حابس أنفاسه. ثواني معدودة وتحولت شاشات المراقبة للون الأحمر… فشل في النشر! التطبيق الجديد مش راضي يشتغل على سيرفر الإنتاج (Production).

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

في تلك اللحظة، أدركت أن مشكلتنا أعمق من مجرد كود. مشكلتنا كانت في سيرفراتنا نفسها. كل سيرفر كان “كرة ثلج” فريدة من نوعها، له تاريخه الخاص من التحديثات اليدوية، والتعديلات السريعة، والحلول المؤقتة. كانت هذه هي اللحظة التي قررنا فيها أن هذا الجحيم يجب أن ينتهي. وهنا بدأت حكايتنا مع Ansible.

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

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

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

لماذا يعتبر انحراف الإعدادات كارثة؟

  • أخطاء غير متوقعة: مثل ما حصل معنا، الكود اللي بيشتغل تمام في بيئة ممكن يفشل في بيئة ثانية بسبب اختلاف بسيط.
  • ثغرات أمنية: سيرفر لم يتم تحديثه بنفس الطريقة قد يحتوي على ثغرات أمنية تم إصلاحها في السيرفرات الأخرى.
  • صعوبة التوسع (Scaling): كيف ممكن تضيف 10 سيرفرات جديدة بسرعة وثقة إذا كان كل سيرفر يحتاج إلى إعداد يدوي خاص؟ العملية بتصير كابوس.
  • إهدار للوقت والمجهود: قضاء ساعات في البحث عن سبب مشكلة هو في النهاية اختلاف بسيط في ملف إعدادات.

Ansible: المايسترو الذي وحّد الأوركسترا

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

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

لماذا Ansible بالذات؟

  • بلا عملاء (Agentless): هذه كانت الميزة القاتلة بالنسبة لنا. Ansible لا يتطلب تثبيت أي برامج خاصة (agents) على السيرفرات التي تديرها. كل ما يحتاجه هو اتصال SSH وصلاحيات كافية، وهذا موجود بالفعل في 99% من بيئات العمل. يعني ما فيه صداع راس لتثبيت وتحديث وإدارة برامج إضافية.
  • بساطة مدهشة: ملفات Ansible (المسماة Playbooks) مكتوبة بلغة YAML، وهي لغة سهلة القراءة والكتابة تشبه اللغة الإنجليزية. لا تحتاج لتعلم لغة برمجة معقدة. أي شخص في الفريق، حتى لو لم يكن خبير سيرفرات، يمكنه فهم ما يفعله الـ Playbook.
  • القوة في التكرار (Idempotency): هذه الكلمة الصعبة تعني شيئاً بسيطاً وعبقرياً: يمكنك تشغيل نفس الـ Playbook مئة مرة على نفس السيرفر، والنتيجة النهائية ستكون دائماً هي الحالة المطلوبة. إذا كان السيرفر في الحالة الصحيحة، Ansible لن يفعل شيئاً. هذا يمنحك الثقة لتشغيل الأتمتة مراراً وتكراراً دون الخوف من إفساد شيء.

من الفوضى إلى النظام: أول Playbook لنا

خلونا نترجم الكلام النظري إلى شيء عملي. تخيل أن مهمتنا هي التأكد من أن كل سيرفرات الويب لدينا (web servers) مثبت عليها Nginx بنفس الإصدار وبنفس ملف الإعدادات.

الخطوة 1: ملف الجرد (Inventory File)

أولاً، نخبر Ansible عن السيرفرات التي سيديرها. ننشئ ملفاً بسيطاً اسمه hosts:


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

هنا، عرفنا مجموعة اسمها webservers تحتوي على ثلاثة سيرفرات.

الخطوة 2: كتابة مسرحية العمل (The Playbook)

الآن نكتب “الوصفة” أو الـ Playbook الذي يصف الحالة التي نريد أن تكون عليها سيرفراتنا. لنسمِ الملف nginx_setup.yml:


---
- name: Configure Web Servers with Nginx
  hosts: webservers
  become: yes

  tasks:
    - name: Ensure Nginx is installed at the latest version
      apt:
        name: nginx
        state: latest
        update_cache: yes

    - name: Copy custom Nginx configuration file
      copy:
        src: ./files/nginx.conf
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: '0644'
      notify:
        - Restart Nginx

    - name: Ensure Nginx service is started and enabled on boot
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted

شرح سريع للـ Playbook

  • hosts: webservers: هذا يعني أننا نريد تطبيق هذه المهام على كل السيرفرات في مجموعة webservers التي عرفناها في ملف الجرد.
  • become: yes: هذا يخبر Ansible أن يستخدم صلاحيات المدير (root/sudo) لتنفيذ المهام.
  • tasks: هذا هو قلب الـ Playbook، قائمة بالمهام التي نريد تنفيذها.
  • المهمة الأولى: تستخدم وحدة apt (لأنظمة Debian/Ubuntu) للتأكد من أن حزمة nginx مثبتة بآخر إصدار.
  • المهمة الثانية: تستخدم وحدة copy لنسخ ملف إعدادات Nginx مخصص من جهازنا المحلي إلى المسار الصحيح على السيرفر.
  • المهمة الثالثة: تستخدم وحدة service للتأكد من أن خدمة Nginx تعمل الآن وستعمل تلقائياً عند إعادة تشغيل السيرفر.
  • handlers: هذه مهام خاصة لا يتم تشغيلها إلا عند استدعائها. لاحظ أن مهمة النسخ تحتوي على notify: Restart Nginx. هذا يعني أنه فقط إذا تغير ملف الإعدادات، سيتم استدعاء الـ handler لإعادة تشغيل Nginx. إذا لم يتغير الملف، لن تتم إعادة التشغيل. عبقري، أليس كذلك؟

لتشغيل هذا كله، نكتب في الـ terminal أمراً بسيطاً:


ansible-playbook -i hosts nginx_setup.yml

والآن، وبكبسة زر، يمكننا تطبيق نفس الإعدادات على 3 أو 100 أو 1000 سيرفر بنفس الدقة والسرعة، والقضاء على “انحراف الإعدادات” إلى الأبد.

نصائح من مطبخ أبو عمر

بعد سنوات من استخدام Ansible، تعلمت بعض الدروس التي أود مشاركتها معكم:

  1. ابدأ صغيراً: لا تحاول أتمتة كل شيء دفعة واحدة. ابدأ بمهمة بسيطة ومؤلمة، مثل تثبيت حزمة معينة أو إدارة المستخدمين. عندما ترى الفائدة، ستتحمس للمزيد.
  2. كل شيء في Git: عامل ملفات الـ Playbooks الخاصة بك كأنها كود برمجي. ضعها في نظام إدارة نسخ مثل Git. هذا يمنحك تاريخاً كاملاً للتغييرات، والقدرة على مراجعة التعديلات، والتعاون مع فريقك. هذا هو جوهر مفهوم “البنية التحتية ككود” (Infrastructure as Code).
  3. استخدم الأدوار (Roles): عندما تكبر مشاريعك، ستجد أنك تكرر نفس المهام في عدة Playbooks. الأدوار (Ansible Roles) هي طريقة لتنظيم مهامك ومتغيراتك وملفاتك في هيكل قابل لإعادة الاستخدام.
  4. لا تخترع العجلة: مجتمع Ansible ضخم ونشط. قبل أن تكتب دوراً معقداً من الصفر، ابحث في Ansible Galaxy. غالباً ستجد أن شخصاً آخر قد قام بالعمل بالفعل وبجودة عالية.
  5. استخدم Ansible Vault: للحفاظ على أمان المعلومات الحساسة (مثل كلمات المرور ومفاتيح API)، استخدم Ansible Vault لتشفيرها مباشرة داخل ملفاتك.

الخلاصة: ودّع كرات الثلج إلى الأبد 🧊

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

إذا كنت لا تزال تعاني من “السيرفرات كرات الثلج” وتلك اللحظات المحرجة التي تقول فيها “لكنها تعمل على جهازي!”، فأنصحك بشدة أن تلقي نظرة على Ansible. قد تكون هي الأداة التي تنقذك من جحيم “انحراف الإعدادات” وتمنحك راحة البال التي تستحقها. ابدأ اليوم، ولو بخطوة صغيرة. 👍

أبو عمر

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

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

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

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

آخر المدونات

التوسع والأداء العالي والأحمال

كان فشل خدمة واحدة ينهار النظام بأكمله: كيف أنقذنا نمط ‘قاطع الدائرة’ من جحيم الفشل المتتالي؟

أشارككم قصة حقيقية عن ليلة كاد فيها تطبيقنا أن ينهار بالكامل بسبب فشل خدمة صغيرة. اكتشفوا كيف أنقذنا نمط تصميم "قاطع الدائرة" (Circuit Breaker) من...

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

من كوابيس التحقق اليدوي إلى ثورة الـ eKYC: قصتي مع إنقاذ الشركات من الاحتيال والتأخير

أتذكر جيداً أكوام الورق التي كادت أن تدفننا في أحد المشاريع الناشئة. في هذه المقالة، أشارككم قصة تحولنا من جحيم التحقق اليدوي لهوية العملاء إلى...

29 أبريل، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

اجتماعاتنا كانت حقل ألغام: كيف أنقذتنا ‘السلامة النفسية’ من جحيم الصمت والخوف من الخطأ؟

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

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

كان كل تحديث CSS مغامرة مرعبة: كيف أنقذنا ‘الاختبار البصري التراجعي’ من جحيم ‘لقد بدت أفضل على جهازي’؟

أشارككم قصة حقيقية عن كارثة تسببت بها بضعة أسطر من CSS، وكيف وجدنا الخلاص في تقنية "الاختبار البصري التراجعي" (Visual Regression Testing). مقالة عملية للمطورين...

29 أبريل، 2026 قراءة المزيد
ذكاء اصطناعي

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

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

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