Host patterns и инструменты командной строки Ansible

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

Host patterns и инструменты командной строки Ansible

Сообщение 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
Представь ситуацию. Среди ночи прилетает CVE, надо срочно накатить патч, но только на боевые веб-серверы. На staging трогать нельзя - там как раз гоняют релиз. В инвентаре сотня хостов, раскиданных по десятку групп. Руками выбирать нужные машины - верный способ зацепить лишнее и положить то, что трогать запрещено.

Вот ровно эту боль и решают host patterns - язык выбора хостов в Ansible. Ты описываешь, кого хочешь зацепить, через пересечения и исключения групп, а Ansible сам разворачивает это в конкретный список машин. Плюс к этому идёт целый набор CLI-утилит, и каждая заточена под свою задачу. Разберёмся, как это работает на практике, и где на экзамене RHCE по этому добру срезаются.

Что такое ansible host pattern и как он считается

Host pattern (он же шаблон выбора хостов) - это первый позиционный аргумент команды ansible и поле hosts: в плее плейбука. Он отвечает на вопрос "на каких машинах выполнять".

Самый простой паттерн - all (или его синоним *). Это вообще все хосты из инвентаря. Дальше идут имена групп и имена отдельных хостов:

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

ansible all -m ping
ansible webservers -m ping
ansible web1.example.com -m ping
Интересное начинается, когда нужно скомбинировать несколько групп. Тут работают три оператора, и важно понимать порядок, в котором Ansible их обрабатывает: сначала объединения, потом пересечения, потом исключения.
  • Объединение (union) - двоеточие : или запятая ,. Это логическое ИЛИ. Шаблон webservers:dbservers - все хосты, которые в webservers ИЛИ в dbservers.
  • Пересечение (intersection) - :&. Логическое И. Шаблон webservers:&production - только те, кто одновременно и в webservers, и в production.
  • Исключение (exclusion) - :!. Вычесть из выборки. Шаблон webservers:!staging - все веб-серверы, кроме тех, что в staging.
Эти штуки чейнятся в одну строку. Вспомним сценарий из начала урока - патчим боевые веб-серверы, не трогая staging:

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

ansible 'webservers:&production:!staging' -m ping
Читается слева направо: берём webservers, пересекаем с production (остаются только боевые веб-серверы), затем вычитаем staging. Кавычки тут не для красоты - символы & и ! спецсимволы в bash, без одинарных кавычек шелл их сожрёт или подставит историю команд. Это классические грабли, о них ещё поговорим.

Изображение

Маски и регулярки в шаблонах

Кроме групп паттерны умеют в маски по именам. Звёздочка * подставляется как glob:

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

ansible 'web*.example.com' -m ping
ansible '*.dev.local' -m ping
Первый зацепит web1.example.com, web2.example.com и так далее. Удобно, когда хосты названы по схеме, но в группы их разложить лень или некогда.

Если нужна настоящая мощь - есть регулярные выражения. Паттерн, начинающийся с тильды ~, трактуется как регэксп:

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

ansible '~(web|db).*\.example\.com' -m ping
На практике регэкспы в host pattern нужны редко, нормально структурированный инвентарь решает почти всё через группы. Но знать про тильду стоит - иногда это единственный способ выцепить хосты с хитрым неймингом.

Обзор ansible cli - какие команды и когда

Многие думают, что Ansible - это ansible и ansible-playbook, и всё. На деле инструментов сильно больше, и понимание, какая команда под что заточена, экономит кучу времени. Вот основные ansible команды, которые должны быть в пальцах:
  • ansible - запуск ad hoc, то есть разовых задач одной командой без плейбука. Проверить связь, перезапустить сервис, глянуть факты. Не для прода, для быстрых ручных действий.
  • ansible-playbook - основной рабочий инструмент. Запускает плейбуки - YAML-сценарии с задачами. Всё, что хоть немного сложнее одной команды, живёт тут.
  • ansible-inventory - показывает, как Ansible видит твой инвентарь. Незаменим для отладки групп и переменных.
  • ansible-config - смотрит и объясняет настройки. ansible-config dump --only-changed покажет, что ты переопределил относительно дефолтов.
  • ansible-doc - встроенная документация по модулям прямо в терминале. На экзамене интернета нет, так что это твой главный справочник.
  • ansible-galaxy - менеджер ролей и коллекций. Ставит контент из Galaxy и приватных хабов, создаёт скелет роли.
  • ansible-vault - шифрование секретов: паролей, ключей, чувствительных переменных.
  • ansible-navigator - современный TUI-запускатор плейбуков через execution environment (контейнер с Ansible и зависимостями). Именно его проверяют на актуальной версии RHCE.
Покажу пару команд, которые реально полезны каждый день. Посмотреть дерево групп инвентаря:

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

ansible-inventory -i inventory --graph
Это выведет структуру вида all -> группы -> хосты. Сразу видно, кто куда попал. А вот как достать справку по нужному параметру модуля, не вставая из терминала:

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

ansible-doc ansible.builtin.copy
ansible-doc -l | grep firewall
Второй вариант покажет все модули, в имени или описании которых встречается firewall - так ты найдёшь ansible.posix.firewalld, если забыл точное имя. На EX294 знание ansible-doc буквально решает: забыл параметр - не паникуешь, а смотришь.

Опции -m, -a, -i и ansible limit

