Як написати перший Ansible-плейбук
Якщо для керування кількома серверами ви досі підключаєтеся до кожного через SSH і вручну виконуєте команди в терміналі, настав час змінити підхід. Ручне адміністрування сповільнює роботу та неминуче призводить до помилок через людський фактор.
Ansible — це інструмент автоматизації, який реалізує концепцію Infrastructure as Code (IaC). Ви один раз описуєте бажаний стан системи у файлі конфігурації, а Ansible самостійно приводить сервери до цього стану.
Основні компоненти Ansible
Щоб правильно будувати сценарії автоматизації, важливо розуміти 4 базові елементи структури Ansible:
- Playbook (Плейбук): загальний файл сценарію (з розширенням
.ymlабо.yaml), який об’єднує один або кілька сценаріїв виконання. - Play (Сценарій): блок усередині плейбука, який зв’язує конкретну групу серверів із набором завдань, які на них треба виконати.
- Task (Завдання): окрема дія всередині Play (наприклад, «встановити пакет» або «створити каталог»). Завдання виконуються суворо послідовно — зверху вниз.
- 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 занять. Але за цей короткий період ви отримаєте топовий буст для своєї кар’єри.