Ansible: основи автоматизації, принципи роботи та приклади корисних playbook
Вступ
Автоматизація інфраструктури стала стандартом у сучасній розробці та експлуатації програмного забезпечення. Концепції Infrastructure as Code (IaC), безперервної інтеграції та безперервного розгортання (CI/CD), керування конфігураціями та масштабування середовищ неможливо реалізувати ефективно без спеціалізованих інструментів. Одним із найпоширеніших рішень у цій сфері є Ansible.
Ansible - це агентless-система автоматизації, яка дозволяє керувати серверами, застосунками, мережевими пристроями та хмарною інфраструктурою за допомогою декларативних сценаріїв. Завдяки простому синтаксису на базі YAML та мінімальним вимогам до інфраструктури, він став популярним як серед DevOps-інженерів, так і серед backend-розробників та системних адміністраторів.
У цій статті розглянемо:
-
архітектуру та принципи роботи Ansible;
-
структуру playbook та ключові компоненти;
-
інвентаризацію, змінні, ролі;
-
приклади корисних playbook для реальних задач;
-
рекомендації щодо best practices;
-
типові помилки та підходи до масштабування.
Матеріал буде корисним як для junior-фахівців, які тільки починають працювати з автоматизацією, так і для middle/senior-інженерів, які хочуть систематизувати знання.
Що таке Ansible та як він працює
Ansible - це open-source інструмент автоматизації, написаний на Python, який працює за моделлю «control node → managed nodes».
Основні компоненти
-
Control Node - машина, з якої виконується управління.
-
Managed Nodes - сервери або пристрої, якими керують.
-
Inventory - список хостів.
-
Playbook - сценарій автоматизації.
-
Module - атомарна операція (наприклад, встановлення пакета).
-
Role - структурований набір задач, змінних і шаблонів.
Agentless-підхід
Ansible не потребує встановлення агентів на керовані сервери. Для Linux-хостів достатньо:
-
SSH-доступу
-
Python (зазвичай вже встановлений)
Для Windows використовується WinRM.
Принцип idempotency
Ansible модулі побудовані так, щоб бути ідемпотентними. Це означає:
-
Повторний запуск playbook не змінює систему, якщо вона вже у бажаному стані.
-
Конфігурація описує кінцевий стан, а не послідовність імперативних дій.
Встановлення та базова конфігурація
Встановлення (Linux)
sudo apt update
sudo apt install ansible
Перевірка версії:
ansible --version
Inventory-файл
Ansible за замовчуванням використовує файл /etc/ansible/hosts, але краще створити окремий inventory у проєкті.
Приклад inventory.ini:
[web]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
[db]
db1 ansible_host=192.168.1.20
[all:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/id_rsa
Перевірка доступності:
ansible all -i inventory.ini -m ping
Структура playbook
Playbook - це YAML-файл, який описує:
-
цільові хости
-
змінні
-
задачі
-
обробники (handlers)
Базовий приклад
---
- name: Install and start Nginx
hosts: web
become: true
tasks:
- name: Install nginx
apt:
name: nginx
state: present
update_cache: true
- name: Ensure nginx is running
service:
name: nginx
state: started
enabled: true
Запуск:
ansible-playbook -i inventory.ini nginx.yml
Модулі Ansible
Ansible має сотні вбудованих модулів:
-
apt / yum - керування пакетами
-
service - управління сервісами
-
copy - копіювання файлів
-
template - рендеринг Jinja2-шаблонів
-
user - створення користувачів
-
file - управління файлами та директоріями
Приклад з template
Файл templates/nginx.conf.j2:
server {
listen 80;
server_name {{ server_name }};
location / {
proxy_pass http://{{ backend_host }}:{{ backend_port }};
}
}
Playbook:
- name: Configure nginx
hosts: web
become: true
vars:
server_name: example.com
backend_host: 127.0.0.1
backend_port: 8080
tasks:
- name: Deploy nginx config
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
Handlers запускаються лише у випадку змін.
Змінні та керування конфігурацією
Ansible підтримує багаторівневу систему змінних:
-
group_vars/
-
host_vars/
-
vars у playbook
-
extra-vars через CLI
Приклад структури
project/
inventory.ini
playbook.yml
group_vars/
web.yml
group_vars/web.yml:
nginx_worker_processes: 4
nginx_worker_connections: 1024
Roles: масштабована структура
Для продакшн-середовищ рекомендується використовувати roles.
Структура:
roles/
nginx/
tasks/
main.yml
handlers/
main.yml
templates/
defaults/
main.yml
Використання:
- hosts: web
become: true
roles:
- nginx
Roles дозволяють:
-
повторно використовувати код
-
розділяти відповідальність
-
створювати Galaxy-пакети
Корисні playbook для практичного використання
1. Розгортання LEMP-стеку
- name: Deploy LEMP stack
hosts: web
become: true
tasks:
- name: Install packages
apt:
name:
- nginx
- mysql-server
- php-fpm
- php-mysql
state: present
update_cache: true
2. Створення користувача з SSH-доступом
- name: Create deploy user
hosts: all
become: true
tasks:
- name: Create user
user:
name: deploy
groups: sudo
shell: /bin/bash
state: present
- name: Add SSH key
authorized_key:
user: deploy
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
3. Автоматичне оновлення системи
- name: Update system packages
hosts: all
become: true
tasks:
- name: Upgrade packages
apt:
upgrade: dist
update_cache: true
Ansible та CI/CD
Ansible часто інтегрується з:
-
GitLab CI
-
GitHub Actions
-
Jenkins
Приклад використання в GitLab CI
deploy:
stage: deploy
script:
- ansible-playbook -i inventory.ini deploy.yml
only:
- main
Типовий сценарій:
-
Merge у main.
-
CI запускає ansible-playbook.
-
Відбувається деплой на production.
Динамічний inventory та хмарні провайдери
Ansible підтримує:
-
AWS
-
GCP
-
Azure
-
Docker
-
Kubernetes
Приклад для AWS:
ansible-inventory -i aws_ec2.yml --graph
Це дозволяє автоматично отримувати список EC2-інстансів без ручного оновлення inventory.
Best Practices
1. Мінімізуйте логіку у playbook
Логіка повинна бути у ролях, не в основному файлі.
2. Використовуйте idempotent-модулі
Не застосовуйте shell/command без необхідності.
3. Використовуйте Ansible Vault
ansible-vault encrypt secrets.yml4. Дотримуйтесь структури проєкту
-
окремий inventory для dev/stage/prod
-
змінні не хардкодити
-
використовувати roles
Типові помилки
-
Використання shell замість модуля.
-
Відсутність become там, де потрібні привілеї.
-
Хардкод IP-адрес.
-
Ігнорування idempotency.
-
Запуск playbook без тестування на staging.
Висновки
Ansible - потужний та гнучкий інструмент автоматизації, який дозволяє:
-
керувати інфраструктурою як кодом;
-
стандартизувати конфігурацію серверів;
-
зменшити кількість ручних операцій;
-
інтегрувати деплой у CI/CD;
-
масштабувати інфраструктуру без втрати керованості.
Його ключові переваги - простота, відсутність агентів, читабельний синтаксис та багата екосистема модулів і ролей. Для невеликих проєктів достатньо базових playbook, але для production-середовищ рекомендовано використовувати ролі, структурувати inventory та впроваджувати контроль доступу через Vault.
Ansible не замінює повністю Terraform або Kubernetes, але чудово доповнює їх у задачах конфігураційного менеджменту та операційної автоматизації.
Грамотно організований Ansible-проєкт перетворює інфраструктуру на керовану, передбачувану та відтворювану систему.