Ansible playbook: что это такое и как устроен

Рейтинг: 52.3% · 11 голосов
Подробный курс по Ansible с прицелом на экзамен RHCE EX294: установка и инвентарь, плейбуки, переменные и факты, Vault, циклы и условия, шаблоны Jinja2, роли и коллекции, Execution Environments и ansible-navigator, управление системами (диски, LVM, cron, SELinux, firewalld). Примеры на RHEL/Fedora. Актуально на 2026.
Ответить
Аватара пользователя
Maksim_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Ansible playbook: что это такое и как устроен

Сообщение Maksim_DevOps »

Оглавление курса (47)
  1. Что такое Ansible и зачем он нужен: автоматизация без агентов
  2. Сертификация RHCE и экзамен EX294: что внутри и как готовиться
  3. Архитектура Ansible: control node, узлы, модули и плагины
  4. Установка Ansible на control node: dnf, pip и версии ansible-core
  5. Подготовка управляемых узлов: SSH, пользователь и sudo
  6. Инвентарь Ansible: hosts, группы и переменные
  7. Настройка Ansible: файл ansible.cfg и приоритеты конфигурации
  8. Host patterns и инструменты командной строки Ansible
  9. Ad hoc команды Ansible: быстрые задачи без плейбука
  10. Ansible playbook: что это такое и как устроен (вы здесь)
  11. Структура плейбука: play, task, модули и переменные
  12. Запуск плейбуков: проверка, теги, ограничения и отладка
  13. Параллелизм и порядок выполнения: forks, serial, strategy
  14. Факты Ansible: сбор информации об узлах
  15. Переменные Ansible: типы, объявление и приоритет
  16. Регистрация результатов и специальные переменные
  17. Ansible Vault: шифрование паролей и секретов
  18. Организация инвентаря: group_vars, host_vars и вложенные группы
  19. Динамический инвентарь и инвентарные плагины
  20. Циклы в Ansible: loop, списки и словари
  21. Повтор задачи до условия: until, retries и delay
  22. Условия в Ansible: директива when и логика
  23. Jinja2 в Ansible: выражения, фильтры и подстановки
  24. Обработчики Ansible: handlers, notify и flush_handlers
  25. Обработка ошибок: failed_when, changed_when и ignore_errors
  26. Блоки в Ansible: block, rescue и always
  27. Управление файлами: модули file, copy, fetch и stat
  28. Архивы и сборка файлов: archive, unarchive, assemble
  29. Точечное редактирование файлов: lineinfile и blockinfile
  30. Шаблоны Jinja2: модуль template и динамические конфиги
  31. Jinja2 продвинуто: фильтры, циклы, макросы и lookup
  32. Модули Ansible: ansible-doc и поиск нужного модуля
  33. Разработка собственного модуля Ansible на Python
  34. Роли Ansible и Ansible Galaxy: переиспользование
  35. Разработка роли Ansible: создание с нуля
  36. Зависимости ролей и requirements.yml
  37. Коллекции Ansible: ansible.posix, community и своя коллекция
  38. Execution Environments: контейнеры для запуска Ansible
  39. Сборка Execution Environment с ansible-builder
  40. ansible-navigator: запуск плейбуков в Execution Environment
  41. Управление SSH-ключами через Ansible: authorized_key
  42. Управление дисками: filesystem, mount и parted
  43. LVM через Ansible: тома, группы и расширение
  44. Планировщик задач: cron и systemd timers через Ansible
  45. Безопасность: hardening SSH и репозитории dnf/yum
  46. SELinux через Ansible: булевы, контексты и порты
  47. Сквозной проект и подготовка к экзамену EX294
В прошлых уроках мы гоняли ad hoc команды: ansible web -m ansible.builtin.dnf -a "name=httpd state=present". Удобно для одного действия. Но представь, что тебе нужно поднять веб-сервер на десяти машинах: поставить пакет, положить конфиг, открыть порт в firewalld, запустить сервис и включить его в автозагрузку. Пять ad hoc команд, которые надо помнить, выполнять в правильном порядке и руками повторять при каждой новой машине. На третьей итерации ты что-нибудь забудешь.

Плейбук решает ровно эту боль. Это файл, в котором ты один раз описываешь желаемое состояние системы, а дальше Ansible сам приводит сервер к нему - хоть один раз, хоть сто раз подряд с тем же результатом. В этом уроке разберём, что такое playbook, из чего он состоит, и напишем первый рабочий ansible playbook yml с нуля.

Что такое playbook и чем он лучше ad hoc

