Вот ровно эту боль и решают 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
- Объединение (union) - двоеточие : или запятая ,. Это логическое ИЛИ. Шаблон webservers:dbservers - все хосты, которые в webservers ИЛИ в dbservers.
- Пересечение (intersection) - :&. Логическое И. Шаблон webservers:&production - только те, кто одновременно и в webservers, и в production.
- Исключение (exclusion) - :!. Вычесть из выборки. Шаблон webservers:!staging - все веб-серверы, кроме тех, что в staging.
Код: Выделить всё
ansible 'webservers:&production:!staging' -m ping

Маски и регулярки в шаблонах
Кроме групп паттерны умеют в маски по именам. Звёздочка * подставляется как glob:
Код: Выделить всё
ansible 'web*.example.com' -m ping
ansible '*.dev.local' -m ping
Если нужна настоящая мощь - есть регулярные выражения. Паттерн, начинающийся с тильды ~, трактуется как регэксп:
Код: Выделить всё
ansible '~(web|db).*\.example\.com' -m ping
Обзор 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
Код: Выделить всё
ansible-doc ansible.builtin.copy
ansible-doc -l | grep firewall
Опции -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
Теперь главное про экзамен. Ключ --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
Типичные грабли
- Шелл съел спецсимволы. Паттерны с &, ! и * всегда бери в одинарные кавычки. Без них 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 - найди параметр для открытия порта, не открывая браузер.
Контрольные вопросы
- В каком порядке 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 это один из самых ходовых инструментов, и именно на нём проще всего ошибиться.