Введение
Автоматизация безопасна лишь тогда, когда затрагивает нужные хосты. Два псевдонима одной машины, отсутствующий хост или слишком широкий выбор могут сделать успешную команду обманчивой.
В этой лабораторной работе вы распределите два отдельных целевых узла SSH по группам canary и stable, изучите родительскую группу, предварительно проверите шаблоны хостов и создадите маркер только на canary. Ansible и учебные соединения уже подготовлены; вы будете работать с инвентарём и областью действия команд.
Организуйте хосты в группы
На этом шаге вы сгруппируете два существующих хоста SSH без дублирования их идентификаторов и адресов.
Откройте терминал и перейдите в проект:
cd /home/labex/project
Прочитайте предоставленный инвентарь перед редактированием:
cat inventory.ini
Он определяет web1 и web2 с разными значениями ansible_host. Сохраните эти строки и параметры соединения [all:vars]. Имена инвентаря обозначают хосты; размещение одного имени в нескольких группах не создаёт ещё один сервер.
Группа описывает набор хостов. Мы будем использовать canary для первого хоста, stable для второго и webservers как родительскую группу, содержащую обе группы. Добавьте эти секции. >> сохраняет существующий файл, а маркер here-document в кавычках сохраняет вставляемый текст буквально:
cat >> inventory.ini <<'EOF'
[canary]
web1
[stable]
web2
[webservers:children]
canary
stable
EOF
[canary] и [stable] содержат имена хостов. Секция, заканчивающаяся на :children, содержит имена групп, поэтому webservers наследует хосты, входящие в canary и stable. Не указывайте новые адреса назначения в этих группах.
ansible-inventory --graph отображает итоговое членство:
ansible-inventory --graph
Ожидайте web1 в canary и web2 в stable, а обе группы — внутри webservers. Также могут появиться специальные элементы all и ungrouped. Хост может отображаться в нескольких ветвях графа, оставаясь одним хостом инвентаря.
Шаблон хостов выбирает целевые узлы команды. Предварительно просмотрите родительскую группу без выполнения модуля:
ansible webservers --list-hosts
Ожидайте ровно web1 и web2. В шаблоне :& означает пересечение: выбрать хосты, принадлежащие обеим частям. Заключите его в кавычки, чтобы оболочка не интерпретировала &:
ansible 'webservers:&canary' --list-hosts
Ожидайте только web1. Этот предварительный просмотр позволяет обнаружить ошибку выбора до изменения любого хоста.
Ограничьте изменение группой canary
На этом шаге вы внесёте небольшое изменение на canary, сохранив хост stable и управляющий узел без изменений.
Первый шаблон команды выбирает исходный набор. --limit дополнительно сужает его; он не добавляет хосты за пределами этого набора. Предварительно просмотрите ограниченный выбор перед использованием:
ansible webservers --limit canary --list-hosts
Ожидайте один хост — web1. Ограничение, не выбравшее ничего, не подтверждало бы успешное изменение, даже если команда завершается без сбоя модуля.
Используйте модуль command из предыдущей лабораторной работы для запуска touch. Эта команда Linux создаёт пустой файл, если он не существует, и обновляет его временную метку, если существует. Маркер должен находиться в домашнем каталоге управляемого пользователя automation. Значение -a в кавычках сохраняет исполняемый файл и путь вместе:
ansible webservers --limit canary -m ansible.builtin.command -a 'touch /home/automation/canary-ready'
Ожидайте успешного результата команды только для web1. Это действие намеренно служит простым упражнением на область действия; touch может обновлять временные метки при повторных запусках, поэтому его статус CHANGED не демонстрирует идемпотентность.
Изучите видимые файлы в домашнем каталоге каждого управляемого пользователя. ls выводит каталог на каждом целевом узле, поскольку выполняется модулем command Ansible:
ansible webservers -m ansible.builtin.command -a 'ls /home/automation'
Результат web1 должен содержать canary-ready. Результат web2 не должен содержать это имя; его stdout может быть пустым. Это удалённые каталоги, отдельные от вашего рабочего каталога на управляющем узле.
Наконец, изучите текущий каталог управляющего узла:
ls
Он должен показывать конфигурацию и инвентарь проекта без локального маркера canary-ready. Вы выбрали настоящий управляемый хост, а не изменили управляющий узел. В следующих лабораторных работах будут использоваться модули, непосредственно объявляющие состояние файлов, с последующей проверкой идемпотентности.
Резюме
Вы сохранили два отдельных идентификатора инвентаря, организовали хосты и дочерние группы, предварительно проверили шаблон пересечения в кавычках и сузили область действия команды через --limit. Фактическое состояние целевых узлов показало маркер только на canary, тогда как хост stable и управляющий узел остались вне изменения.


