أتمتة الخوادم مع Ansible: البنية التحتية كرمز
تثبيت Ansible، ملف الجرد، كتابة playbook، هيكل الأدوار، المتغيرات، vault المشفر، أوامر ad-hoc وأتمتة تكوين الخادم. دليل خطوة بخطوة.
جدول المحتويات
أتمتة الخوادم مع Ansible: البنية التحتية كرمز
Ansible أداة مفتوحة المصدر تتيح لك إدارة تكوين الخادم ونشر التطبيقات وأتمتة المهام كرمز. بفضل معماريتها بدون وكيل، تتصل فقط بالخوادم المستهدفة عبر SSH.
ما هو Ansible؟
الميزات الرئيسية لـ Ansible:
- بدون وكيل: لا يتطلب تثبيت برامج إضافية على الخوادم المستهدفة
- Idempotent: تشغيل نفس playbook عدة مرات يعطي نفس النتيجة
- مبني على YAML: سهل القراءة والكتابة
- مكتبة وحدات كبيرة: أكثر من 3000 وحدة جاهزة
يتصل Ansible من عقدة التحكم بالخوادم المستهدفة عبر SSH. يُستخدم WinRM لخوادم Windows.
تثبيت Ansible
Ubuntu/Debian
# إضافة مستودع 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
RHEL/CentOS/AlmaLinux
# إضافة مستودع EPEL
sudo dnf install epel-release -y
sudo dnf install ansible -y
# بديل: التثبيت عبر pip
pip3 install ansible
التثبيت عبر pip (موصى به)
# إنشاء بيئة Python افتراضية
python3 -m venv ansible-env
source ansible-env/bin/activate
# تثبيت Ansible والأدوات الإضافية
pip install ansible ansible-lint
# التحقق من الإصدار
ansible --version
ملف الجرد
يحدد الجرد الخوادم التي سيديرها Ansible:
تنسيق INI
# /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
تنسيق YAML
# 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
أوامر Ad-hoc
نفّذ أوامر بدون كتابة 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"
كتابة Playbook
هيكل Playbook الأساسي
# 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
Tasks وHandlers وRoles
# مهام شرطية
- 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
لتشفير البيانات الحساسة:
# إنشاء ملف مشفر
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 # المتغيرات
أمثلة Playbook
Playbook تثبيت Nginx
---
- 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
تشغيل Playbook
# التشغيل الأساسي
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 مع إنشاء تكوينات قابلة لإعادة الاستخدام مع الأدوار.
مقالات ذات صلة
دليل Docker Compose: إدارة تطبيقات متعددة الحاويات
تعريف وإدارة التطبيقات متعددة الحاويات باستخدام Docker Compose: تبعيات الخدمات، متغيرات البيئة، فحوصات الصحة، التوسع والنشر في بيئة الإنتاج. دليل شامل.
النشر التلقائي مع GitHub Actions: إعداد CI/CD Pipeline
إنشاء CI/CD pipelines مع GitHub Actions: بناء ونشر Docker، النشر على الخادم عبر SSH، أتمتة الاختبارات، إدارة الأسرار وتحسين سير العمل.
إعداد خادم ويب Caddy: HTTPS تلقائي وبروكسي عكسي
تثبيت خادم ويب Caddy، تكوين Caddyfile، SSL تلقائي من Let's Encrypt، بروكسي عكسي، استضافة المواقع الثابتة، تكامل PHP-FPM وإعدادات الأداء.