Inventory и ad-hoc команды
Inventory в ini и yaml, группы хостов, ad-hoc через -m, модули ping/command/shell/copy.
Inventory: список хостов
Прежде чем Ansible что-то сделает, ему надо знать, на каких хостах работать. Это и есть inventory — файл со списком хостов и их параметрами.
Дефолтный путь /etc/ansible/hosts, но в реальных проектах почти
всегда задают свой через флаг -i.
Формат ini
Самый распространённый и простой вариант.
# inventory.ini
[web]
web-1.example.com
web-2.example.com ansible_user=deploy
[db]
db-1.example.com ansible_host=10.0.0.10 ansible_port=2222
[web:vars]
ansible_user=ubuntu
Что тут происходит:
[web]и[db]: группы хостов.ansible_host: реальный IP или hostname (если DNS не совпадает с именем хоста в инвентаре).ansible_user: под каким пользователем подключаться по SSH.ansible_port: если SSH не на 22.[web:vars]: переменные для всей группы.
Тот же инвентарь в yaml
# inventory.yml
all:
children:
web:
vars:
ansible_user: ubuntu
hosts:
web-1.example.com: {}
web-2.example.com:
ansible_user: deploy
db:
hosts:
db-1.example.com:
ansible_host: 10.0.0.10
ansible_port: 2222
Yaml-формат удобен, когда инвентарь генерируется программно или сложен по структуре. Ini проще читать вручную.
Специальные группы
Ansible всегда добавляет две группы автоматически:
| Группа | Что включает |
|---|---|
all | абсолютно все хосты из инвентаря |
ungrouped | хосты, не попавшие ни в одну явную группу |
Паттерн all в команде — это именно эта спец-группа.
Ad-hoc команды
Ad-hoc — одноразовое действие без playbook. Удобно для проверки связи, быстрого выполнения команды на парке машин, одноразовых задач.
Синтаксис:
ansible <pattern> -i inventory.ini -m <module> -a "<args>"
Паттерны:
all: все хостыweb: группа webweb-1.example.com: конкретный хостweb,db: несколько группall:!db: все, кроме группы db
Всё в Ansible делается через модули
Ansible не запускает произвольные команды напрямую. Он вызывает модули — небольшие Python-скрипты с чётким интерфейсом. Каждый модуль умеет одно дело и знает, идемпотентно ли его выполнение.
Базовые модули:
| Модуль | Что делает |
|---|---|
ping | Проверяет SSH + Python. Не ICMP. |
command | Выполняет команду без шелла. Безопасно. |
shell | Выполняет через /bin/sh. Есть пайпы, редиректы. |
copy | Копирует файл с control node на managed node. |
apt | Управляет пакетами на Debian/Ubuntu. |
yum / dnf | То же для RHEL/Rocky/AlmaLinux/Fedora. |
service | Управляет сервисами через любой init (systemd, OpenRC, SysV). Для systemd-специфики (daemon-reload, маски) есть отдельный модуль systemd. |
user | Создаёт/изменяет пользователей. |
command vs shell
command безопаснее. Аргумент передаётся как список, без интерпретации шеллом.
Никаких $VAR, пайпов, редиректов. Хорошо для простых команд.
shell нужен, когда без шелла не обойтись: пайпы (ps aux | grep nginx),
редиректы (> /tmp/out), глобы (*.conf). Но есть риск инъекции, если
в аргументах пользовательский ввод.
Правило: используй command по умолчанию, переключайся на shell
только когда нужны шелловые возможности.
Примеры ad-hoc команд
Проверить связь со всеми хостами:
ansible all -i inventory.ini -m ping
Узнать uptime на группе web:
ansible web -i inventory.ini -m command -a "uptime"
Установить пакет с повышением прав:
ansible all -i inventory.ini -m apt -a "name=nginx state=present" -b
Скопировать файл на все web-серверы:
ansible web -i inventory.ini -m copy -a "src=./nginx.conf dest=/etc/nginx/nginx.conf"
Перезапустить сервис:
ansible web -i inventory.ini -m service -a "name=nginx state=restarted" -b
become: повышение прав
Многие операции требуют root. Флаг -b (или --become) говорит
Ansible использовать sudo перед выполнением модуля.
ansible all -m apt -a "name=vim state=present" -b
По умолчанию become использует sudo. Можно настроить другой механизм
(su, doas, pbrun) через --become-method, но стандартом остаётся sudo.
В playbook become настраивается на уровне play или отдельной задачи, что удобнее, чем флаги в каждой ad-hoc команде.
Что важно запомнить
Inventory — список хостов с параметрами. Форматы ini и yaml; дефолт
/etc/ansible/hosts, но лучше держать свой и передавать через -i.
Ad-hoc команды — быстрое одноразовое действие. ansible <pattern> -m <module> -a "<args>".
Модуль ping проверяет SSH + Python, не ICMP. command работает без
шелла, shell — через шелл с пайпами.
-b или --become — повышение прав через sudo.
В следующем уроке — ansible.cfg и базовые настройки.
Самопроверка
Впишите команду / ключевую строку. Регистр и пробелы не важны.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Что такое модули в Ansible и какие используешь чаще всего (apt/yum, copy, template, file, service)?
ANS-004Что такое inventory-файл и какие форматы поддерживаются (ini, yaml, dynamic)?
ANS-003Для чего нужен ad-hoc режим и когда им пользоваться вместо playbook?
ANS-006Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс