Ответ
Playbook в Ansible — это YAML-файл, описывающий желаемое состояние инфраструктуры. Он состоит из одного или нескольких plays (плейов), каждый из которых содержит следующие ключевые элементы:
hosts: Определяет целевую группу хостов или шаблон из инвентарного файла, к которому применяется плей. Например:webservers,db_servers:&europe, илиall.vars/vars_files: Раздел для объявления переменных, специфичных для данного плейбука. Позволяет параметризировать конфигурацию.tasks: Сердце плейбука. Список действий (задач), которые будут выполнены последовательно на целевых хостах. Каждая задача вызывает модуль Ansible (например,apt,copy,template,service).- Каждая задача должна иметь уникальное имя (
name), которое выводится при выполнении.
- Каждая задача должна иметь уникальное имя (
handlers: Специальные задачи, которые выполняются только один раз в конце плейбука, и только если были уведомлены (notify) одной из обычных задач. Используются для перезапуска служб после изменения конфигурации.roles(на уровне плейбука): Позволяют импортировать переиспользуемые роли, которые инкапсулируют задачи, шаблоны, файлы и переменные для организации сложной конфигурации.become: Директива для повышения привилегий (например,become: yesдля выполнения задач от root через sudo).
Пример практического плейбука для развёртывания веб-сервера Nginx:
---
- name: Configure and deploy Nginx on web servers
hosts: webservers # Целевая группа из инвентаря
vars:
http_port: 8080
server_name: "{{ inventory_hostname }}"
become: yes # Выполнять задачи с правами root
tasks:
- name: Ensure Nginx package is installed
apt:
name: nginx
state: latest
update_cache: yes
- name: Deploy custom Nginx configuration template
template:
src: templates/nginx.conf.j2 # Jinja2 шаблон
dest: /etc/nginx/sites-available/default
owner: root
group: root
mode: '0644'
notify: # Уведомление хендлера
- Reload Nginx service
- name: Ensure Nginx is enabled and started
service:
name: nginx
state: started
enabled: yes
handlers:
- name: Reload Nginx service
service:
name: nginx
state: reloaded # Graceful reload для применения конфига без разрыва соединений
Почему такая структура эффективна для DevOps:
- Идемпотентность: Модули Ansible гарантируют, что повторный запуск плейбука приведёт систему в то же состояние, не вызывая ошибок.
- Декларативность: Описывается желаемое состояние ("пакет должен быть установлен", "сервис должен работать"), а не последовательность команд.
- Масштабируемость: Один плейбук применяется ко всей группе хостов
webservers. - Интеграция: Переменные (
vars) и шаблоны Jinja2 (template) позволяют гибко адаптировать конфигурацию под разные окружения (dev, staging, prod).