أتمتة إدارة السيرفر بـ Ansible: دليل عملي

تحديث 10 سيرفرات بأمر واحد. Ansible يأتمت المهام المتكررة. نشرح التثبيت وأول 5 playbooks عملية.
لماذا أتمتة السيرفرات؟
إدارة سيرفر واحد يدوياً ممكنة. إدارة 5 سيرفرات يدوياً متعبة. إدارة 20 سيرفر يدوياً مستحيلة بدون أخطاء. هنا يأتي دور الأتمتة.
Ansible أداة أتمتة مفتوحة المصدر من Red Hat تتيح لك إدارة عشرات السيرفرات من مكان واحد بدون تثبيت أي شيء على السيرفرات المُدارة. تعتمد على SSH فقط — وهذا يعني أن أي سيرفر تقدر تدخله بـ SSH تقدر تديره بـ Ansible.
تثبيت Ansible
على جهازك المحلي (Control Node) — لا تثبّته على السيرفرات المُدارة:
# Ubuntu/Debian
sudo apt update
sudo apt install ansible -y
# macOS
brew install ansible
# التحقق من التثبيت
ansible --version
ملف المخزون (Inventory)
ملف المخزون يحدد السيرفرات التي يديرها Ansible. أنشئ ملف inventory.ini:
[web_servers]
web1 ansible_host=10.0.1.10 ansible_user=root
web2 ansible_host=10.0.1.11 ansible_user=root
[db_servers]
db1 ansible_host=10.0.1.20 ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
اختبر الاتصال بجميع السيرفرات:
ansible all -i inventory.ini -m ping
أوامر Ad-Hoc
قبل كتابة Playbooks، تقدر تنفّذ أوامر مباشرة على جميع السيرفرات:
# تحديث جميع السيرفرات
ansible all -i inventory.ini -m apt -a "upgrade=dist update_cache=yes"
# التحقق من مساحة القرص
ansible all -i inventory.ini -m shell -a "df -h /"
# إعادة تشغيل خدمة nginx على سيرفرات الويب فقط
ansible web_servers -i inventory.ini -m service -a "name=nginx state=restarted"
كتابة أول Playbook
الـ Playbook هو ملف YAML يصف الحالة المطلوبة للسيرفر. أنشئ ملف setup-web.yml:
---
- name: إعداد سيرفرات الويب
hosts: web_servers
become: yes
vars:
packages:
- nginx
- certbot
- python3-certbot-nginx
- fail2ban
- ufw
tasks:
- name: تحديث قائمة الحزم
apt:
update_cache: yes
cache_valid_time: 3600
- name: تثبيت الحزم المطلوبة
apt:
name: "{{ packages }}"
state: present
- name: تفعيل وتشغيل nginx
service:
name: nginx
state: started
enabled: yes
- name: تفعيل UFW وفتح المنافذ
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- '22'
- '80'
- '443'
- name: تفعيل جدار الحماية
ufw:
state: enabled
policy: deny
نفّذ الـ Playbook:
ansible-playbook -i inventory.ini setup-web.yml
استخدام Roles لتنظيم الكود
مع نمو البنية التحتية، تحتاج تنظيم Playbooks في Roles قابلة لإعادة الاستخدام:
mkdir -p roles/common/tasks roles/common/handlers roles/common/templates
mkdir -p roles/nginx/tasks roles/nginx/handlers roles/nginx/templates
ملف roles/common/tasks/main.yml:
---
- name: تحديث النظام
apt:
upgrade: dist
update_cache: yes
- name: تثبيت أدوات أساسية
apt:
name:
- htop
- curl
- vim
- git
- unzip
state: present
- name: ضبط المنطقة الزمنية
timezone:
name: Asia/Riyadh
إدارة الأسرار مع Ansible Vault
لا تحفظ كلمات المرور في ملفات نصية. استخدم Ansible Vault:
# إنشاء ملف مشفر
ansible-vault create secrets.yml
# تعديل ملف مشفر
ansible-vault edit secrets.yml
# تشغيل playbook مع ملف مشفر
ansible-playbook -i inventory.ini site.yml --ask-vault-pass
مثال عملي: نشر تطبيق Laravel
---
- name: نشر تطبيق Laravel
hosts: web_servers
become: yes
vars_files:
- secrets.yml
tasks:
- name: سحب آخر نسخة من الكود
git:
repo: "{{ app_repo }}"
dest: /var/www/app
version: main
force: yes
- name: تثبيت الاعتماديات
composer:
command: install
working_dir: /var/www/app
no_dev: yes
- name: نسخ ملف البيئة
template:
src: templates/env.j2
dest: /var/www/app/.env
mode: '0600'
- name: تشغيل المهاجرات
command: php artisan migrate --force
args:
chdir: /var/www/app
- name: مسح الكاش
command: php artisan optimize:clear
args:
chdir: /var/www/app
- name: ضبط الصلاحيات
file:
path: /var/www/app/storage
recurse: yes
owner: www-data
group: www-data
أفضل الممارسات
هيكلة المشروع
ansible-project/
├── inventory/
│ ├── production.ini
│ └── staging.ini
├── roles/
│ ├── common/
│ ├── nginx/
│ ├── php/
│ └── mysql/
├── group_vars/
│ ├── all.yml
│ └── web_servers.yml
├── site.yml
└── ansible.cfg
قواعد ذهبية
- Idempotent دائماً: الـ Playbook يجب أن يعطي نفس النتيجة سواء شغّلته مرة أو عشر مرات
- لا تستخدم shell/command إلا للضرورة: استخدم Modules المتخصصة
- استخدم Tags: لتشغيل أجزاء محددة من الـ Playbook
- اختبر على Staging أولاً: لا تجرّب على الإنتاج مباشرة
التكامل مع كلاود
سيرفرات كلاود تأتي جاهزة بصلاحية root كاملة واتصال SSH — وهذا كل ما يحتاجه Ansible. ابدأ بسيرفر في الرياض بزمن استجابة 8ms واستخدم Ansible لأتمتة كل شيء من الإعداد الأولي حتى النشر المستمر.
مع كلاود، تقدر تبني بنية تحتية كاملة مؤتمتة بدون الحاجة لتسجيل الدخول يدوياً لكل سيرفر. اطلب سيرفرك من cloud.net.sa وابدأ الأتمتة خلال دقائق.
ابدأ الآن
جاهز تبني مشروعك؟ اختر خادمك السحابي بالمواصفات اللي يحتاجها تطبيقك، أو راجع الباقات والأسعار.
