دليل Docker Compose: إدارة تطبيقات متعددة الحاويات
تعريف وإدارة التطبيقات متعددة الحاويات باستخدام Docker Compose: تبعيات الخدمات، متغيرات البيئة، فحوصات الصحة، التوسع والنشر في بيئة الإنتاج. دليل شامل.
تثبيت Ansible، ملف الجرد، كتابة playbook، هيكل الأدوار، المتغيرات، vault المشفر، أوامر ad-hoc وأتمتة تكوين الخادم. دليل خطوة بخطوة.
Ansible أداة مفتوحة المصدر تتيح لك إدارة تكوين الخادم ونشر التطبيقات وأتمتة المهام كرمز. بفضل معماريتها بدون وكيل، تتصل فقط بالخوادم المستهدفة عبر SSH.
الميزات الرئيسية لـ Ansible:
يتصل Ansible من عقدة التحكم بالخوادم المستهدفة عبر SSH. يُستخدم WinRM لخوادم Windows.
# إضافة مستودع PPA
sudo apt update
sudo apt install software-properties-common -y
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible -y
# التحقق من الإصدار
ansible --version
# إضافة مستودع EPEL
sudo dnf install epel-release -y
sudo dnf install ansible -y
# بديل: التثبيت عبر pip
pip3 install ansible
# إنشاء بيئة Python افتراضية
python3 -m venv ansible-env
source ansible-env/bin/activate
# تثبيت Ansible والأدوات الإضافية
pip install ansible ansible-lint
# التحقق من الإصدار
ansible --version
يحدد الجرد الخوادم التي سيديرها Ansible:
# /etc/ansible/hosts أو ملف جرد مخصص
# خادم واحد
web1.example.com
# تعريف المجموعة
[webservers]
web1.example.com
web2.example.com ansible_port=2222
192.168.1.10 ansible_user=ubuntu
[databases]
db1.example.com
db2.example.com
# متغيرات المجموعة
[webservers:vars]
ansible_user=deploy
ansible_python_interpreter=/usr/bin/python3
# المجموعة الأم
[production:children]
webservers
databases
# inventory.yml
all:
children:
webservers:
hosts:
web1.example.com:
ansible_port: 22
web2.example.com:
ansible_port: 2222
vars:
ansible_user: deploy
http_port: 80
databases:
hosts:
db1.example.com:
db2.example.com:
vars:
ansible_user: dbadmin
db_port: 5432
نفّذ أوامر بدون كتابة playbook للمهام السريعة:
# اختبار ping
ansible all -m ping
ansible webservers -m ping -i inventory.yml
# تشغيل أمر
ansible all -m command -a "uptime"
ansible webservers -m shell -a "df -h"
# نسخ ملف
ansible webservers -m copy -a "src=/local/file dest=/remote/path"
# تثبيت حزمة
ansible webservers -m apt -a "name=nginx state=present" --become
# إدارة الخدمة
ansible webservers -m service -a "name=nginx state=started enabled=yes" --become
# إنشاء/حذف ملف
ansible all -m file -a "path=/tmp/test state=touch"
ansible all -m file -a "path=/tmp/test state=absent"
# جمع الحقائق
ansible web1.example.com -m setup
ansible all -m setup -a "filter=ansible_os_family"
# site.yml
---
- name: تكوين خوادم الويب
hosts: webservers
become: yes # استخدام sudo
vars:
http_port: 80
max_clients: 200
tasks:
- name: تثبيت Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: نسخ تكوين Nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: إعادة تشغيل Nginx
- name: تشغيل خدمة Nginx
service:
name: nginx
state: started
enabled: yes
handlers:
- name: إعادة تشغيل Nginx
service:
name: nginx
state: restarted
# مهام شرطية
- name: تثبيت حزمة على Ubuntu
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- curl
- git
when: ansible_os_family == "Debian"
- name: تثبيت حزمة على RHEL
dnf:
name: "{{ item }}"
state: present
loop:
- nginx
- curl
- git
when: ansible_os_family == "RedHat"
# إنشاء مستخدمين بحلقة
- name: إنشاء المستخدمين
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
state: present
loop:
- { name: 'alice', groups: 'sudo' }
- { name: 'bob', groups: 'www-data' }
# التسجيل والشرط
- name: التحقق من إصدار Nginx
command: nginx -v
register: nginx_version
ignore_errors: yes
- name: تثبيت Nginx إذا لم يكن مثبتاً
apt:
name: nginx
state: present
when: nginx_version.rc != 0
# group_vars/webservers.yml
http_port: 80
https_port: 443
app_user: www-data
app_dir: /var/www/html
# استخدام المتغيرات في playbook
- name: إنشاء مجلد التطبيق
file:
path: "{{ app_dir }}"
state: directory
owner: "{{ app_user }}"
mode: '0755'
# استخدام الحقائق
- name: عرض معلومات النظام
debug:
msg: |
نظام التشغيل: {{ ansible_distribution }} {{ ansible_distribution_version }}
المعالج: {{ ansible_processor_vcpus }} نواة
الذاكرة: {{ ansible_memtotal_mb }} ميجابايت
IP: {{ ansible_default_ipv4.address }}
لتشفير البيانات الحساسة:
# إنشاء ملف مشفر
ansible-vault create secrets.yml
# تشفير ملف موجود
ansible-vault encrypt vars/passwords.yml
# تعديل ملف مشفر
ansible-vault edit secrets.yml
# عرض ملف مشفر
ansible-vault view secrets.yml
# إزالة التشفير
ansible-vault decrypt vars/passwords.yml
# تغيير كلمة المرور
ansible-vault rekey secrets.yml
# تشغيل playbook مع vault
ansible-playbook site.yml --ask-vault-pass
ansible-playbook site.yml --vault-password-file ~/.vault_pass
# إنشاء دور
ansible-galaxy init roles/nginx
# هيكل مجلد الدور
roles/nginx/
├── defaults/
│ └── main.yml # المتغيرات الافتراضية
├── files/
│ └── nginx.conf # الملفات الثابتة
├── handlers/
│ └── main.yml # المعالجات
├── meta/
│ └── main.yml # بيانات الدور الوصفية
├── tasks/
│ └── main.yml # المهام الرئيسية
├── templates/
│ └── vhost.conf.j2 # قوالب Jinja2
└── vars/
└── main.yml # المتغيرات
---
- name: تثبيت خادم ويب Nginx
hosts: webservers
become: yes
vars:
domain: example.com
web_root: /var/www/{{ domain }}
tasks:
- name: تثبيت Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: إنشاء مجلد الويب
file:
path: "{{ web_root }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: إنشاء مثال index.html
copy:
content: "<h1>مرحباً من {{ inventory_hostname }}</h1>"
dest: "{{ web_root }}/index.html"
owner: www-data
- name: تكوين المضيف الافتراضي
template:
src: vhost.conf.j2
dest: /etc/nginx/sites-available/{{ domain }}
notify: إعادة تحميل Nginx
- name: تفعيل المضيف الافتراضي
file:
src: /etc/nginx/sites-available/{{ domain }}
dest: /etc/nginx/sites-enabled/{{ domain }}
state: link
notify: إعادة تحميل Nginx
- name: تعطيل الموقع الافتراضي
file:
path: /etc/nginx/sites-enabled/default
state: absent
notify: إعادة تحميل Nginx
- name: السماح لـ Nginx في UFW
ufw:
rule: allow
name: 'Nginx Full'
handlers:
- name: إعادة تحميل Nginx
service:
name: nginx
state: reloaded
# التشغيل الأساسي
ansible-playbook site.yml
# مع جرد محدد
ansible-playbook -i inventory.yml site.yml
# مضيف أو مجموعة محددة
ansible-playbook site.yml --limit webservers
ansible-playbook site.yml --limit web1.example.com
# تشغيل تجريبي (فحص بدون تغييرات)
ansible-playbook site.yml --check
# وضع التفصيل
ansible-playbook site.yml -v
ansible-playbook site.yml -vvv
# تشغيل علامات محددة
ansible-playbook site.yml --tags "nginx,ssl"
ansible-playbook site.yml --skip-tags "debug"
# متغيرات إضافية
ansible-playbook site.yml -e "env=production version=1.5"
Ansible أحد أكثر الطرق سهولة لإدارة أتمتة الخوادم كرمز. بمعماريتها بدون وكيل ومكتبة الوحدات الكبيرة والهيكل المبني على YAML، يمكنك إدارة البنية التحتية الصغيرة والكبيرة بسهولة. احتفظ بالبيانات الحساسة آمنة مع Vault مع إنشاء تكوينات قابلة لإعادة الاستخدام مع الأدوار.
يعمل Ansible بدون وكلاء (يتطلب SSH فقط)، بينما يتطلب Puppet وChef تثبيت وكيل على الخوادم المستهدفة. Ansible مبني على YAML وأسهل في التعلم. يوفر Puppet وChef إدارة حالة أقوى لكنهما أكثر تعقيداً في الإعداد والتعلم. يُفضَّل Ansible عادةً للبنية التحتية الصغيرة والمتوسطة.
تعني Idempotency أن تشغيل نفس العملية عدة مرات يعطي دائماً نفس النتيجة. وحدات Ansible مصممة لتكون idempotent: إذا كان nginx مثبتاً بالفعل لن يُعاد تثبيته، وإذا كان الملف صحيحاً بالفعل لن يُغيَّر. هذا يتيح إعادة تشغيل playbooks بأمان.
إذا نُسيت كلمة مرور vault، لا يمكن استرداد الملفات المشفرة. لذلك من الضروري تخزين كلمة مرور vault في مدير كلمات مرور آمن (1Password, Bitwarden إلخ). في بيئات الإنتاج، يُنصح بكتابة كلمة مرور vault في ملف (--vault-password-file) وتخزينه بأمان.
Ansible Galaxy المنصة الرسمية حيث تُشارَك الأدوار والمجموعات التي أنشأها المجتمع (galaxy.ansible.com). يمكن تنزيل الأدوار الجاهزة بأوامر مثل 'ansible-galaxy install geerlingguy.nginx'. هذا يتيح استخدام أدوار مختبرة بدلاً من الكتابة من الصفر.
زد قيمة 'forks' في ansible.cfg (الافتراضي 5، يُنصح بـ 20-50). قلل عدد اتصالات SSH مع 'pipelining = True'. مكّن التشغيل المتوازي للمضيفين المستقلين مع 'strategy: free'. تحكم في حجم الدفعة مع 'serial' في الجرد الكبير.
نعم، يمكن لـ Ansible إدارة خوادم Windows عبر بروتوكول WinRM (Windows Remote Management). الإعدادات 'ansible_connection: winrm' و'ansible_winrm_transport: ntlm' مطلوبة. وحدات Windows تبدأ بالبادئة 'win_': win_package, win_service, win_file إلخ.
تعريف وإدارة التطبيقات متعددة الحاويات باستخدام Docker Compose: تبعيات الخدمات، متغيرات البيئة، فحوصات الصحة، التوسع والنشر في بيئة الإنتاج. دليل شامل.
إنشاء CI/CD pipelines مع GitHub Actions: بناء ونشر Docker، النشر على الخادم عبر SSH، أتمتة الاختبارات، إدارة الأسرار وتحسين سير العمل.
تثبيت خادم ويب Caddy، تكوين Caddyfile، SSL تلقائي من Let's Encrypt، بروكسي عكسي، استضافة المواقع الثابتة، تكامل PHP-FPM وإعدادات الأداء.