Ответ
Playbook в Ansible — это YAML-файл, который описывает желаемое состояние инфраструктуры через последовательность плейов (plays) и задач (tasks). Это основной инструмент для декларативной автоматизации конфигурации.
Ключевые элементы структуры playbook:
-
Play: Определяет, на каких хостах (из инвентаря) и под каким пользователем выполнять задачи. Playbook может содержать несколько плейов.
hosts:Целевая группа хостов (например,webservers,dbservers,all).become:Активирует повышение привилегий (например,become: yesдля выполнения задач от root).vars:Определение переменных, специфичных для этого плейа.tasks:Список задач для выполнения.
-
Task: Конкретное действие, которое Ansible должен выполнить на целевых хостах. Использует модули (встроенные команды).
- Каждая задача имеет
name:(человекочитаемое описание) и вызывает модуль с его параметрами.
- Каждая задача имеет
-
Handler: Специальный тип задачи, который вызывается только по уведомлению (
notify) из других задач. Обычно используется для перезапуска служб после изменения их конфигурации. -
Roles (Роли): Для переиспользования и организации кода. Роль — это автономная структура каталогов, содержащая tasks, handlers, vars, templates и файлы. В playbook роли включаются директивой
roles:.
Пример базового playbook для настройки веб-сервера Nginx:
---
# playbook.yml
- name: Configure and deploy Nginx on web servers
hosts: webservers # Группа из инвентарного файла
become: yes # Выполнять задачи с правами sudo
vars:
http_port: 8080
max_clients: 200
tasks:
# 1. Установка пакета
- name: Ensure Nginx is installed
apt:
name: nginx
state: latest
update_cache: yes
# 2. Копирование шаблона конфигурации
- name: Copy Nginx configuration template
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: # Уведомление хендлера
- Restart Nginx
# 3. Проверка синтаксиса конфигурации
- name: Validate Nginx configuration
command: nginx -t
register: nginx_test
changed_when: false # Задача никогда не считается 'изменившей' состояние
failed_when: nginx_test.rc != 0
handlers:
# Хендлер, который выполнится только если его уведомили и были изменения
- name: Restart Nginx
service:
name: nginx
state: restarted
Такой подход позволяет чётко разделять логику (tasks), конфигурацию (vars, templates) и побочные действия (handlers), делая playbook читаемым и поддерживаемым.
Ответ 18+ 🔞
А, ну так вот, слушай, про эти плейбуки в Ansible. Представь себе, что это такой офигенный план захвата, только для серверов, а не для крепости. Вместо «взять мост» и «захватить арсенал» тут «поставить nginx» и «перезапустить службу». И всё это записано в обычном YAML-файле, который читается, как книжка, если, конечно, не охуеть от скуки.
Основные кирпичики, из которых это всё собрано:
-
Плей (Play): Это как объявление: «А сейчас, сука, мы будем нагибать вот эту конкретную группу серверов». В нём указывается, кого бить и от чьего имени.
hosts:— вот эти несчастные (например,webserversили простоall, чтобы всем влетело).become:— волшебная палочка, чтобы стать рутом. Без неё нихуя не выйдет, система тебя просто пошлёт.vars:— местные переменные, типа порта или какого-нибудь лимита. Удобно, не надо каждый раз в коде ковыряться.tasks:— а вот тут и начинается самое интересное, список дел на сегодня.
-
Задача (Task): Конкретный приказ, одно действие. «Установить пакет», «скопировать файл», «запустить скрипт». Всё через готовые модули — не надо изобретать велосипед, бери и пользуйся.
- У каждой задачи есть
name:, чтобы потом не охуевать, глядя в логи и спрашивая «а это что, блядь, делало?».
- У каждой задачи есть
-
Хендлер (Handler): Это такая хитрая жопа. Задача-невидимка. Она сидит и ждёт, пока её не позовут по имени через
notify. Обычно это перезапуск службы, который должен сработать только если конфиг реально поменялся. Умно, да? Не дёргай попу без дела. -
Роли (Roles): Ну тут уже полный ёперный театр организации. Когда твой плейбук разбухает, как питон, съевший кролика, самое время нарезать его на роли. Это такая отдельная папочка со своими задачами, шаблонами и переменными. Подключаешь одной строчкой и чувствуешь себя архитектором, а не обезьяной с гранатой.
Вот смотри, простой пример, как навесить nginx на сервера:
---
# playbook.yml
- name: Configure and deploy Nginx on web servers
hosts: webservers # Целимся в группу 'webservers'
become: yes # Превращаемся в root, иначе нихуя
vars:
http_port: 8080
max_clients: 200
tasks:
# 1. Ставим софт
- name: Ensure Nginx is installed
apt:
name: nginx
state: latest
update_cache: yes
# 2. Толкаем наш конфиг через шаблон
- name: Copy Nginx configuration template
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: # Кричим хендлеру: «Эй, проснись!»
- Restart Nginx
# 3. Проверяем, не сломали ли мы всё к хуям
- name: Validate Nginx configuration
command: nginx -t
register: nginx_test
changed_when: false # Говорим Ансиблу: «Не дергайся, это просто проверка»
failed_when: nginx_test.rc != 0 # А вот если проверка не прошла — тогда всё, пиздец
handlers:
# А вот и наш сонный хендлер. Сработает, только если его позвали.
- name: Restart Nginx
service:
name: nginx
state: restarted
Вот такой, блядь, подход. Всё по полочкам: логика отдельно, настройки отдельно, а перезагрузки — только когда надо. Получается читаемо и, что главное, не превращается в пиздопроебибну через полгода, когда нужно что-то поменять.