Введение в ад-хок команды
- Параллелизм и командная оболочка
- Передача файлов
- Управление пакетами
- Пользователи и группы
- Развёртывание из системы управления версиями
- Управление службами
- Операции в фоновом режиме с ограничением по времени
- Сбор фактов
В следующих примерах показано, как использовать /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 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 (в отличие от 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.7/user_guide/intro_adhoc.html