كلاود
أدلة

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

كلاود|١٣ يناير ٢٠٢٦|4 دقائق قراءة|٥٥١ مشاهدة
أتمتة إدارة السيرفر بـ 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 وابدأ الأتمتة خلال دقائق.


ابدأ الآن

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

مشاركة