Ansible Check Mode: اكشف Drift السيرفر قبل التنفيذ
مستوى القارئ: متوسط
هتكسب مراجعة واضحة لتغييرات السيرفر قبل ما تلمس الإنتاج، بدل ما تعرف الخطأ بعد ما NGINX يرفض يعمل reload.
المشكلة باختصار
الطريقة الشائعة بتفشل لما تعدل ملف config يدويًا على VM، ثم تعدل نفس الملف بعد أسبوع من Ansible. اللي بيحصل فعلاً إن السيرفر يبقى فيه drift: الواقع على الماكينة مش مطابق للكود الموجود في Git.
افترض إن عندك 12 VM لتطبيق Node.js وملفات NGINX وsystemd. تغيير صغير في gzip أو proxy timeout ممكن يعدي على 11 سيرفر ويفشل على واحد. لو بتعمل apply مباشر، أنت بتكتشف المشكلة بعد التنفيذ. أفضل طريقة هنا هي تشغيل dry run منظم قبل التغيير.
الفكرة بمثال بسيط
ركز في المثال ده. عندك ملف NGINX template في Git، وعلى السيرفر حد غيّر قيمة client_max_body_size يدويًا من 20m إلى 100m عشان يمرر upload كبير. بعد شهر، playbook قديم هيرجعها إلى 20m بدون ما حد ينتبه.
--check بيقول لك: “كنت هغير الملف ده”. و--diff بيوريك قبل وبعد. بالظبط زي مراجعة pull request، لكن للواقع الموجود على السيرفر. علميًا، check mode في Ansible يحاول محاكاة التغيير بدون تطبيقه، والـ diff mode يعرض الفروق في الملفات أو القيم لما الـ module يدعم ذلك.
إعداد عملي قابل للنسخ
ابدأ بمخزون بسيط. المثال مبني على VM واحدة أولًا، لأن Ansible نفسه ينصح باستخدام diff بحذر مع host محدود بسبب كثرة المخرجات واحتمال ظهور بيانات حساسة.
# inventory.ini
[web]
web-01 ansible_host=203.0.113.10 ansible_user=ubuntu
بعدها اعمل playbook صغير يدير NGINX ويمنع عرض diff للملفات الحساسة. هنا هنراجع config عام فقط.
# nginx.yml
- name: Manage nginx config safely
hosts: web
become: true
tasks:
- name: Install nginx
ansible.builtin.apt:
name: nginx
state: present
update_cache: true
- name: Render site config
ansible.builtin.template:
src: templates/app.conf.j2
dest: /etc/nginx/sites-available/app.conf
owner: root
group: root
mode: '0644'
notify: reload nginx
- name: Enable site
ansible.builtin.file:
src: /etc/nginx/sites-available/app.conf
dest: /etc/nginx/sites-enabled/app.conf
state: link
handlers:
- name: reload nginx
ansible.builtin.service:
name: nginx
state: reloaded