Введение в ад-хок команды
- Параллелизм и командные файлы оболочки
- Передача файлов
- Управление пакетами
- Пользователи и группы
- Развертывание из системы управления версиями
- Управление службами
- Операции в фоновом режиме с ограничением по времени
- Сбор фактов
В следующих примерах показано, как использовать /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-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/etc). Это позволит вам интерактивно ввести пароль. Использование установки без пароля упрощает автоматизацию, но это не обязательно.
Также можно стать пользователем, отличным от 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 может копировать много файлов на несколько машин параллельно.
Для передачи файла напрямую на многие серверы:
$ 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) процесс на удаленных узлах будет завершен.
Как правило, вы будете запускать только длительные командные файлы оболочки или обновления программного обеспечения в фоновом режиме. Запуск модуля копирования в фоновом режиме не выполняет передачу файлов в фоновом режиме. 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.5/user_guide/intro_adhoc.html