Для ad hoc и для тонкого выбора хостов есть набор ключей, которые надо знать наизусть.

-m задаёт модуль, -a - его аргументы, -i - путь к инвентарю. Классический ad hoc выглядит так:

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

ansible webservers -i inventory -m ansible.builtin.dnf -a "name=httpd state=latest" -b
Здесь -b (become) - выполнить с повышением привилегий, через sudo. Без него dnf не отработает. Кстати, на Debian и Ubuntu модуль был бы ansible.builtin.apt, а в RED OS и Astra Linux работает тот же dnf или apt в зависимости от базы дистрибутива - механика Ansible от этого не меняется, меняется только модуль пакетного менеджера.

Теперь главное про экзамен. Ключ --limit (ansible limit) сужает уже заданный в плейбуке набор хостов, не трогая сам плейбук. Допустим, в плейбуке стоит hosts: all, а накатить надо только на один сервер для проверки:

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

ansible-playbook site.yml --limit web1.example.com
ansible-playbook site.yml --limit 'webservers:!web2.example.com'
ansible-playbook site.yml --limit @retry_hosts.txt
Разница между host pattern в самом плейбуке и --limit принципиальная: паттерн в hosts: определяет потолок - максимально возможный набор. А --limit может только сужать этот набор, расширить его он не способен. Если в плее hosts: webservers, то --limit dbservers не запустит ничего - пересечение пустое. Понимание этой механики прямо проверяется на EX294, и на ней регулярно срезаются: люди ждут, что --limit добавит хостов, а он только вычитает.

Типичные грабли
  • Шелл съел спецсимволы. Паттерны с &, ! и * всегда бери в одинарные кавычки. Без них bash интерпретирует символы по-своему, и ты получишь либо ошибку, либо запуск не на тех хостах. Самая частая и самая обидная ошибка.
  • Перепутан порядок операторов. Ansible считает union, потом intersection, потом exclusion - независимо от того, как ты их написал. Не пытайся скобками менять приоритет, скобок в host pattern нет.
  • --limit вместо правки плейбука. Пытаешься через --limit запустить на хостах, которых нет в hosts:. Не выйдет. --limit только сужает.
  • Забыл -i. Если инвентарь не дефолтный, без -i Ansible возьмёт /etc/ansible/hosts или вообще ничего и честно скажет, что хостов не нашёл. Проверяй, какой инвентарь подхватился, через ansible-inventory --graph.
  • Регэксп без тильды. Паттерн с регуляркой обязан начинаться с ~, иначе строка трактуется как буквальное имя хоста.
Мини-лаба

Собери инвентарь с группами webservers, dbservers, production, staging (часть хостов положи сразу в две группы - например, в webservers и в production). Затем руками прогони и сравни вывод:
  • ansible-inventory -i inventory --graph - убедись, что хосты попали в нужные группы.
  • ansible 'webservers:dbservers' -i inventory --list-hosts - объединение.
  • ansible 'webservers:&production' -i inventory --list-hosts - пересечение.
  • ansible 'all:!staging' -i inventory --list-hosts - исключение.
  • Напиши плейбук с hosts: all и запусти его с --limit 'webservers:!staging', добавив --check, чтобы ничего не сломать.
  • ansible-doc ansible.posix.firewalld - найди параметр для открытия порта, не открывая браузер.
Ключ --list-hosts показывает, кого Ansible выбрал бы, ничего при этом не выполняя - идеально для отработки паттернов.

Контрольные вопросы
  • В каком порядке Ansible обрабатывает операторы :, :& и :! в одном паттерне?
  • Чем --limit отличается от паттерна в поле hosts: плейбука, и может ли --limit расширить набор хостов?
  • Почему паттерн webservers:&production в bash нужно брать в одинарные кавычки?
  • Какой командой посмотреть документацию по модулю прямо в терминале, и почему это важно на экзамене?
Итог

Host patterns - это твой скальпель для выбора хостов: union через :, intersection через :&, exclusion через :!, плюс маски и регэкспы с тильдой. Порядок обработки фиксирован, спецсимволы прячь в кавычки. CLI Ansible - не одна команда, а набор: ansible для разовых задач, ansible-playbook для сценариев, ansible-doc как офлайн-справочник, ansible-navigator для запуска через execution environment на актуальном RHCE. И держи в пальцах --limit - на EX294 это один из самых ходовых инструментов, и именно на нём проще всего ошибиться.
👍1 ❤️2 🔥4 😄 🤔2
Аватара пользователя
cigar7
Сообщения: 1
Зарегистрирован: 19 май 2026, 05:32

Re: Host patterns и инструменты командной строки Ansible

Сообщение cigar7 »

Спасибо, наконец дошло про --limit. Думал он добавляет хосты, а он только урезает то что в hosts: уже есть. На прошлой тренировке EX294 как раз на этом и завис.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
bash2025
Сообщения: 1
Зарегистрирован: 14 май 2026, 11:49

Re: Host patterns и инструменты командной строки Ansible

Сообщение bash2025 »

А кавычки реально критичны. Запустил ansible webservers:!staging без них в zsh и получил event not found из-за восклицательного знака. Час тупил пока не понял что это шелл, а не ansible.
👍3 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Настройка Ansible: файл ansible.cfg и приоритеты конфигурации
Следующая глава →
Ad hoc команды Ansible: быстрые задачи без плейбука

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

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

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

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

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