Ответ
Работа с Ansible следует четкому потоку, который я выстраиваю в каждом проекте:
- Определение инвентаря (Inventory). Я описываю целевые хосты, группируя их по ролям (например,
[webservers],[databases]). Инвентарь может быть статическим YAML-файлом или динамическим, генерируемым скриптом (например, получающим список серверов из облачного провайдера). - Создание плейбуков (Playbooks). Это YAML-файлы — "сценарии" автоматизации. В плейбуке я определяю:
- На каких хостах (
hosts: webservers) выполнять задачи. - Какие переменные (
vars) использовать. - Последовательность задач (Tasks) — атомарных операций (модулей Ansible) вроде
apt,copy,template.
- На каких хостах (
- Использование шаблонов конфигурации (Templates). Я пишу конфиги (например, для Nginx или systemd) как шаблоны Jinja2 (
.j2), в которые Ansible подставляет переменные из инвентаря или плейбука. - Организация кода в роли (Roles). Для переиспользования логику группирую в роли (например, роль
nginx). Роль имеет стандартную структуру:tasks/,handlers/,templates/,vars/. Это делает код модульным и чистым. - Запуск и выполнение (Execution). Запускаю плейбук командой
ansible-playbook. Ansible по SSH подключается к хостам (используя указанные в инвентаре данные), выполняет задачи и собирает результаты.
Пример минимального, но полного плейбука для развертывания веб-сервера:
# site.yml
- name: Configure web servers
hosts: webservers # Этап 1: Группа из инвентаря
become: yes # Выполнять задачи с правами sudo
vars: # Этап 2: Переменные
http_port: 80
max_clients: 200
tasks: # Этап 2: Задачи
- name: Ensure Nginx is installed
apt:
name: nginx
state: latest
update_cache: yes
- name: Deploy Nginx configuration
template: # Этап 3: Шаблон
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: # Триггер для обработчика
- Restart Nginx
handlers: # Обработчики (задачи по триггеру)
- name: Restart Nginx
service:
name: nginx
state: restarted
Для сложных проектов задачи и обработчики из этого плейбука я бы вынес в отдельную роль (Этап 4).