Ansible Check Mode: راجع تغييرات الـ VM قبل التنفيذ
هتكسب من المقال ده طريقة عملية تمنع تغيير إعدادات NGINX أو SSH على كل الـ VMs قبل ما تشوف بالظبط إيه اللي هيتغير.
مستوى القارئ: متوسط
المشكلة باختصار
الطريقة الشائعة الغلط إنك تعدل ملف config على VM واحدة، وبعدها تنسخ نفس التغيير يدويًا أو تشغل playbook مباشرة على كل السيرفرات. الطريقة دي بتفشل لما template صغير يطلع فيه typo، أو لما شرط في playbook يشتغل على group أكبر من المتوقع.
الافتراض إن عندك 5 إلى 40 VM، وتستخدم Ansible لإدارة ملفات مثل /etc/nginx/nginx.conf أو /etc/ssh/sshd_config. في الحالة دي، هدفك مش إن Ansible ينفذ أسرع فقط. هدفك إنك تعرف التغيير قبل التنفيذ.
مثال بسيط: قبل ما تفتح gzip على كل السيرفرات
ركز في المثال ده. عندك موقع على 8 VMs خلف load balancer. عايز تضيف gzip في NGINX. التغيير نفسه صغير، لكن الخطأ هيقع على كل السيرفرات لو شغلت playbook مباشرة.
بدل ما تنفذ فورًا، اعمل playbook ينسخ template، ثم شغله أولًا بـ --check --diff. حسب توثيق Ansible الرسمي، check mode يحاكي التنفيذ بدون تغيير الأنظمة البعيدة، وdiff mode يعرض مقارنة قبل وبعد للملفات المدعومة.
# playbooks/nginx.yml
- name: Manage NGINX config safely
hosts: web
become: true
tasks:
- name: Render nginx main config
ansible.builtin.template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: "0644"
notify: Reload nginx
handlers:
- name: Reload nginx
ansible.builtin.service:
name: nginx
state: reloaded
الخطوات العملية في CI أو على جهازك
- اكتب التغيير في branch، وليس على السيرفر مباشرة.
- شغل محاكاة على سيرفر واحد فقط عشان تقلل الضوضاء.
- راجع الـ diff. لو ظهر تغيير غير مقصود، ارجع للـ template.
- نفذ على VM واحدة كـ canary.
- بعد 10 دقائق مراقبة، نفذ على باقي المجموعة.
# 1) راجع التغيير بدون تعديل فعلي
ansible-playbook -i inventory.ini playbooks/nginx.yml \
--check --diff --limit web-01
# 2) لو diff واضح ومقبول، نفذ على VM واحدة
ansible-playbook -i inventory.ini playbooks/nginx.yml \
--limit web-01
# 3) بعد مراقبة logs و 5xx، نفذ على باقي السيرفرات
ansible-playbook -i inventory.ini playbooks/nginx.yml \
--limit web