انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

أتمتة الخوادم مع Ansible: البنية التحتية كرمز

تثبيت Ansible، ملف الجرد، كتابة playbook، هيكل الأدوار، المتغيرات، vault المشفر، أوامر ad-hoc وأتمتة تكوين الخادم. دليل خطوة بخطوة.

وقت القراءة: 20 دقيقة DevOps والأتمتة
ansibleأتمتةinfrastructure as codedevopsplaybookyamllinux

جدول المحتويات

أتمتة الخوادم مع Ansible: البنية التحتية كرمز

Ansible أداة مفتوحة المصدر تتيح لك إدارة تكوين الخادم ونشر التطبيقات وأتمتة المهام كرمز. بفضل معماريتها بدون وكيل، تتصل فقط بالخوادم المستهدفة عبر SSH.

ما هو Ansible؟

الميزات الرئيسية لـ Ansible:

  • بدون وكيل: لا يتطلب تثبيت برامج إضافية على الخوادم المستهدفة
  • Idempotent: تشغيل نفس playbook عدة مرات يعطي نفس النتيجة
  • مبني على YAML: سهل القراءة والكتابة
  • مكتبة وحدات كبيرة: أكثر من 3000 وحدة جاهزة

يتصل Ansible من عقدة التحكم بالخوادم المستهدفة عبر SSH. يُستخدم WinRM لخوادم Windows.

تثبيت Ansible

Ubuntu/Debian

hljs bash
# إضافة مستودع 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

hljs bash
# إضافة مستودع EPEL
sudo dnf install epel-release -y
sudo dnf install ansible -y

# بديل: التثبيت عبر pip
pip3 install ansible

التثبيت عبر pip (موصى به)

hljs bash
# إنشاء بيئة Python افتراضية
python3 -m venv ansible-env
source ansible-env/bin/activate

# تثبيت Ansible والأدوات الإضافية
pip install ansible ansible-lint

# التحقق من الإصدار
ansible --version

ملف الجرد

يحدد الجرد الخوادم التي سيديرها Ansible:

تنسيق INI

hljs 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

hljs 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 للمهام السريعة:

hljs bash
# اختبار 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 الأساسي

hljs yaml
# 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

hljs yaml
# مهام شرطية
- 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

المتغيرات والحقائق

hljs yaml
# group_vars/webservers.yml
http_port: 80
https_port: 443
app_user: www-data
app_dir: /var/www/html
hljs yaml
# استخدام المتغيرات في 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

لتشفير البيانات الحساسة:

hljs bash
# إنشاء ملف مشفر
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

هيكل الأدوار

hljs bash
# إنشاء دور
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

hljs yaml
---
- 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

hljs bash
# التشغيل الأساسي
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 مع إنشاء تكوينات قابلة لإعادة الاستخدام مع الأدوار.