ansible запуск скрипта на удаленной машине

Как выполнить скрипт shell на удаленном сервере с помощью Ansible?

Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

пустой файл test.sh:

Когда я запускаю playbook, передача успешно происходит, но сценарий не выполняется.

4 ответа

Я использую Ansible 2.1.1.0, введенный pip в OS X El capitan. И я попробовал с очень простой конфигурацией: #/etc/ansible/hosts [webservers] my.remote.server Использование переменной ansible_user для подключения через ssh с использованием соответствующего открытого ключа.

как запустить скрипт Mongo db на удаленном сервере? Я знаю, что приведенная ниже команда может быть использована для того же на локальном уровне, что и упомянутая здесь: Как выполнить команды mongo через скрипты shell? mongo

Измените задачу «Execute the script» на

и он должен это сделать.

Вам не нужно повторять sudo в командной строке, потому что вы уже определили его в учебнике.

Согласно Ansible Intro to Playbooks параметр user был переименован в remote_user в Ansible 1.4, поэтому вы также должны изменить его

Итак, сборник пьес станет:

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

Похожие вопросы:

Я хочу выполнить команду на удаленном сервере, используя ресурсы в клиенте (обе стороны linux), например: в клиенте у меня есть файл shell(например: /home/john/helloworld.sh), я подключаюсь к.

Я запускаю команду на удаленном сервере с помощью скрипта shell, а затем вызываю этот скрипт shell из PHP. Скрипт прекрасно работает сам по себе, но при вызове из PHP я получаю ошибку : проверка.

Я использую Ansible 2.1.1.0, введенный pip в OS X El capitan. И я попробовал с очень простой конфигурацией: #/etc/ansible/hosts [webservers] my.remote.server Использование переменной ansible_user.

как запустить скрипт Mongo db на удаленном сервере? Я знаю, что приведенная ниже команда может быть использована для того же на локальном уровне, что и упомянутая здесь: Как выполнить команды mongo.

Источник

Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 4: работаем с модулями

В первой части мы начали изучение Ansible, популярного инструмента для автоматизации настройки и развертывания ИТ-инфраструктуры. Ansible был успешно установлен в InfoboxCloud, описаны принципы работы, базовая настройка. В завершении статьи мы показали как быстро установить nginx на несколько серверов.

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

В третьей части мы узнали как написать единый Ansible playbook для разных ОС (например с rpm и deb), как обслуживать множество хостов и не писать их все в inventory, и как сгруппировать сервера по регионам облака. Было изучено использование переменных Ansible и файла inventory.

ansible запуск скрипта на удаленной машине. 007782ecf992bde2095ae16c39adfba0. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-007782ecf992bde2095ae16c39adfba0. картинка ansible запуск скрипта на удаленной машине. картинка 007782ecf992bde2095ae16c39adfba0. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

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

Модули в Ansible

Ansible предоставляет более 200 модулей, таких как System, Network, Database, Files и так далее. Вы можете использовать модули для настройки своей IT-инфраструктуры.

Командный модуль command

ansible запуск скрипта на удаленной машине. 7164a5312c1e16263f7d40f2be64259c. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-7164a5312c1e16263f7d40f2be64259c. картинка ansible запуск скрипта на удаленной машине. картинка 7164a5312c1e16263f7d40f2be64259c. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

Командный модуль raw

Этот модуль следует использовать, когда другие командные модули использовать не удается. Это простой запуск удаленных команд серверу по SSH. Данный модуль работает даже на серверах без установленного Python.

Простой пример установки пакета vim:

ansible запуск скрипта на удаленной машине. c92057692ee1a931235af5758cf9fe1a. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-c92057692ee1a931235af5758cf9fe1a. картинка ansible запуск скрипта на удаленной машине. картинка c92057692ee1a931235af5758cf9fe1a. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

Вы сможете увидеть, что пакет установлен, но задача не будет помечена как changed. Лучше не использовать raw модуль когда возможно.

Командный модуль script

Этот модуль используется для копирования скрипта на удаленную машину и исполнения его. Модуль поддерживает параметры creates и removes.

Давайте напишем скрипт для просмотра количества директорий в /etc и запустим его на удаленных серверах (

/ansible/playbooks/scripts/list_number_of_directories.sh):

Задача, использующая модуль script выглядит так:

