Освоение основных ad-hoc команд для быстрых задач Ansible

Используйте ad-hoc команды Ansible для быстрых проверок, одноразовых исправлений, изменений файлов и сбора фактов без написания playbook.

Освоение основных ad-hoc команд для быстрых задач Ansible

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

Они не заменяют playbook. Используйте их для немедленной работы, затем переносите повторяющиеся или рискованные задачи в автоматизацию под контролем версий.

Базовая структура команды

Ad-hoc команда имеет следующий вид:

ansible <шаблон> -m <имя_модуля> -a "<аргументы_модуля>" [опции]

Шаблон хоста выбирает цели инвентаризации. Модуль определяет, что делает Ansible. Аргументы передают значения, специфичные для модуля.

Общие опции включают:

  • -i <инвентаризация> или --inventory <инвентаризация>: использовать конкретный файл или источник инвентаризации.
  • -u <пользователь> или --user <пользователь>: подключаться как конкретный удаленный пользователь.
  • -b или --become: использовать повышение привилегий, обычно sudo.
  • -k или --ask-pass: запросить пароль SSH.
  • -K или --ask-become-pass: запросить пароль sudo.
  • --limit <подмножество>: дополнительно сузить выбранные хосты.

Если вы не передаете -i, Ansible использует настроенную инвентаризацию. Во многих системах это /etc/ansible/hosts, но ваш ansible.cfg может это изменить.

Проверка доступа с помощью ping

Модуль ping не отправляет ICMP эхо-пакеты. Он подключается через обычный транспорт Ansible, запускает небольшой модуль на целевом хосте и ожидает ответ pong.

ansible all -m ping

Для одной группы:

ansible webservers -m ping

Успешный результат выглядит так:

web01.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Если это не удается, исправьте инвентаризацию, DNS, SSH-ключи, удаленного пользователя, настройки sudo или доступность Python перед устранением неполадок на более высоком уровне.

Выполнение простых команд с помощью command

Модуль command запускает программу непосредственно на удаленном хосте. Он не вызывает оболочку, поэтому конвейеры, перенаправления, расширение шаблонов и расширение $VARIABLE не работают так, как в вашем терминале.

Проверка времени работы:

ansible webservers -m command -a "uptime"

Проверка использования диска:

ansible all -m command -a "df -h"

Список защищенной директории с sudo:

ansible dbservers -m command -a "ls -l /var/log" --become

Используйте command в первую очередь, когда вам не нужны функции оболочки. Это проще для понимания и позволяет избежать случайной интерпретации оболочки.

Используйте shell только когда нужны функции оболочки

Модуль shell запускает команду через оболочку на удаленном хосте. Используйте его для конвейеров, перенаправлений, расширения переменных и условных операторов оболочки.

Поиск самых больших каталогов журналов:

ansible databases -m shell -a "du -sh /var/log/* | sort -rh | head -n 5"

Проверка переменной окружения на удаленном хосте:

ansible all -m shell -a "printf '%s\n' \"$PATH\""

Будьте осторожны с динамическим вводом. Если значения, предоставленные пользователем, вставляются в команду оболочки без кавычек и проверки, вы можете создать уязвимость для внедрения команд.

Для редактирования файлов предпочтительнее использовать специализированный модуль вместо перенаправления оболочки. Например, добавьте управляемую строку с помощью lineinfile:

ansible webservers -m lineinfile -a "path=/etc/app/app.conf line='feature_enabled=true' create=yes" --become

Это безопаснее и более повторяемо, чем добавление с помощью echo ... >> file.

Копирование файлов с помощью copy

Модуль copy передает файлы с вашего узла управления на управляемые хосты.

ansible webservers -m copy -a "src=./myscript.sh dest=/tmp/myscript.sh mode=0755"

Копирование конфигурационного файла, требующего владения root:

ansible all -m copy -a "src=./app.conf dest=/etc/app/app.conf owner=root group=root mode=0644" --become

Если место назначения уже имеет то же содержимое и метаданные, Ansible сообщает об отсутствии изменений.

Управление путями с помощью file

Используйте модуль file для создания каталогов, удаления путей, установки владельца, установки разрешений или создания символических ссылок.

Создание каталога:

ansible appservers -m file -a "path=/opt/my_app state=directory mode=0755 owner=app group=app" --become

Удаление старого файла:

ansible host1 -m file -a "path=/tmp/old_file.txt state=absent"

Создание символической ссылки:

ansible appservers -m file -a "src=/opt/my_app/releases/current dest=/opt/my_app/current state=link"

Сбор фактов с помощью setup

Модуль setup собирает факты о хосте, включая ОС, сеть, ЦП, память и сведения об устройствах.

Сбор всех фактов с одного хоста:

ansible webserver1 -m setup

Фильтрация фактов, когда нужна только небольшая часть:

ansible all -m setup -a "filter=ansible_distribution*"

Вывод может быть большим, поэтому фильтрация делает устранение неполадок читабельным.

Выбор между ad-hoc командами и playbook

Используйте ad-hoc команды для быстрых проверок и одноразовых задач:

  • Проверка подключения с помощью ping.
  • Проверка состояния с помощью command.
  • Копирование одного известного файла с помощью copy.
  • Создание или удаление одного пути с помощью file.
  • Сбор фактов во время устранения неполадок.

Используйте playbook, когда задача повторяется, состоит из нескольких шагов, проверяется коллегами или достаточно рискованна, чтобы требовать контроля версий и предсказуемой структуры.

Проверки безопасности перед запуском

Проверьте шаблон хоста перед запуском чего-либо разрушительного:

ansible webservers --list-hosts

Используйте --limit, когда хотите уменьшить радиус поражения:

ansible all --limit web01.example.com -m ping

Помните, что command и shell не являются автоматически идемпотентными. Команда типа useradd deploy может завершиться ошибкой при втором запуске, если вы не напишете ее защитно. Модули, такие как user, file, copy и lineinfile, обычно обеспечивают более безопасное повторяемое поведение.

Вывод

Ad-hoc команды Ansible лучше всего подходят для быстрых целенаправленных операций. Начните с ping, используйте command для простых проверок, оставьте shell для реального синтаксиса оболочки и предпочитайте модули, такие как copy, file, lineinfile и setup, когда они соответствуют задаче.