Запуск сценариев автоматизации sparrow на удаленных серверах с помощью инструменатрия SparrowDO/SparrowUP
Sparrow — система многоцелевых сценариев, спроектированная для разработки и запуска разнообразных скриптов автоматизации. В зависимости от требуемых задач — это может быть развертывание и настройка приложений, мониторинг или тестирование северной инфраструктуры или же решение других вопросов — другими словами — выполнение любых скриптов в автоматическом режиме.
До недавнего времени запуск подобных сценариев был ограничен консольным клиентом (sparrow или sparrowdo), сегодня я бы хотел презентовать пилотный проект по автоматической установке и запуску sparrow сценариев на удаленных серверах посредством централизованного web сервиса — SparrowUP.
Установка SparrowUP
SparrowUP — это web приложение, которое ставится на отдельный сервер, с которого инициируется установка и запуск sparrow сценариев на других серверах. Транспортом в данном системе выступает ssh. SparrowUP инициирует ssh сессии в рамках которых происходит:
- установка sparrow клиента на целевом сервере (операция «bootstrap»)
- установка необходимого набора sparrow плагинов на целевом сервере
- запуск установленных плагинов с набором указанных параметров на целевом сервере (параметры запускаемых плагинов определяются в так называемом sparrow сценарии, смотрите далее)
Для того, что бы все это работало необходимо обеспечить беспарольный доступ со SparrowUP сервера на целевые сервера, так же sudo привилегии для пользователя, из под которого выполняются ssh команды.
Итак, установим SparrowUP:
Т.к. SparrowUP делегируют всю логику выполнения сценариев клиенту SparrowDO, необходимо сначала данный клиент.
В свою очередь SparrowDO написан на Perl6, поэтому сначала установим необходимые perl6* зависимости (Perl6, panda), все подробности установки описаны здесь — http://rakudo.org/how-to-get-rakudo, для экономии времени не буду приводить здесь весь цикл установки. Установив Perl6 и pandа, ставим Sparrowdo как Perl6 модуль:
$ panda install Sparrowdo
Теперь ставим web приложение SparrowUP (оно свою очередь написано на Perl5/Mojolicious):
$ git clone https://github.com/melezhik/sparrowup.git
$ cd sparrowup
$ carton
Создадим базу данных, необходимую для работы SparrowUP:
$ bash utils/populate_db.bash
Скачаем репозитарий со sparrow сценариями:
$ git clone https://github.com/melezhik/sparrowdo-test.git
Структура репозитария должна быть следующей:
project-dir/sparrowfile
project2-dir/sparrowfile
project3-dir/sparrowfile
и так далее
Таким образом, каждая папка-проект должна содержать один файл — sparrowfile с описанием sparrow сценария, формат и структура которого описаны в документации по SparrowDO. Вот как, например может выглядеть сценарий по установки CPAN пакетов Moose и DBIx: Class:
#!/usr/bin/env perl6
use v6;
use Sparrowdo;
task_run %(
task => 'cpan-package',
plugin => 'cpan-package',
parameters => %(
list => 'Moose DBIx::Class',
install-base => '/opt/lib/perl'
),
);
А вот как выглядит список проектов в репозитарий со сценариями https://github.com/melezhik/sparrowdo-test:
$ ls -1
complex
cpan-package
cpan-package2
df-check
git-base
group
nano-setup
package-generic
perl-app
proc-validate
README.md
service
templater
Далее мы должны настроить конфигурационный файл SparrowUP (/etc/sparrowup.conf), указав директорию, в которую мы зачекаутили репозиторий со сценариями и так же директорию, в которой SparrowUP будет сохранять файлы отчетов (директория должна быть доступна на запись пользователю из под которого будет запущен сервис SparrowUP), вот как это выглядит на моей машине:
$ /etc/sparrowup.conf
{
'repo' => '/home/melezhik/projects/sparrowdo-test/',
'reports_dir' => '/home/melezhik/whatsup-reports'
}
Окей, теперь можно запускать web сервис SparrowUP, для просты примера воспользуюсь обычным «nohup» (для production системы можно конечно же написать отдельный инит скрипт):
$ cd sparrowup
$ nohup carton exec morbo app.pl &
Зайдя по адресу 127.0.0.1:3000 убедимся, что интерфейс доступен:
Запуск sparrow сценариев
Список выполненных задач пока пуст. Давайте запустим несколько задач, используя репозитарий со сценариями. Например проверим, что у нас достаточно места на диске:
$ cat df-check/sparrowfile
use v6;
use Sparrowdo;
task_run %(
task => 'check my disk',
plugin => 'df-check',
parameters => %(
threshold => 70
)
);
Запущенная задача добавляется в очередь задач, о чем нас уведомляют.
Выполнение задач происходит асинхронно. Что бы задачи попавшие в очереди начали выполнятся необходимо запустить обработчик задач (это можно было сделать еще в самом начале установке перед запуском сервиса, просто в момент написания статьи я забыл об этом :)
$ cd sparrowup
$ nohup carton exec ./app.pl minion worker &
Приложение SparrowUP написано на фреймворке Mojolicious и в качестве шедулера задач как следствие используется модуль Minion — все кому интересно могут обратится к документации для знакомства с данными инструментами.
Окей, спустя какое-то время шедулер начнет выполнять задачу:
И мы сможем увидеть результат в виде SparrowUP отчета:
А вот как, например, будет выглядеть отчет сценария proc-validate, который проверяет, что процесс nginx сервер запущен в системе:
$ cat proc-validate/sparrowfile
use v6;
use Sparrowdo;
task_run %(
task => 'check my process',
plugin => 'proc-validate',
parameters => %(
pid_file => '/var/run/nginx.pid',
footprint => 'nginx.*master'
)
);
Заметим, что запуск новой задачи возможен и программным способом посредством HTTP API:
$ curl 127.0.0.1:3000/df-check -d server=127.0.0.1
Вы так же можете указывать дополнительные параметры, например, задать имя пользователя и номер порта для ssh соединения:
$ curl 127.0.0.1:3000/df-check -d server=192.168.0.1 -d ssh_user=sparrow -d ssh_port=23
Перезапуск задачи может быть осуществлен либо повторным выполнением заданного проекта для того же сервера, либо кнопкой «Reschedulle Job».
Ограничения (что еще предстоит сделать или обсудить)
операция «bootstrap» — установка sparrow клиента на целевом сервере (если клиент еще не установлен) — реализована только для серверов под управлением дистрибутива CentOS. Если заинтересует — пишите — добавлю поддержку других дистрибутивов.
нет возможности настраивать через web интерфейс SparrowUP параметры ssh соединения для различных целевых серверов, на которых запускаются sparrow сценарии, сейчас я правлю конфиг ~/.ssh/config и пробрасываю ключи (ssh-copy-id) вручную на сервере, на котором запущен SparrowUP. Не уверен, правда, что такого рода настройки вообще есть смысл вытаскивать наружу, через web интерфейс.
- сделать возможным настраивание цветовой схемы отчетов (сейчас черный фон — не самое приятное для глаз решение;)
Заключение
На этом знакомство с сервисом SparrowUP можно завершить. Спасибо за внимание!
Как обычно, жду вопросов и конструктивных замечаний.
PS Всех, кого это касается — поздравляю с днем системного администратора!
PS2 В конце статьи традиционно опрос, напрямую не касающийся основного топика.