Як написати перший Ansible-плейбук

Як написати перший Ansible-плейбук – ITEDU Blog

Якщо для керування кількома серверами ви досі підключаєтеся до кожного через SSH і вручну виконуєте команди в терміналі, настав час змінити підхід. Ручне адміністрування сповільнює роботу та неминуче призводить до помилок через людський фактор.

Ansible — це інструмент автоматизації, який реалізує концепцію Infrastructure as Code (IaC). Ви один раз описуєте бажаний стан системи у файлі конфігурації, а Ansible самостійно приводить сервери до цього стану.

Основні компоненти Ansible 

Щоб правильно будувати сценарії автоматизації, важливо розуміти 4 базові елементи структури Ansible: 

  1. Playbook (Плейбук): загальний файл сценарію (з розширенням .yml або .yaml), який об’єднує один або кілька сценаріїв виконання.
  2. Play (Сценарій): блок усередині плейбука, який зв’язує конкретну групу серверів із набором завдань, які на них треба виконати.
  3. Task (Завдання): окрема дія всередині Play (наприклад, «встановити пакет» або «створити каталог»). Завдання виконуються суворо послідовно — зверху вниз.
  4. Module (Модуль): готовий блок коду Python, який відповідає за безпосереднє виконання завдання на віддаленій машині (наприклад, модуль apt для роботи з пакетами Ubuntu або service для керування демонами).

У сучасних версіях Ansible модулі записують за допомогою Fully Qualified Collection Name — повного імені колекції. Наприклад, замість простого модуля apt використовують ansible.builtin.apt. Це запобігає конфліктам імен і є стандартом написання чистого коду. 

Підготовка середовища для роботи з Ansible

Перед написанням плейбуків потрібно налаштувати управляючий вузол та підготувати конфігурацію для підключення до віддалених серверів.

Архітектура підключення

Ansible використовує модель Control Node → Managed Nodes:

  • Control Node (Управляючий вузол): Комп’ютер або сервер під управлінням Linux/macOS, з якого запускаються плейбуки.
  • Managed Nodes (Керовані вузли): Сервери, якими ви керуєте. На них потрібні лише Python 3 та відкритий SSH-доступ.

Встановлення Ansible у Python venv

Щоб уникнути конфліктів із системними пакетами операційної системи, Ansible варто встановлювати в ізольоване віртуальне середовище Python (venv).

Створіть робочу директорію проєкту та активуйте віртуальне середовище:

mkdir ansible-first-steps && cd ansible-first-steps
python3 -m venv venv
source venv/bin/activate

Установіть пакет ansible-core (містить рушій Ansible та базові модулі):

pip install ansible-core

Аутентифікація за паролем: для продакшену варто використовувати виключно SSH-ключі. Якщо ви підключаєтеся до серверів за паролем, додатково встановіть утиліту sshpass у свою систему (наприклад, через sudo apt install sshpass). 

Створення файлу інвентаря

Ansible має знати IP-адреси або доменні імена серверів, якими він керує. Для цього створюється файл інвентаря.

Створіть файл inventory.ini у папці проєкту:

# inventory.ini

[webservers]
192.168.1.10
192.168.1.11

[dbservers]
192.168.1.20

[all:vars]
ansible_user=ubuntu

Що тут описано:

  • [webservers] та [dbservers] — групи серверів. Ви зможете застосовувати сценарії як до окремих груп, так і до всіх машин одразу.
  • [all:vars] — блок спільних змінних для всіх серверів у цьому інвентарі. Директива ansible_user=ubuntu вказує, під яким SSH-користувачем Ansible має підключатися до машин.

Запуск першого Ansible-плейбука

Тепер, коли середовище підготовлене, створимо та запустимо мінімальний плейбук. Це дозволить перевірити зв’язок із серверами та зрозуміти базову структуру конфігураційного файлу.

Ansible-плейбуки пишуться мовою YAML. Якщо ви хочете докладніше розібратися з базовим синтаксисом, перегляньте наш окремий гайд про YAML для новачків

Структура базового плейбука

Створіть файл playbook.yml у папі проєкту. Наш перший сценарій виконуватиме дві прості дії: перевірятиме доступність серверів за допомогою модуля ping та виводитиме текстове повідомлення через модуль debug.