Путь к файлу скрипта задается относительно месторасположения файла, использующего модуль script. Например, если данная задача описана в файле задачи, импортированном в playbook, расположение скрипта задается относительно файла задачи, а не playbook.

ansible запуск скрипта на удаленной машине. 7ab3d2a36da816494d46a82307fe61ee. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-7ab3d2a36da816494d46a82307fe61ee. картинка ansible запуск скрипта на удаленной машине. картинка 7ab3d2a36da816494d46a82307fe61ee. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

Как видно из вывода исполнения playbook с выводом отладочной информации -vv в /etc 91 директория.

Командный модуль shell

Ключевое отличие модуля shell от модуля command в том, что он использует /bin/sh по умолчанию для запуска команд. Вы можете использовать переменные оболочки и другие функции оболочки.

Файловый модуль: file

Модуль file позволяет вам изменять атрибуты файла. Вы можете создать файл, создать или удалить директории рекурсивно, создать или удалить символическую ссылку.

Давайте проверим, что httpd.conf имеет правильные права и владельца:

Так как скрипты Ansible позволяют достичь нужного состояния и при перезапуске скриптов — повторный запуск позволит убедиться и поправить при необходимости права на доступ к файлам.

Посмотрим, как создаются симлинки:

Создадим директории рекурсивно:

Файловый модуль template

Для создания шаблонов Ansible использует язык шаблонизации Jinja2. Модуль template позволяет также создавать файл на сервере.

Давайте создадим простейший шаблон (

/ansible/playbooks/templates/ansible_hostname).

Задача будет выглядеть так:

ansible запуск скрипта на удаленной машине. e3959f83790e7db6eec79210a763b9f0. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-e3959f83790e7db6eec79210a763b9f0. картинка ansible запуск скрипта на удаленной машине. картинка e3959f83790e7db6eec79210a763b9f0. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

Ansible создала файл testfile на серверах и применила шаблонизацию к нему. «ansible-for-config» – значение hostname.

ansible запуск скрипта на удаленной машине. 274fdecd28d082b0333cbaf0182ff8be. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-274fdecd28d082b0333cbaf0182ff8be. картинка ansible запуск скрипта на удаленной машине. картинка 274fdecd28d082b0333cbaf0182ff8be. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

Модуль template предоставляет полезную опцию validate, позволяющую проверить файл до его копирования. Классический пример — файл конфигурации Apache. Для запуска проверки синтаксиса используется команда:

Если все ОК — вы увидите «Syntax OK». Если нет — вы увидите ошибку.

Давайте посмотрим, как сделать такую же проверку в playbook:

Если используемое ПО позволяет делать проверку конфигураций, вы с помощью опции validate сможете безопаснее применять конфигурации.

Файловый модуль copy

С помощью модуля copy можно копировать файлы на сервер.

Модуль системы управления версиями git

В Ansible есть поддержка различных систем управления версиями (svn, bzr, hg и другие), но мы рассмотрим модуль git.

Установим git на сервера:

Теперь получим репозиторий со скриптами из этих статей:

ansible запуск скрипта на удаленной машине. 2d0972f1dfbeac665a588747f38ebcbd. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-2d0972f1dfbeac665a588747f38ebcbd. картинка ansible запуск скрипта на удаленной машине. картинка 2d0972f1dfbeac665a588747f38ebcbd. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

До и после выполнения задачи считается SHA, который позволяет понять, был ли репозиторий обновлен.

Если вы получаете файлы по SSH – используйте параметры accept_key и key_file для установки ключа для доступа к репозиторию. Если нужно использовать ключ accept_key=yes. key_file указывает на путь к ключу. Если ключ находится в

/.ssh – указывать key_file не нужно.

Заключение

В написании статьи очень помогла книга «Learning Ansible» и конечно официальная документация.

Все эксперименты с Ansible удобно проводить в InfoboxCloud, так как имеется возможность для каждого виртуального сервера установить именно то количество ресурсов, которое необходимо для задачи (CPU/Ram/диск независимо друг от друга) или использовать автомасштабирование, а не выбирать VM из готовых шаблонов. Когда эксперименты не проводятся — можно просто выключить VM и оплачивать только стоимость диска.

Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней. Туда же можно задавать вопросы по Ansible для освещения в последующих статьях.

