Spec-Zone.ru › Ansible 2.8

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

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

В следующих примерах показано, как использовать /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 для получения дополнительной информации об этом)

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

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

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

Давайте используем командную строку 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 имя_пользователя». Если вы хотите запустить команды от имени другого пользователя, это выглядит так:

$ 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 с Red Hat Ansible Tower, который может хранить SSH-учётные данные и позволять членам определённых организаций использовать их от их имени без прямого доступа.

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

-f 10 в вышеприведённом коде задаёт использование 10 одновременных процессов. Вы также можете настроить это в Настройке Ansible, чтобы не устанавливать его снова. По умолчанию используется 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, который продвигает это ещё дальше. (См. документацию по модулям и playbooks).

Модуль 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) процесс на удалённых узлах будет завершён.

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

Сбор фактов

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

$ ansible all -m setup

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

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

См. также

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

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

Spec-Zone.ru

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