Плейбук ansible - это обычный текстовый YAML-файл, в котором лежит список сценариев (play). Каждый play связывает группу хостов из инвентаря с набором задач (tasks), а каждая задача дёргает один модуль с конкретными параметрами. Запустил файл - Ansible по очереди прошёлся по задачам на всех указанных хостах.

Чем это лучше отдельных команд:
  • Повторяемость. Один и тот же ansible playbook ты гоняешь на dev, stage и prod. Никакой "а что я там вводил в консоли неделю назад".
  • Версионирование. Файл лежит в git. Видно, кто и что менял в инфраструктуре, можно откатиться.
  • Идемпотентность по умолчанию. Прогнал второй раз - модули видят, что всё уже сделано, и ничего не трогают. Статус ok вместо changed.
  • Порядок и логика. Задачи идут сверху вниз, можно навесить условия, циклы, обработчики (handlers).
Ad hoc остаётся для разовых проверок и отладки (ping, рестарт одного сервиса). Всё, что ты собираешься делать больше одного раза, переезжает в плейбук. И да - на экзамене EX294 почти все задания сводятся к "напиши плейбук, который...". Плейбуки это буквально сердце RHCE, поэтому синтаксис надо чувствовать пальцами.

Изображение

Синтаксис YAML: отступы решают всё

Прежде чем писать, договоримся про YAML, потому что 90 процентов первых ошибок новичка - это не Ansible, а кривой отступ. YAML - это формат для данных, и в нём важны три вещи.

Отступы только пробелами. Никаких табов. Вообще. Один таб - и парсер падает с невнятной ошибкой. Настрой редактор так, чтобы Tab вставлял пробелы (обычно 2 пробела на уровень). Вложенность задаётся именно количеством пробелов слева.

Списки. Элемент списка начинается с дефиса и пробела. Вот список из трёх строк:

Код: Выделить всё

packages:
  - httpd
  - mod_ssl
  - firewalld
Словари (ключ: значение). После двоеточия обязателен пробел. name:httpd - ошибка, name: httpd - правильно.

Код: Выделить всё

service:
  name: httpd
  state: started
  enabled: true
Самое коварное - смесь списков и словарей. В плейбуке tasks это список, а каждая задача - словарь. Поэтому задача выглядит как "дефис, потом ключи с отступом под ним". Запомни визуально: дефис задаёт новый элемент, всё что глубже по отступу - принадлежит ему.

Анатомия плейбука и первый ansible playbook example

Теперь сама структура. Файл начинается с трёх дефисов (--- маркер начала YAML-документа, не обязателен, но это хороший тон). Дальше идёт список play. У play есть набор ключей верхнего уровня:
  • name - человекочитаемое описание play. Не обязателен, но всегда пиши, иначе в выводе будет безымянный шум.
  • hosts - на каких хостах или группах из инвентаря работаем. Обязательный ключ.
  • become - повышение привилегий (true значит выполнять через sudo от root). Нужно почти всегда, когда ставишь пакеты или правишь систему.
  • vars - переменные этого play.
  • tasks - список задач, каждая со своим name и вызовом модуля.
Собираем минимальный рабочий ansible playbook example. Задача классическая для RHCE: поставить веб-сервер, положить страницу, открыть порт, запустить и включить сервис. Сохрани как site.yml:

Код: Выделить всё

---
- name: Развернуть базовый веб-сервер
  hosts: web
  become: true
  vars:
    web_package: httpd
    web_service: httpd

  tasks:
    - name: Установить пакет веб-сервера
      ansible.builtin.dnf:
        name: "{{ web_package }}"
        state: present

    - name: Положить стартовую страницу
      ansible.builtin.copy:
        content: "Привет от Ansible\n"
        dest: /var/www/html/index.html
        owner: root
        group: root
        mode: "0644"

    - name: Открыть HTTP в firewalld
      ansible.posix.firewalld:
        service: http
        permanent: true
        immediate: true
        state: enabled

    - name: Запустить и включить сервис
      ansible.builtin.service:
        name: "{{ web_service }}"
        state: started
        enabled: true
Разбери глазами: один play (один дефис на верхнем уровне), внутри четыре задачи (четыре дефиса под tasks). Каждая задача - это name плюс имя модуля по FQCN плюс его параметры с отступом. Параметры в {{ двойных скобках }} - это подстановка переменных из vars. Обрати внимание на mode: "0644" в кавычках - так YAML не превратит ведущий ноль в восьмеричное число.

Запускаем:

Код: Выделить всё

ansible-playbook -i inventory site.yml
Перед боевым прогоном полезно проверить синтаксис без выполнения и прогнать в режиме "что было бы":

Код: Выделить всё