Источник

Система управления Ansible

ansible запуск скрипта на удаленной машине. image loader. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-image loader. картинка ansible запуск скрипта на удаленной машине. картинка image loader. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

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

Чтобы упростить процессы настройки и конфигурирования серверов, можно также писать shell-скрипты. Но и этот способ вряд ли можно назвать совершенным. Скрипты нужно постоянно изменять, подстраивая их под каждую новую задачу. При их написании необходимо учитывать различие операционных систем и версий. Не будем забывать и о том, что отладка скриптов отнимает много усилий и забирает немало времени.

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

Со всеми сложностями, о которых идет речь выше, мы хорошо знакомы на собственном опыте: у нас имеется 10 точек присутствия с NS-серверами, расположенные в разных точках планеты. На них необходимо регулярно вносить различные изменения: обновлять операционную систему, устанавливать и обновлять различное ПО, изменять конфигурцию и т.п. Мы решили все эти операции автоматизировать и внедрить систему удаленного управления конфигурациями. Изучив имеющиеся решения, мы остановили свой выбор на Ansible.

В этой статье мы бы хотели подробно рассказать о его возможностях этого инструмента управления конфигурациями и поделиться собственным опытом его использования.

Что такое Ansible?

Ansible — опенсорсное программное решение для удаленного управления конфигурациями, разработанное Майклом Де Хаанном в 2012 году. Название продукта взято из научно-фантастической литературы: в романах американской писательницы Урсулы Ле Гуин ансиблом называется устройство для оперативной космической связи.

Ansible берет на себя всю работу по приведению удаленных серверов в необходимое состояние. Администратору необходимо лишь описать, как достичь этого состояния с помощью так называемых сценариев (playbooks; это аналог рецептов в Chef). Такая технология позволяет очень быстро осуществлять переконфигурирование системы: достаточно всего лишь добавить несколько новых строк в сценарий.

Почему Ansible?

Преимущества Ansible по сравнению с другими аналогичными решениями (здесь в первую очередь следует назвать такие продукты, как Puppet, Chef и Salt) заключаются в следующем:

Установка

Требования для установки Ansible минимальны. На машине с которой производится управление должен быть установлен Python 2.6 или выше. На управляемых узлах должен быть установлен только Python версии не ниже 2.4, но он, как правило, по умолчанию включен в состав большинства дистрибутивов linux-систем. MS Windows не поддерживается.

Вам также могут потребоваться следующие модули Python, устанавливаемые через pip или пакетный менеджер вашей операционной системы:

В Ubuntu установка самого Ansible и зависимостей осуществляется добавлением репозитория и установкой пакета:

О процедуре установки в других ОС можно прочитать в официальной документации.

Группы серверов

Файл hosts

Помимо списка управляемых узлов, в файле hosts могут быть указаны и другие сведения, необходимые для работы: номера портов для подключения по SSH, способ подключения, пароль для подключения по SSH, имя пользователя, объединения групп и т.п. В некоторых случаях — в частности, при работе с большими и сложными конфигурациями, — различные параметры можно выносить в отдельные файлы и каталоги (о структуре каталогов см. ниже).

Более подробно о файле hosts и правилах его написания можно почитать в официальной документации.

Информация об узлах (Facts)

Перед внесением изменений Ansible подключается к управляемым узлам и собирает информацию о них: о сетевых интерфейсах и их состоянии, об установленной операционной системе и т.п. Он может делать это как с помощью собственного модуля, так и с помощью инструментов ohai и facter, если они установлены (такая возможность специально предусмотрена для пользователей, уже имеющих опыт работы с системами удаленного управления конфигурациями: ohai и facter являются библиотеками фактов для Chef и Puppet).
Переменные

Во время деплоя, как правило, требуется не только установить какое-либо приложение, но и настроить его в соответствии с определенными параметрами на основании принадлежности к группе серверов или индивидуально (например, ip-адрес BGP-соседа и номер его AS или параметры для базы данных). Как уже было сказано, загромождать файл hosts будет не очень красиво, поэтому разработчики Ansible пошли следующим путём:

Модули Ansible

В состав Ansible входит огромное количество модулей для развёртывания, контроля и управления различными компонентами, которые можно условно разделить на следующие группы (в скобках приведены названия некоторых продуктов и сервисов):

