Введение в разовые команды
Разовая команда Ansible использует инструмент командной строки /usr/bin/ansible для автоматизации одной задачи на одном или нескольких управляемых узлах. Разовые команды быстрые и простые, но их нельзя использовать повторно. Зачем же изучать разовые команды? Разовые команды демонстрируют простоту и мощь Ansible. Изученные здесь концепции напрямую применимы к языку плейбуков. Перед чтением и выполнением этих примеров ознакомьтесь с разделом Как составить инвентаризацию.
Зачем использовать разовые команды?
Разовые команды отлично подходят для задач, которые вы выполняете редко. Например, если перед отпуском вы хотите выключить все компьютеры в лаборатории, можно выполнить короткую однострочную команду Ansible, не создавая плейбук. Разовая команда выглядит так:
$ ansible [pattern] -m [module] -a "[module options]"
Параметр -a принимает параметры либо в синтаксисе key=value, либо в виде строки JSON, начинающейся с { и заканчивающейся на }, для более сложной структуры параметров. Подробнее о шаблонах и модулях читайте на других страницах.
Варианты использования разовых задач
Разовые задачи можно использовать для перезагрузки серверов, копирования файлов, управления пакетами и пользователями и многого другого. В разовой задаче можно использовать любой модуль Ansible. Разовые задачи, как и плейбуки, используют декларативную модель: вычисляют и выполняют действия, необходимые для достижения заданного конечного состояния. Они обеспечивают определённую идемпотентность: перед началом проверяют текущее состояние и ничего не делают, если оно совпадает с заданным конечным состоянием.
Перезагрузка серверов
Модулем по умолчанию для утилиты командной строки ansible является модуль ansible.builtin.command. С помощью разовой задачи можно вызвать модуль command и перезагрузить все веб-серверы в Атланте, по 10 за раз. Для этого Ansible необходимо, чтобы все серверы в Атланте были перечислены в группе [atlanta] в инвентаризации, а у вас были действующие учётные данные SSH для каждого компьютера в этой группе. Чтобы перезагрузить все серверы в группе [atlanta]:
$ ansible atlanta -a "/sbin/reboot"
По умолчанию Ansible использует только пять процессов одновременно. Если количество узлов превышает значение, заданное для числа ответвлений, это может увеличить время взаимодействия Ansible с узлами. Чтобы перезагрузить серверы [atlanta], используя 10 параллельных ответвлений:
$ ansible atlanta -a "/sbin/reboot" -f 10
По умолчанию /usr/bin/ansible запускается от имени вашей учётной записи. Чтобы подключиться от имени другого пользователя:
$ ansible atlanta -a "/sbin/reboot" -f 10 -u username
Для перезагрузки, вероятно, потребуются повышенные привилегии. Можно подключиться к серверу как username и выполнить команду от имени пользователя root с помощью ключевого слова become:
$ ansible atlanta -a "/sbin/reboot" -f 10 -u username --become [--ask-become-pass]
Если добавить --ask-become-pass или -K, Ansible запросит пароль для повышения привилегий (sudo/su/pfexec/doas и т. д.).
Примечание
Модуль command не поддерживает расширенный синтаксис оболочки, например конвейеры и перенаправления (хотя переменные оболочки всегда работают). Если для вашей команды требуется синтаксис, специфичный для оболочки, используйте вместо него модуль shell.
До сих пор во всех примерах использовался модуль ‘command’ по умолчанию. Чтобы использовать другой модуль, укажите -m в качестве имени модуля. Например, чтобы использовать модуль ansible.builtin.shell:
$ ansible raleigh -m ansible.builtin.shell -a 'echo $TERM'
При выполнении любых команд с помощью интерфейса командной строки Ansible для разовых задач (в отличие от плейбуков) внимательно соблюдайте правила кавычек оболочки, чтобы локальная оболочка сохранила переменную и передала её Ansible. Например, если в приведённом выше примере использовать двойные кавычки вместо одинарных, переменная будет вычислена на компьютере, за которым вы работаете.
Управление файлами
Разовая задача позволяет использовать возможности Ansible и SCP для параллельной передачи множества файлов на несколько компьютеров. Чтобы передать файл напрямую на все серверы в группе [atlanta]:
$ ansible atlanta -m ansible.builtin.copy -a "src=/etc/hosts dest=/tmp/hosts"
Если вы планируете повторять такую задачу, используйте в плейбуке модуль ansible.builtin.template.
Модуль ansible.builtin.file позволяет изменять владельца и разрешения файлов. Те же параметры можно передать непосредственно и модулю copy:
$ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/a.txt mode=600" $ ansible webservers -m ansible.builtin.file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"
Модуль file также может создавать каталоги, как и mkdir -p:
$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"
Кроме того, он может удалять каталоги (рекурсивно) и файлы:
$ ansible webservers -m ansible.builtin.file -a "dest=/path/to/c state=absent"
Управление пакетами
Разовую задачу также можно использовать для установки, обновления или удаления пакетов на управляемых узлах с помощью модуля управления пакетами, например yum. Модули управления пакетами поддерживают стандартные функции установки, удаления и общего управления пакетами. Некоторые специфические функции менеджера пакетов могут отсутствовать в модуле Ansible, поскольку они не относятся к общему управлению пакетами.
Чтобы убедиться, что пакет установлен, но не обновлён:
$ ansible webservers -m ansible.builtin.yum -a "name=acme state=present"
Чтобы убедиться, что установлена определённая версия пакета:
$ ansible webservers -m ansible.builtin.yum -a "name=acme-1.5 state=present"
Чтобы убедиться, что установлен пакет последней версии:
$ ansible webservers -m ansible.builtin.yum -a "name=acme state=latest"
Чтобы убедиться, что пакет не установлен:
$ ansible webservers -m ansible.builtin.yum -a "name=acme state=absent"
Ansible предоставляет модули для управления пакетами на многих платформах. Если для вашего менеджера пакетов нет модуля, можно устанавливать пакеты с помощью модуля command или создать модуль для своего менеджера пакетов.
Управление пользователями и группами
С помощью разовых задач можно создавать, изменять и удалять учётные записи пользователей на управляемых узлах:
$ ansible all -m ansible.builtin.user -a "name=foo password=<encrypted password here>" $ ansible all -m ansible.builtin.user -a "name=foo state=absent"
Подробную информацию обо всех доступных параметрах, включая изменение групп и членства в группах, см. в документации модуля ansible.builtin.user.
Управление службами
Убедитесь, что служба запущена на всех веб-серверах:
$ ansible webservers -m ansible.builtin.service -a "name=httpd state=started"
Также можно перезапустить службу на всех веб-серверах:
$ ansible webservers -m ansible.builtin.service -a "name=httpd state=restarted"
Убедитесь, что служба остановлена:
$ ansible webservers -m ansible.builtin.service -a "name=httpd state=stopped"
Сбор фактов
Факты — это обнаруженные сведения о системе, представленные в виде переменных. Факты можно использовать для условного выполнения задач, а также просто для получения информации о системах с помощью разовых команд. Чтобы просмотреть все факты:
$ ansible all -m ansible.builtin.setup
Также можно отфильтровать этот вывод, чтобы отобразить только определённые факты. Подробности см. в документации модуля ansible.builtin.setup.
Режим проверки
В режиме проверки Ansible не вносит изменений в удалённые системы. Ansible только выводит команды, но не выполняет их.
$ ansible all -m copy -a "content=foo dest=/root/bar.txt" -C
Включение режима проверки (-C или --check) в приведённой выше команде означает, что Ansible фактически не создаст и не обновит файл /root/bar.txt ни в одной удалённой системе.
Шаблоны и разовые команды
Подробную информацию обо всех доступных параметрах, включая ограничение области действия с помощью шаблонов в разовых командах, см. в документации по шаблонам.
Теперь, когда вы понимаете основные элементы выполнения Ansible, можно перейти к автоматизации повторяющихся задач с помощью плейбуков Ansible.
См. также
- Настройка Ansible
-
Всё о файле конфигурации Ansible
- Индекс коллекций
-
Просмотр существующих коллекций, модулей и плагинов
- Работа с плейбуками
-
Использование Ansible для управления конфигурацией и развёртывания
- Общение
-
Есть вопросы? Нужна помощь? Хотите поделиться идеями? Посетите руководство по общению сообщества Ansible
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/command_guide/intro_adhoc.html