Playbook
Официальная документация Ansible Playbooks
Описание
YAML-файл, в котором описывается жедаемое состояние серверов и последовательность действий Ansible
Пример playbook
- hosts: all # указываем перечень узлов на которых требуется применить playbook
become: yes # для задач использовать повышение привилегий, обычно через sudo
tasks: # в данном блоке указывается перечень задач которые требуется выполнить
- name: Install nginx app servers # название задачи
ansible.builtin.apt: # модуль ansible который работает с `apt`
name: nginx # назввание утилиты для установки
state: present # что требуется сделать, в данном случае поставить nginx если его не было раньше
- name: Make sure a service unit is running
ansible.builtin.systemd_service: # модуль для работы с systemd
state: started # указываем что nginx должен работать
enabled: true # nginx должен запускаться автоматически после ребута сервера
name: nginx # название утилиты
notify: Reload nginx # ключевое слово которое вызывает определенный handlers
handlers: # отдельные задачи, которые запускаются только если они были вызваны через `notify`
- name: Reload nginx
ansible.builtin.systemd_service:
state: reloaded # требуем перезапуск
name: nginx # название утилиты
Playbook может содержать несколько play
play отвечает на вопрос: на каких серверах применять, а task уже конкретное действие.
Для запуска playbook используется команда
become
Если пользователь SSH не root, а задаче нужны root права, используется
graph TD
A[ansible controller node]
--> B[SSH под уз devops]
B --> C[sudo root]
Если sudo требует пароль:
После потребуется ввод пароляПеременные
Вместо жестко заданных занчений:
Можно использовать переменную:
Переменная вызывается через Jinja-синтаксис:
default роли
Для роли можно задать значения по умолчанию
например:
задача:
Логика:
graph TD
A[defaults/main.yml]
--> B[данные]
B --> C[tasks/main.yml]
C --> D[логика]
group_vars
Переменные можно назначать inventory-группе
Например:
Тогда эту переменную получают узлы входящие в группу [app]
Templates и Jinja2
Вместо одинакового статического файла можно использовать шаблон
Например:
index.html.j2
<h1>DevOps Lab</h1>
<p>Server: {{ inventory_hostname }}</p>
<p>OS: {{ ansible_distribution }}</p>
Разволачивается через:
- name: Deploy index page
ansible.builtin.template:
src: index.html.j2
dest: /var/www/html/index.html
Один шаблон на разных хостах может дать разные результаты.
Handlers
Описание
Блок с задачами, которые выполняются только если они были вызваны через notify
Они позволяют выполнять действия, которые должны быть выполнены только при изменении состояния.
Пример
- Ansible выполняет задачи по порядку
- Если задача успешно завершается и у нее есть
notify, Ansible запускает указанныйhandler handlerвыполняется только один раз, даже если он вызывается несколько раз.
- Это позволяет оптимизировать выполнение задач, так как
handlersне запускается, если не требуется - Используется часто для перезапуска служб, обновления конфигураций и других действий, которые должны быть выполнены только при изменении состояния
Таким образом notify и handlers помогают сделать ansbile более эффективным и управляемым
Roles
Когда playbook становится большим, задачи разбиваются по ролям.
Например:
Структура роли:
roles/nginx/
|- tasks/
|- main.yml
|- handlers/
|- main.yml
|- templates/
|- files/
|- defaults/
|- main.yml
|- vars/
|- main.yml
Ansible знает эти имена каталогов автоматически, поэтому достаточно в playbook:
И ansible сам ищет:loop
Если нужно повторить одну задачу несколько раз:
- name: Create directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: devops
group: devops
mode: '0755'
loop:
- /opt/devops-lab
- /opt/devops-lab/config
- /opt/devops-lab/logs
На каждой итерации:
получает следующее значение.
when
позволяет выполнять задачу только при определенном условии
Например
- name: Install PostgreSQL client
ansible.builtin.apt:
name: postgresql-client
state: present
when: "'app' in group_names"
На серверах группы [app] задача выполнится, на остальных будет skipped
changed_when
Позволяет определить, изменилась ли задача, даже если стандартный проверочный тест (check_mode) не обнаружил изменений. Она особенно полезна в сложных сценариях, где стандартные проверки не улавливают изменения.
Например:
ansible может показать changed
Поэтому явно указываем:
- name: Check filesystem
ansible.builtin.command:
cmd: df -h /
register: disk_info
changed_when: false
Эта задача читает только состояние системы и не должна быть changed
group_names
встроенная переменная, содержащая inventory-группы текущего хоста
например для app01
поэтому можно написать:
register
результат задачи можно сохранить в переменную
теперь появляется объект disk_info у которого могут быть поля:
disk_info.rc
disk_info.stdout
disk_info.stderr
disk_info.stdout_lines
- name: Show disk usage
ansible.builtin.debug:
var: disk_info.stdout
Полезные команды
ansible-playbook site.yml --syntax-check
# проверка playbook на синтаксические ошибки
ansible-playbook --check site.yml --list-tasks
# выводит перечень tasks которые содержатся в playbook
ansible-playbook --check site.yml --list-tasks
# выводит перечень hosts которые разделены по tasks в playbook
Последняя проверка 18.09.2026