Примеры простых задач

С помощью Ansible можно одновременно выполнить одну задачу на целой группе серверов. Попробуем, например, отправить запрос ping на серверы выбранной группы:

Следующий пример соберёт информацию о хостах и выведёт её на консоль в формате JSON:

А вот так можно создать логический том (или, в зависимости от текущего состояния, изменить его размер) с именем examplevolume в группе examplegroup:

Ansible позволяет не только выполнять единичные задачи, но и писать сценарии, которые необходимо выполнить на управляемых узлах. Рассмотрим структуру и правила написания таких сценариев более подробно.

Cценарии (playbooks)

Все сценарии в Ansible пишутся на YAML. Это — человекочитаемый формат сериализованных данных, гораздо более простой, чем XML или JSON.

Чтобы выполнить сценарий используется команда ansible-playbook со следующим сиснтаксисом:

В начале сценария обязательно должна присутствовать последовательность символов «–––» (так в YAML обозначается начало документа). Перед каждым новым разделом списка ставится дефис ( — ):

Основными параметрами/группами простого сценария являются:

В разделе hosts указывается группа управляемых узлов, к которой будут применены описываемые в сценарии изменения.

Так, строка формата:

означает, что изменения будут применены к узлам из группы webservers.

Сценарии могут выполняться не только от имени пользователя, под именем которого установлено соедиение, но и любого другого. В следующем примере авторизация на хосте будет произведена с именем yourname, но задачи будут выполняться от имени пользователя root (если, конечно, этому пользователю это разрешено использовать sudo):

Если добавить параметр “user: postgres”, то все действия будут выполняться с привилегиями пользователя postgres.

В разделе vars указываются переменные, которые будут использованы в сценарии, и их значения:

Список изменений/состояний, которые необходимо произвести на управляемом узле, приводится в разделе tasks. Каждой задаче (task) присваивается имя (name), его можно опустить. Далее указывается модуль Ansible, который будет задействован при её выполнении:

Для каждой задачи можно указывать пользователя, от имени которого она будет выполнена:

Шаблонизация

В Ansbile используется шаблонизатор Jinja2. Приведём пример простого шаблона (часть конфига powerdns):

Обратим внимание на то, что файл шаблона и файл с паролем пользователя базы данных находятся на машине управления, а результатом будет файл на удалённом узле.

Обработчики событий (Handlers)

Ansible не просто выполняет задачи в указанном порядке, но и проверяет их состояние на наличие изменений. Если при выполнении сценария требовалось, например, добавить строку в конфигурационный файл, и в результате выполнения он изменился (необходимой строки действительно не было), то Ansible может выполнить специальную задачу, описанную как обработчик события (handler). Если при выполнении строка уже была в конфигурационном файле, то обработчик выполнен не будет. Обработчики событий описываются в конце сценария; в описании задачи они указываются через параметр notify. Приведём пример:

Контроль выполнения

Допустим, что при выполнении сценария нам нужно проверять определённые переменные или состояния и, в зависимости от них, выполнять или не выполнять какие-либо задачи. Для этого можно использовать оператор “when”:

Делегирование задачи другому хосту

Иногда требуется выполнить задачу на определённом узле, но в контексте другого узла. Например, во время обновления узла может возникнуть необходимость отключить для него мониторинг, находящийся на отдельном сервере. Для этого используется управляющая директива delegate_to. Приведём пример:

Результатом выполнения этой задачи будет отключение сообщений для сервиса dnsserver в Nagios.

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

Структура проекта

Пример сценария

Чтобы понять, как это все работает, рассмотрим практический пример: простой сценарий развёртывания новой версии PostgreSQL 9.3 на debian-based ОС. Роли в этом примере не используются.

Ansible AWX

Во всех приведенных выше примерах управление Ansible осуществляется с помощью интерфейса командной строки. Но с официального сайта можно загрузить графическую панель управления Ansibleworks AWX, очень симпатичную внешне и удобную в использовании. Собственно, за счет ее распространения и осуществляется монетизация продукта: управление небольшим (до 10) количеством серверов обходится бесплатно, если же серверов больше — нужно приобретать лицензию. Похожие варианты монетизации используются и разработчиками конкурирующих решений — Puppet и Chef.

Заключение

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

Для желающих узнать больше — несколько ссылок:

https://github.com/ansible/ — официальный аккаунт на github c исходным кодом проекта и хорошим набором примеров проектов

http://www.ansibleworks.com/docs/ — официальная документация (активно пополняется);

http://jpmens.net/2012/06/06/configuration-management-with-ansible/ — статья Яна Пита Менса об управлении конфигурациями с помощью Ansible (в его блоге есть и много других материалов по теме).

https://gist.github.com/marktheunissen/2979474 — пример сценария с подробными комментариями, правда для старой версии.

www.ansibleworks.com/docs/contrib.html — ещё больше ссылок на примеры использования, включая в том числе и очень сложные конфигурации.

Для тех кто не может комментировать посты на Хабре, приглашаем к нам в блог.

Источник

Пособие по Ansible

ansible запуск скрипта на удаленной машине. 7830760a48bc40a0a8d54853598fc013. ansible запуск скрипта на удаленной машине фото. ansible запуск скрипта на удаленной машине-7830760a48bc40a0a8d54853598fc013. картинка ansible запуск скрипта на удаленной машине. картинка 7830760a48bc40a0a8d54853598fc013. Я планирую выполнить сценарий shell на удаленном сервере, используя Ansible playbook.

Это практическое пособие познакомит вас c Ansible. Вам понадобится виртуальная или реальная машина, которая будет выступать в роли узла для Ansible. Окружение для Vagrant идет в комплекте с этим пособием.

Ansible — это программное решение для удаленного управления конфигурациями. Оно позволяет настраивать удаленные машины. Главное его отличие от других подобных систем в том, что Ansible использует существующую инфраструктуру SSH, в то время как другие (chef, puppet, и пр.) требуют установки специального PKI-окружения.

Пособие покрывает такие темы:

Ansible использует так называемый push mode: конфигурация «проталкивается» (push) с главной машины. Другие CM-системы обычно поступают наоборот – узлы «тянут» (pull) конфигурацию с главной машины.

Этот режим интересен потому что вам не нужно иметь публично доступную главную машину для удаленной настройки узлов; это узлы должны быть доступны (позже мы увидим, что скрытые узлы также могут получать конфигурацию).

Что нужно для Ansible

Необходимы следующие Python-модули

На Debian/Ubuntu запустите:

У вас также должна быть пара ключей в

Установка Ansible

Из исходников

Ветка devel всегда стабильна, так что используем ее. Возможно, вам нужно будет установить git ( sudo apt-get install git на Debian/Ubuntu).

Теперь можно загрузить окружение Ansible.

Из deb пакета

В этом пособии предполагается, что вы использовали именно этот способ.

Установка Vagrant

Vagrant позволяет с легкостью создавать виртуальные машины и запускать их на VirtualBox. Vagrantfile идет в комплекте с пособием.

Чтобы запустить Vagrant вам нужно установить:

и налейте себе кофе (если вы используете vagrant-hostmaster, то вам нужно будет ввести root-пароль). Если что-то пошло не так, загляните в туториал по Vagrant’у.

Добавление SSH-ключей на виртуальной машине

Чтобы продолжить, вам нужно добавить свои ключи в authorized_keys root’а на виртуальной машине. Это не обязательно (Ansible может использовать sudo и авторизацию по паролю), но так будет намного проще.

Ansible идеально подходит для этой задачи, поэтому используем его. Однако, я не буду пока ничего объяснять. Просто доверьтесь мне.

В качестве пароля введите vagrant. Если возникнут ошибки «Connections refused», то проверьте настройки фаервола.

Теперь добавьте свои ключи в ssh-agent ( ssh-add ).

Inventory

Мы создали такой файл inventory:

ansible_ssh_host это специальная переменная, которая содержит IP-адрес узла, к которому будет создаваться соединение. В данном случае она не обязательна, если вы используете gem vagrant-hostmaster. Также, вам нужно будет менять IP-адреса если вы устанавливали и настраивали свою виртуальную машину с другими адресами.

ansible_ssh_user это еще одна специальная переменная которая говорит Ansible’у подключаться под указанным аккаунтом (юзером). По умолчанию Ansible использует ваш текущий аккаунт, или другое значение по умолчанию, указанное в

Проверка