---
- name: Перевірка зв'язку та вивід привітання
  hosts: webservers
  become: yes

  tasks:
    - name: Перевірка доступності вузла
      ansible.builtin.ping:

    - name: Вивід текстового повідомлення
      ansible.builtin.debug:
        msg: "Сервер успішно налаштовується через Ansible!"

Запуск плейбука та аналіз результатів

Для запуску сценарію використовується команда ansible-playbook. Передайте їй файл інвентаря через параметр -i та шлях до плейбука:

ansible-playbook -i inventory.ini playbook.yml

Після виконання у терміналі з’явиться детальний звіт: 

PLAY [Перевірка зв'язку та вивід привітання] ***********************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.1.10]
ok: [192.168.1.11]

TASK [Перевірка доступності вузла] *********************************************
ok: [192.168.1.10]
ok: [192.168.1.11]

TASK [Вивід текстового повідомлення] *******************************************
ok: [192.168.1.10] => {
    "msg": "Сервер успішно налаштовується через Ansible!"
}
ok: [192.168.1.11] => {
    "msg": "Сервер успішно налаштовується через Ansible!"
}

PLAY RECAP *********************************************************************
192.168.1.10               : ok=3    changed=0    unreachable=0    failed=0
192.168.1.11               : ok=3    changed=0    unreachable=0    failed=0

Що важливо врахувати у виводі:

  • Gathering Facts
    Ansible автоматично запускає це завдання перед виконанням ваших завдань. Воно збирає системну інформацію про керований вузол (ОС, IP-адреси, диск тощо).
  • PLAY RECAP
    Підсумковий блок. Статус ok=3 означає, що всі три завдання (включаючи Gathering Facts) виконано успішно, а changed=0 підтверджує, що конфігурація системи не зазнала змін.

Автоматизація розгортання Nginx

Після успішного тестового запуску створимо плейбук для реального завдання — розгортання та налаштування вебсервера Nginx на серверах під управлінням Ubuntu/Debian.

Цей сценарій демонструє роботу зі змінними, оновленням пакетів, встановленням програм, генерацією файлів та керуванням системними службами.

Код плейбука setup-webserver.yml

Створіть файл setup-webserver.yml:

---
- name: Розгортання та конфігурація вебсервера Nginx
  hosts: webservers
  become: yes

  vars:
    http_port: 80
    server_admin: "admin@example.com"

  tasks:
    - name: Оновлення кешу пакетів apt
      ansible.builtin.apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Встановлення вебсервера Nginx
      ansible.builtin.apt:
        name: nginx
        state: present

    - name: Створення тестової сторінки index.html
      ansible.builtin.copy:
        content: |
          <html>
            <head><title>Вітаємо у Ansible!</title></head>
            <body>
              <h1>Сервер {{ inventory_hostname }} успішно налаштовано!</h1>
              <p>Адміністратор: {{ server_admin }}</p>
            </body>
          </html>
        dest: /var/www/html/index.html
        owner: www-data
        group: www-data
        mode: '0644'

    - name: Перевірка запуску та автозавантаження Nginx
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: yes

Розбір структури та модулів плейбука

1. Блок змінних (vars)

Використовується для винесення конфігураційних даних на початок файлу. Для підстановки значень у коді використовується синтаксис {{ variable_name }}.

  • http_port — порт, на якому працюватиме вебсервер.
  • server_admin — email-адреса адміністратора, яка підставляється в HTML-сторінку.

2. Модуль ansible.builtin.apt— керування пакетами Ubuntu/Debian

Відповідає за оновлення репозиторіїв та встановлення програмного забезпечення.

  • update_cache: yes — аналог команди apt update.
  • cache_valid_time: 3600 — оновлює кеш пакетів лише тоді, коли з останньої перевірки минула година (3600 секунд). Це прискорює повторні запуски.
  • name: nginx — назва пакета для встановлення.
  • state: present — перевіряє наявність пакета. Якщо Nginx уже встановлено, Ansible пропустить цей крок.

3. Модуль ansible.builtin.copy — створення та копіювання файлів

Відповідає за створення конфігураційних файлів або вебсторінок на віддаленому сервері.

  • content: | — дозволяє написати вміст файлу (HTML-код) безпосередньо всередині плейбука.
  • dest — шлях на віддаленому сервері, куди буде збережено файл (/var/www/html/index.html).
  • owner / group — задають власника та групу файлу (www-data).
  • mode: '0644' — встановлює права доступу до файлу (читання для всіх, запис лише для власника).
  • {{ inventory_hostname }} — системна змінна Ansible, яка автоматично підставляє IP-адресу або ім’я поточного сервера.

4. Модуль ansible.builtin.service — керування системними службами

Відповідає за запуск, зупинку та автозавантаження фонових процесів (systemd).

  • name: nginx — назва системної служби.
  • state: started — перевіряє, чи запущено службу. Якщо вона зупинена — запускає її.
  • enabled: yes — додає службу в автозавантаження при старті сервера.

Оптимізація роботи 

Часто виникає потреба перезапустити службу лише тоді, коли змінився її конфігураційний файл. Для цього використовуються Handlers (хендлери).

Хендлер — це окреме завдання, яке виконується тільки за умови, що інше завдання повернуло статус changed і надіслало сповіщення через директиву notify.

Додамо хендлер до нашого плейбука:

---
- name: Оновлення конфігурації Nginx з використанням хендлера
  hosts: webservers
  become: yes

  tasks:
    - name: Оновлення сторінки index.html
      ansible.builtin.copy:
        src: files/index.html
        dest: /var/www/html/index.html
        owner: www-data
        group: www-data
        mode: '0644'
      notify: Перезапуск Nginx

  handlers:
    - name: Перезапуск Nginx
      ansible.builtin.service:
        name: nginx
        state: restarted

Якщо файл index.html не змінювався, крок сповіщення буде пропущено, і Nginx не виконуватиме зайвих перезапусків. 

Корисні режими перевірки та запуску

Щоб уникнути помилок у продакшені, перед реальним запуском використовуйте спеціальні прапорці команди ansible-playbook:

  • Перевірка синтаксису:
ansible-playbook -i inventory.ini setup-webserver.yml --syntax-check

Швидко перевіряє структуру YAML на наявність синтаксичних помилок без підключення до хостів. 

  • Режим тестування (Dry-Run):
ansible-playbook -i inventory.ini setup-webserver.yml --check

Показує, які саме зміни відбулися б на серверах, але фактично нічого не змінює.

  • Детальний вивід змін у файлах:
ansible-playbook -i inventory.ini setup-webserver.yml --check --diff

Відображає точну різницю між поточними та новими конфігураційними файлами. 

Розширені можливості: цикли та умови

Для оптимізації коду та підтримки різних операційних систем використовують цикли (loop) та умовні оператори (when).

Скорочення завдань за допомогою циклів

Замість написання окремого завдання під кожен пакет, об’єднайте їх у список:

- name: Встановлення базового набору утиліт
  ansible.builtin.apt:
    name: "{{ item }}"
    state: present
  loop:
    - git
    - curl
    - htop
    - vim

Виконання за умовою

Якщо у вашій мережі використовуються сервери з різними дистрибутивами Linux, вкажіть умови виконання завдань на основі фактів про систему:

- name: Встановлення Nginx на Debian/Ubuntu
  ansible.builtin.apt:
    name: nginx
    state: present
  when: ansible_facts['os_family'] == "Debian"

- name: Встановлення Nginx на RHEL/Rocky Linux
  ansible.builtin.dnf:
    name: nginx
    state: present
  when: ansible_facts['os_family'] == "RedHat"

Висновок

Вітаємо, ви зробили значний крок у світ автоматизації — розібрали базовий цикл роботи з Ansible.

Тепер ваша інфраструктура може описуватися кодом, який легко зберігати у Git, тестувати та розгортати за секунди.

Якщо ви захочете піти далі за створення плейбуків — рекомендуємо практичний курс від ITEDU «Ansible. Практикум з адміністрування та автоматизації». Навчання триває всього 4 тижні і вкладається у 8 занять. Але за цей короткий період ви отримаєте топовий буст для своєї кар’єри.

Залишити відповідь

Дякуємо, що поділились