Spec-Zone.ru › Ansible 2.6

Введение в Ad-Hoc команды

  • Параллельность и команды оболочки
  • Передача файлов
  • Управление пакетами
  • Пользователи и группы
  • Развёртывание из системы контроля версий
  • Управление службами
  • Операции в фоновом режиме с ограничением по времени
  • Сбор фактов

В следующих примерах показано, как использовать /usr/bin/ansible для выполнения задач ad-hoc.

Что такое команда ad-hoc?

Команда ad-hoc — это команда, которую вы можете ввести, чтобы быстро выполнить какое-то действие, но не хотите сохранять её на потом.

Это хорошее место для начала понимания возможностей Ansible до изучения языка плейбуков — ad-hoc команды также могут быть использованы для быстрых действий, для которых не обязательно писать полный плейбук.

В общем, истинную мощь Ansible представляют плейбуки. Зачем использовать ad-hoc задачи вместо плейбуков?

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

Однако для управления конфигурацией и развертывания вы захотите использовать `/usr/bin/ansible-playbook` — концепции, которые вы узнаете здесь, будут непосредственно переноситься на язык плейбуков.

(См. Работа с плейбуками для получения дополнительной информации об этом).

Если вы ещё не читали Работа с инвентарём, пожалуйста, просмотрите его перед продолжением.

Параллельность и команды оболочки

Произвольный пример.

Давайте воспользуемся командной строкой Ansible для перезагрузки всех веб-серверов в Атланте, по 10 за раз. Сначала настроим SSH-агент, чтобы он запоминал наши учетные данные:

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

Если вы не хотите использовать ssh-agent и хотите вместо этого выполнить SSH с паролем вместо ключей, вы можете использовать --ask-pass (-k), но намного лучше использовать ssh-agent.

Теперь выполните команду на всех серверах в группе, в данном случае atlanta, в 10 параллельных потоках:

$ ansible atlanta -a "/sbin/reboot" -f 10

/usr/bin/ansible по умолчанию будет выполняться от имени вашего пользователя. Если вам не нравится это поведение, передайте «-u username». Если вы хотите выполнять команды от имени другого пользователя, это выглядит так:

$ ansible atlanta -a "/usr/bin/foo" -u username

Часто вы не захотите выполнять действия только от имени вашего пользователя. Если вы хотите выполнить команды с повышенными привилегиями:

$ ansible atlanta -a "/usr/bin/foo" -u username --become [--ask-become-pass]

Используйте --ask-become-pass (-K), если вы не используете метод повышения привилегий без пароля (sudo/su/pfexec/doas/и т. д.). Это позволит вам ввести пароль интерактивно. Использование безпарольного метода упрощает автоматизацию, но это не обязательно.

Также можно стать пользователем, отличным от root, используя --become-user:

$ ansible atlanta -a "/usr/bin/foo" -u username --become --become-user otheruser [--ask-become-pass]

Примечание

В редких случаях у некоторых пользователей есть правила безопасности, которые ограничивают их среду sudo/pbrun/doas выполнением только определённых путей команд. Это не работает с философией Ansible без предварительной настройки и сотнями различных модулей. В таком случае используйте Ansible от специальной учётной записи, у которой нет этого ограничения. Один из способов сделать это без предоставления доступа неавторизованным пользователям — это использовать Ansible через Ansible Tower, который может хранить SSH-учётные данные и позволять членам определённых организаций использовать их от своего имени без прямого доступа.

Хорошо, это основы. Если вы ещё не читали о шаблонах и группах, вернитесь и прочитайте Работа с шаблонами.

-f 10 в приведённом выше примере определяет использование 10 одновременных процессов. Вы также можете установить это в Настройка Ansible, чтобы не настраивать это каждый раз. По умолчанию значение равно 5, что очень мало и консервативно. Скорее всего, вам понадобится взаимодействие со значительно большим количеством одновременных хостов, поэтому не стесняйтесь увеличить это значение. Если у вас больше хостов, чем значение, установленное для количества потоков, Ansible будет взаимодействовать с ними, но это займёт немного больше времени. Не стесняйтесь увеличивать это значение до предела, которое может обработать ваша система!

Вы также можете выбрать, какой «модуль» Ansible вы хотите запустить. Обычно команды также принимают -m для имени модуля, но имя модуля по умолчанию — «command», поэтому нам не нужно было указывать его каждый раз. Мы будем использовать -m в последующих примерах для запуска других Работа с модулями.

Примечание

Модуль command не поддерживает расширенный синтаксис оболочки, например, конвейеры и перенаправление (хотя переменные оболочки всегда будут работать). Если ваша команда требует синтаксиса, специфичного для оболочки, используйте модуль shell вместо него. Узнайте больше о различиях на странице Работа с модулями.

Использование модуля shell выглядит так:

$ ansible raleigh -m shell -a 'echo $TERM'

При выполнении любой команды с помощью Ansible ad hoc CLI (в отличие от плейбуков), обратите особое внимание на правила цитирования оболочки, чтобы локальная оболочка не съела переменную перед передачей её в Ansible. Например, использование двойных, а не одинарных кавычек в приведённом выше примере выведет значение переменной на той машине, на которой вы находитесь.

До сих пор мы демонстрировали простое выполнение команд, но большинство модулей Ansible не являются простыми императивными скриптами. Вместо этого они используют декларативную модель, рассчитывая и выполняя действия, необходимые для достижения заданного конечного состояния. Кроме того, они достигают идемпотентности, проверяя текущее состояние перед началом и, если текущее состояние совпадает с заданным конечным состоянием, ничего не делают. Однако мы также признаём, что выполнение произвольных команд может быть полезным, поэтому Ansible легко поддерживает оба варианта.

Передача файлов

Вот ещё один пример использования командной строки /usr/bin/ansible. Ansible может выполнять SCP для множества файлов на нескольких машинах параллельно.

Для передачи файла напрямую на несколько серверов:

$ ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"

Если вы используете плейбуки, вы также можете воспользоваться модулем template, который расширяет эти возможности. (См. документацию по модулям и плейбукам).

Модуль file позволяет изменять владельца и разрешения на файлы. Эти же параметры можно передать непосредственно модулю copy:

$ ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"

Модуль file также может создавать каталоги, подобно mkdir -p:

$ ansible webservers -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

А также удалять каталоги (рекурсивно) и удалять файлы:

$ ansible webservers -m file -a "dest=/path/to/c state=absent"

Управление пакетами

Доступны модули для yum и apt. Вот несколько примеров с yum.

Установить пакет, но не обновлять его:

$ ansible webservers -m yum -a "name=acme state=present"

Установить пакет до определённой версии:

$ ansible webservers -m yum -a "name=acme-1.5 state=present"

Установить пакет до последней версии:

$ ansible webservers -m yum -a "name=acme state=latest"

Удалить пакет:

$ ansible webservers -m yum -a "name=acme state=absent"

Ansible имеет модули для управления пакетами на многих платформах. Если для вашего пакетного менеджера нет модуля, вы можете установить пакеты с помощью модуля command или (лучше!) создать модуль для вашего пакетного менеджера. Заходите на список рассылки для получения информации/подробностей.

Пользователи и группы

Модуль «user» позволяет легко создавать и изменять существующие учётные записи пользователей, а также удалять учётные записи пользователей, которые могут существовать:

$ ansible all -m user -a "name=foo password=<crypted password here>"

$ ansible all -m user -a "name=foo state=absent"

См. раздел Работа с модулями для получения подробной информации обо всех доступных параметрах, включая способы управления группами и членством в группах.

Развёртывание из системы контроля версий

Разверните ваше веб-приложение непосредственно из git:

$ ansible webservers -m git -a "repo=https://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

Поскольку модули Ansible могут уведомлять обработчики изменений, можно указать Ansible на выполнение определённых задач при обновлении кода, таких как развертывание Perl/Python/PHP/Ruby напрямую из git и последующее перезапуск apache.

Управление службами

Обеспечить запуск службы на всех веб-серверах:

$ ansible webservers -m service -a "name=httpd state=started"

В качестве альтернативы, перезапустить службу на всех веб-серверах:

$ ansible webservers -m service -a "name=httpd state=restarted"

Остановите службу:

$ ansible webservers -m service -a "name=httpd state=stopped"

Операции в фоновом режиме с ограничением по времени

Долговременные операции можно выполнять в фоновом режиме, и их состояние можно проверить позже. Например, для асинхронного выполнения long_running_operation в фоновом режиме с таймаутом в 3600 секунд (-B), без опроса (-P):

$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"

Если вы решите проверить статус задачи позже, вы можете использовать модуль async_status, передав ему идентификатор задачи, который был возвращён при запуске исходной задачи в фоновом режиме:

$ ansible web1.example.com -m async_status -a "jid=488359678239.2844"

Опрос встроен и выглядит следующим образом:

$ ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"

В приведённом выше примере указано «выполнять максимум 30 минут (-B 30*60=1800), проверять статус (-P) каждые 60 секунд».

Режим опроса умный, поэтому все задачи будут запущены до начала опроса на любом узле. Убедитесь, что значение --forks достаточно высокое, если вы хотите быстро запустить все свои задачи. После истечения лимита времени (в секундах) (-B) процесс на удалённых узлах будет завершён.

Обычно вы будете запускать в фоновом режиме только длительные командные строки оболочки или обновления программного обеспечения. Запуск в фоновом режиме модуля копирования не выполняет передачу файла в фоновом режиме. Плейбуки также поддерживают опрос и имеют упрощённый синтаксис для этого.

Сбор фактов

Факты описываются в разделе playbooks и представляют собой обнаруженные переменные о системе. Их можно использовать для реализации условного выполнения задач, а также просто для получения информации о вашей системе. Вы можете просмотреть все факты следующим образом:

$ ansible all -m setup

Также можно отфильтровать этот вывод, чтобы экспортировать только определенные факты. Подробности см. в документации модуля «setup».

Подробнее о фактах читайте в разделе Переменные, когда вы готовы ознакомиться с Playbooks.

См. также

Настройка Ansible
Все о файле конфигурации Ansible
Все модули
Список доступных модулей
Работа с Playbooks
Использование Ansible для управления конфигурацией и развертывания
Список рассылки
Вопросы? Помощь? Идеи? Заходите на список рассылки на Google Groups
irc.freenode.net
IRC-чат-канал #ansible

© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.6/user_guide/intro_adhoc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API