Теперь когда Ansible установлен, давайте проверим, что все работает:

Здесь Ansible попытается запустить модуль ping (подробнее о модулях позже) на каждом хосте. Вывод должен быть примерно таким:

Отлично! Все три хоста живы и здоровы, и Ansible может общаться с ними.

Общение с узлами

Сделаем что-нибудь полезное

Модуль shell

Этот модуль позволяет запускать shell-команды на удаленном узле:

Вывод должен быть вроде:

Модуль copy

Модуль copy позволяет копировать файл из управляющей машины на удаленный узел. Представим, что нам нужно скопировать наш /etc/motd в /tmp узла:

Ansible (точнее, модуль copy, запущенный на узле) ответил кучей полезной информации в формате JSON. Позже мы увидим, как это можно использовать.

У Ansible есть огромный
список модулей, который покрывает практически все, что можно делать в системе. Если вы не нашли подходящего модуля, то написание своего модуля – довольно простая задача (и не обязательно писать его на Python, главное, чтобы он понимал JSON).

Много хостов, одна команда

Все что было выше – замечательно, но нам нужно управлять множеством хостов. Давайте попробуем. Допустим, мы хотим собрать факты про узел и, например, хотим узнать какая версия Ubuntu установлена на узлах. Это довольно легко:

all означает «все хосты в файле inventory». Вывод будет примерно таким:

Больше фактов

Вывод был сокращен для простоты, но вы можете узнать много интересного из этой информации. Вы также можете фильтровать ключи, если вас интересует что-то конкретное.

Заметьте, что узлы ответили не в том порядке, в котором они отвечали выше. Ansible общается с хостами параллельно!

Выбор хостов

Мы видели, что all означает «все хосты», но в Ansible есть
куча иных способов выбирать хосты:

Группировка хостов

Можно даже сократить:

Если хотите задавать дочерние группы, используйте [groupname:children] и добавьте дочерние группы в него. Например, у нас есть разные дистрибутивы Линукса, их можно организовать следующим образом:

Установка переменных

Вы можете добавлять переменные для хостов в нескольких местах: в файле inventory, файлах переменных хостов, файлах переменных групп и др.

Ansible будет искать файлы по имени. Например, при использовании упомянутого ранее файле inventory, Ansible будет искать переменные host0.example.org в файлах:

Если этих файлов не существует – ничего не произойдет, но если они существуют – они будут использованы.

Теперь, когда мы познакомились с модулями, инвентаризацией и переменными, давайте, наконец, узнаем о настоящей мощи Ansible с плейбуками.

Плейбуки Ansible

Пример с Apache (a.k.a. «Hello World!» в Ansible)

Продолжаем с допущением, что ваш файл inventory выглядит так (назовем его hosts ):

и все хосты — это системы на основе Debian.

Заметка: помните, что вы можете (и в нашем упражнении мы делаем это) использовать ansible_ssh_host чтобы задать реальный IP-адрес хоста. Вы также можете изменять inventory и использовать реальный hostname. В любом случае, используйте машину, с которой безопасно экспериментировать. На реальных хостах мы также добавляем ansible_ssh_user=root чтобы избежать потенциальных проблем с разными конфигурациями по умолчанию.

Нам всего лишь нужно сказать, что мы хотим сделать, используя правильные модули Ansible. Здесь мы используем модуль apt, который может устанавливать пакеты Debian. Мы также просим этот модуль обновить кэш.

Нам нужно имя для этой задачи. Это не обязательно, но желательно для вашего же удобства.

Ну, в целом было довольно легко! Теперь можно запустить плейбук (назовем его apache.yml ):

При запуске команды будет вывод подобный этому:

Давайте проанализируем вывод строчка за строчкой.

Наконец, Ansible выводит выжимку того, что произошло: две задачи были выполнены, и одна из них изменила что-то на хосте (это была наша задача apache; модуль setup ничего не меняяет).

Давайте запустим это еще раз и посмотрим, что произойдет:

Улучшаем набор apache

Мы установили apache, давайте теперь настроим virtualhost.

Улучшение плейбука

Нам нужен лишь один виртуальный хост на сервере, но мы хотим сменить дефолтный на что-то более конкретное. Поэтому нам придется удалить текущий virtualhost, отправить наш virtualhost, активировать его и перезапустить apache.

Давайте создадим директиорию под названием files и добавим нашу конфигурацию для host1.example.org, назовем ее awesome-app :

Теперь небольшое обнуление плейбука и все готово:

Круто! Ну, если задуматься, мы немного опережаем события. Не нужно ли проверить корректность конфигурации перед тем, как перезапускать apache? Чтобы не нарушать работоспособность сервиса в случае если конфигурация содержит ошибку.

Перезапуск в случае ошибки конфигурации

Мы установили apache, изменили virtualhost и перезапустили сервер. Но что, если мы хотим перезапускать сервер только когда конфигурация корректна?

Откатываемся, если есть проблемы

Ansible содержит классную особенность: он остановит всю обработку, если что-то пошло не так. Мы используем эту особенность чтобы остановить плейбук, когда конфигурация не валидна.

Давайте изменим файл конфигурации виртуального хоста awesome-app и сломаем его:

Как я сказал, если задача не может исполниться, обработка останавливается. Так что нужно удостовериться в валидности конфигурации перед перезапуском сервера. Мы также начнем с добавления виртуального хоста до удаления дефолтного виртуального хоста, так что последующий перезапуск (возможно, сделанный напрямую на сервере) не сломает apache.

Нужно было сделать это в самом начале. Так как мы уже запускали этот плейбук, дефолтный виртуальный хост уже деактивирован. Не проблема: этот плейбук можно использовать на других невинных хостах, так что давайте защитим их.

Как вы заметили, apache2ctl возвращает код ошибки 1. Ansible видит это и останавливает работу. Отлично!

Ммм, хотя нет, не отлично… Наш виртуальный хост все равно был добавлен. При любой последующей попытке перезапуска Apache будет ругаться на конфигурацию и выключаться. Так что нам нужен способ отлавливать ошибки и возвращаться к рабочему состоянию.

(прим. переводичка: хабраюзер @clickfreak в комментариях советует взлянуть на специальную фичу Ansible 2.x).

Использование условий

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

Возврат при проблемах

Как было сказано ранее, если задача не может исполниться – обработка останавливается… но мы можем принять ошибку (и нам нужно это делать). Так мы и поступим: продолжим обработку в случае ошибки, но только чтобы вернуть все к рабочему состоянию.

Кажется, все работает как нужно. Давайте попробуем перезапустить apache:

Теперь наш Apache защищен от ошибок конфигурации. Помните, переменными можно пользоваться практически везде, так что этот плейбук можно использовать для apache и в других случаях. Напишите один раз и пользуйтесь везде.

Деплоим сайт с помощью Git

Мы установили Apache, добавили виртуальный хост и безопасно перезапустили сервер. Теперь давайте используем модуль git чтобы сделать деплой приложения.

Модуль git

но в Ansible есть способ лучше. Он может проходить по набору элементов и использовать каждый в определенном действии, вот так:

Строка tags: deploy позволяет запустить определнную порцию плейбука. Допустим, вы запушили новую версию сайта. Вы хотите ускорить процесс и запустить только ту часть, которая ответственна за деплой. Это можно сделать с помощью тегов. Естественно, «deploy» — это просто строка, можно задавать любую. Давайте посмотрим, как это можно использовать:

PLAY [web] *****

GATHERING FACTS *****
ok: [host1.example.org]

TASK: [Deploy our awesome application] *****
changed: [host1.example.org]

PLAY RECAP *****
host1.example.org: ok=2 changed=1 unreachable=0 failed=0

Добавляем еще один веб-сервер

У нас есть один веб-сервер. Мы хотим два.

Обновление inventory

Мы ожидаем наплыва трафика, так что давайте добавим еще один веб-сервер и балансировщик, который мы настроим в следующем шаге. Давайте закончим с inventory:

Помните, здесь мы указываем ansible_ssh_host потому что хост имеет не тот IP, что ожидается. Можно добавить эти хосты к себе в /etc/hosts или использовать реальные имена (что вы и будете делать в обычной ситуации).

Сборка второго веб-сервера

Мы не зря напрягались перед этим. Деплой второго сервера очень прост:

Теперь у нас есть чудесная ферма веб-серверов, давайте превратим ее в кластер с помощью балансировщика нагрузок.

Шаблоны

Шаблон конфигурации HAProxy

