Spec-Zone.ru › Ansible 2.4

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

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

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

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

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

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

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

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

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

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

Если вы еще не читали Inventory, пожалуйста, ознакомьтесь с ним сначала, а затем мы начнем.

Параллелизм и команды оболочки

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

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

$ 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-user otheruser [--ask-become-pass]

Примечание

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

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

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

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

Примечание

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

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

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

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

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

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

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

Чтобы перенести файл напрямую на многие серверы:

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

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

Модуль 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 также поддерживают опрос и имеют упрощённый синтаксис для этого.

Сбор фактов

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

$ ansible all -m setup

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

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

См. также

Файл конфигурации
Все о файле конфигурации Ansible
О модулях
Список доступных модулей
Плейбуки
Использование 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.4/intro_adhoc.html

Spec-Zone.ru

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