ansible-playbook --syntax-check site.yml
ansible-playbook -i inventory site.yml --check
В выводе ты увидишь PLAY, потом по каждой задаче TASK с пометкой ok (ничего не менялось) или changed (Ansible внёс изменение), и в конце PLAY RECAP со сводкой. Прогони второй раз - все задачи станут ok. Это и есть идемпотентность в действии.

Маленькая пометка про другие дистрибутивы. Здесь всё под RHEL/Fedora: dnf, systemd, firewalld. На Ubuntu/Debian пакет ставился бы через ansible.builtin.apt, а пакет веб-сервера называется apache2, не httpd. В RED OS и Astra Linux менеджер пакетов apt-совместимый или dnf, смотри по дистрибутиву. Универсальный приём - вынести имя пакета в переменную (как у нас web_package) и переопределять её под платформу.

Типичные грабли
  • Таб вместо пробелов. Самая частая. Ошибка вида "found character that cannot start any token" - почти всегда таб или лишний пробел. Включи отображение невидимых символов в редакторе.
  • Нет пробела после двоеточия. state:present не парсится. Всегда state: present.
  • Сломанный отступ у задачи. Если ключ модуля выровнен не так, как другие, YAML либо ругается, либо молча трактует параметр как новую задачу.
  • Забыл become. dnf и правка системных файлов требуют root. Без become: true получишь "Permission denied".
  • Двоеточие внутри значения. Если в строке есть двоеточие (например в тексте сообщения), бери всё значение в кавычки, иначе YAML посчитает это словарём.
  • Короткие имена модулей. copy вместо ansible.builtin.copy работает, но на экзамене и в команде лучше писать FQCN - меньше конфликтов и понятнее, откуда модуль.
Мини-лаба

Руками, без копипасты целиком - так синтаксис ложится в память:
  • Создай инвентарь inventory с группой web и одним-двумя хостами.
  • Напиши site.yml из этого урока заново, своими руками, следя за отступами.
  • Прогони ansible-playbook --syntax-check site.yml. Намеренно убери один пробел после двоеточия и посмотри, как именно ругается парсер - полезно узнать ошибку в лицо.
  • Запусти плейбук, затем сразу повтори. Убедись, что во второй раз все задачи ok (changed=0 в PLAY RECAP).
  • Поменяй текст стартовой страницы в content и прогони ещё раз - теперь changed будет только у задачи с copy.
Контрольные вопросы
  • Из каких обязательных ключей состоит минимальный play и за что отвечает hosts?
  • Почему в YAML нельзя использовать табы и чем грозит отсутствие пробела после двоеточия?
  • Что покажет PLAY RECAP при повторном запуске идемпотентного плейбука и почему?
  • Зачем нужен become: true и что произойдёт без него в задаче с dnf?
Итог

Плейбук - это YAML-файл с одним или несколькими play, где play связывает хосты с задачами, а задача вызывает модуль. Ты описываешь желаемое состояние, а не последовательность команд, и получаешь повторяемость, версионирование и идемпотентность даром. Ключевые навыки на старте - чистый YAML с правильными отступами и понимание анатомии play (name, hosts, become, vars, tasks). Дальше будут переменные, циклы, условия и обработчики, но фундамент именно здесь. И помни: на EX294 плейбуки пишут руками под таймером, так что доводи синтаксис до автоматизма уже сейчас.
👍3 ❤️2 🔥 😄 🤔
Аватара пользователя
slow9fox
Сообщения: 1
Зарегистрирован: 13 май 2026, 01:23

Re: Ansible playbook: что это такое и как устроен

Сообщение slow9fox »

Спасибо, наконец дошло про дефисы и отступы. Я неделю ловил found character that cannot start any token - реально был таб от автокомплита редактора. Поставил пробелы и всё завелось.
👍 ❤️ 🔥1 😄 🤔
Аватара пользователя
assassass
Сообщения: 1
Зарегистрирован: 11 май 2026, 18:20

Re: Ansible playbook: что это такое и как устроен

Сообщение assassass »

Вопрос: а mode писать в кавычках обязательно? У меня без кавычек 0644 проходило вроде нормально. Или это именно из-за ведущего нуля чтобы YAML не считал его числом?
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Ad hoc команды Ansible: быстрые задачи без плейбука
Следующая глава →
Структура плейбука: play, task, модули и переменные

Все главы курса «Ansible: автоматизация и подготовка к RHCE (EX294)»

Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое ansible простыми словамиansible для начинающих с чего начатьустановка ansible на linuxansible inventory и hosts файлчто такое playbook в ansibleструктура ansible playbook из чего состоит

Вернуться в «Ansible: автоматизация и подготовка к RHCE (EX294)»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость