Что такое Ad-hoc команды в Ansible и когда их уместно использовать?

«Что такое Ad-hoc команды в Ansible и когда их уместно использовать?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ad-hoc команды в Ansible — это однострочные команды, выполняемые напрямую из командной строки с помощью утилиты ansible или ansible-playbook (с флагом -e), для быстрого выполнения разовых задач на группе хостов без написания полноценного плейбука. Они используют модули Ansible с передачей аргументов.

Типичные сценарии использования в DevOps:

  1. Быстрая проверка и диагностика: Проверка доступности, сбор фактов, просмотр логов.
  2. Разовые операции: Перезагрузка службы, добавление/удаление пользователя, копирование файла.
  3. Тестирование модулей: Проверка работы модуля перед его включением в плейбук.
  4. Экстренное вмешательство: Выполнение срочного исправления на множестве серверов.

Примеры Ad-hoc команд:

# 1. Проверка доступности всех хостов из инвентаря (модуль ping)
ansible all -i production_inventory.yml -m ping

# 2. Сбор системных фактов с конкретного хоста и вывод в JSON
ansible db01.example.com -i inventory.ini -m setup --tree /tmp/facts/

# 3. Перезапуск службы nginx на группе хостов 'webservers'
ansible webservers -i inventory.ini -m systemd -a "name=nginx state=restarted" -b

# 4. Выполнение shell-команды для проверки дискового пространства
ansible all -i inventory.ini -m shell -a "df -h /"

# 5. Копирование локального файла конфигурации на удаленные хосты
ansible app_servers -i inventory.ini -m copy -a "src=/local/nginx.conf dest=/etc/nginx/nginx.conf owner=root mode=0644" -b

# 6. Управление пакетами: установка htop на хостах Ubuntu
ansible all:!db_servers -i inventory.ini -m apt -a "name=htop state=present update_cache=yes" -b

Ограничения и когда НЕ использовать Ad-hoc:

  • Сложная логика: Нет поддержки условий (when), циклов (loop), обработчиков (handlers).
  • Повторное использование: Команда существует только в истории shell. Для повторяющихся задач нужен плейбук.
  • Читаемость и контроль версий: Плейбуки, хранящиеся в Git, предоставляют историю изменений, код-ревью и ясную документацию.
  • Идемпотентность: Некоторые модули (особенно command и shell) по умолчанию не идемпотентны. Модули типа apt, yum, copy — идемпотентны.

Рекомендация: Используйте Ad-hoc команды для оперативных задач и разведки. Для любой логики, сложнее одной операции, или для задач, которые будут выполняться регулярно, сразу создавайте плейбук. Ad-hoc команды часто служат прототипом для будущих плейбуков.