Ansible использует Jinja2, систему шаблонов для Python. Внутри Jinja2-шаблона можно использовать любую переменную, которая определена Ansible’ом.

Jinja2 также поддерживает условия, циклы и прочее.

Тут есть несколько новых для нас деталей.

Во-первых, << ansible_eth1['ipv4']['address'] >> заменится на IP балансировщика нагрузки на eth1.

HAProxy playbook

Самое сложное позади. Написать плейбук для устновки и конфигурации HAproxy очень легко:

А теперь… попробуем. В нашем inventory содержатся только необходимые для кластера хосты, поэтому нам не нужно делать дополнительных ограничений и можно даже запустить оба плейбука. Ну, на самом деле, нам нужно запускать их одновременно, так как haproxy-плейбуку нужны факты из двух веб-серверов. Чуть позже мы узнаем, как избежать этого.

Вроде все хорошо. Зайдите на http://192.168.33.10/ и оцените результат. Кластер задеплоен! Можно даже посмотреть на статистику HAproxy: http://192.168.33.10/haproxy?stats.

Снова переменные

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

Тонкая настройка конфигурации HAProxy

Обычно HAProxy проверяет, живы ли бэкенды. Если бэкенд не откликается, то он удаляется из пула, и HAProxy больше не шлет ему запросы.

У бэкэндов может быть указан вес (от 0 до 256). Чем выше вес, тем больше запросов сервер получит по сравнению с другими серверами. Это полезно, когда узлы отличаются по мощности и нужно направить трафик в соответствии с этим.

Мы используем переменные для настройки этих параметров.

Group-переменные

Интервал проверки haproxy будет задан в файле group_vars. Таким образом, все экземпляры haproxy унаследуют это.

Название переменной может быть любым. Естественно, рекомендуется давать осмысленные названия, но каких-то специальных правил нет. Можно делать даже комплексные переменные (то есть Python dict) вот так:

Это дело вкуса. Такой подход позволяет делать логическую группировку. Мы пока будем использовать простые переменные.

Переменные хоста

и для host_vars/host2.example.com :

Обновляем шаблон

Теперь необходимо обновить шаблон, чтобы он использовал эти переменные.

Имейте ввиду, что такой метод очень плох с точки зрения безопасности!

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

Мигрируем к ролям!

Теперь, когда все плейбуки готовы, давайте все отрефакторим! Мы переделаем все через роли. Роли — это просто еще один способ организации файлов, но у них есть несколько интересных возможностей. Не будем вдаваться в детали, все они описаны в
документации Ansible. Моя любимая фича — это зависимости ролей: роль B может зависеть от другой роли A. Поэтому при применении роли B, автоматически будет применена роль A.

Структура ролей

Роли добавляют немного «магии» в Ansible: они предполагают особую организацию файлов. Роли полагается структурировать определенным образом, хотя вы можете делать это как угодно вам. Тем не менее, если придерживаться соглашений, вам будет гораздо легче создавать модульные плейбуки. Содержать код в порядке будет гораздо легче. Рубисты называют это «convention over configuration».

Структура файлов для ролей такая:

Файлы main.yml не обязательны. Но если они присутствуют, то роли добавят их к отработке автоматически. Эти файлы можно использовать для добавления других тасков и хэндлеров.

Создаем роль Apache

Теперь у нас достаточно знаний, чтобы создать роль для apache на основе нашего плейбука.

Несколько простых шагов:

Задаем структуру

Мы также убрали обращения к директориям files/ и templates/ в тасках. Так как используется стандартная структура ролей, Ansible сам знает, в какие директории смотреть.

Выносим хэндлер

Нужно создать файл step-12/roles/apache/handlers/main.yml :

Переносим файл конфигурации

Роль apache работает. Но нам нужен способ запустить ее.

Создаем плейбук роли

Совсем не сложно. Теперь давайте создадим роль haproxy:

Если все хорошо, то мы увидим «PLAY RECAP»:

Вы наверное заметили, что запуск всех ролей в site.yml занимает много времени. Что если нужно сделать изменения только для веб-серверов? Легко! Используем limit-флаг:

На этом миграция на роли закончена.

(От переводчика: в оригинальном пособии в будущем появится еще как минимум одна глава. Я добавлю ее в эту публикацию или создам новую).

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *