← Ansible
13 мин · просто · Урок 2 из 12

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

Что тут происходит:

Тот же инвентарь в 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>"

Паттерны:

Всё в 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 и базовые настройки.

Самопроверка

Впишите команду / ключевую строку. Регистр и пробелы не важны.

1. Проверь связь со всеми хостами из файла inventory.ini через модуль ping.
2. Выполни команду `uptime` на группе web через модуль command.
3. Установи пакет nginx через модуль apt с повышением прав (become) на всех хостах.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Что такое модули в Ansible и какие используешь чаще всего (apt/yum, copy, template, file, service)?

ANS-004
02

Что такое inventory-файл и какие форматы поддерживаются (ini, yaml, dynamic)?

ANS-003
03

Для чего нужен ad-hoc режим и когда им пользоваться вместо playbook?

ANS-006

Прошли материал до конца? Отметьте урок пройденным.