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 убедимся, что интерфейс доступен:


image


Запуск sparrow сценариев


Список выполненных задач пока пуст. Давайте запустим несколько задач, используя репозитарий со сценариями. Например проверим, что у нас достаточно места на диске:


$ cat df-check/sparrowfile

use v6;

use Sparrowdo;

task_run  %(
  task => 'check my disk',
   plugin => 'df-check',
   parameters => %(
     threshold => 70
  )
);

image


Запущенная задача добавляется в очередь задач, о чем нас уведомляют.


image


Выполнение задач происходит асинхронно. Что бы задачи попавшие в очереди начали выполнятся необходимо запустить обработчик задач ( это можно было сделать еще в самом начале установке перед запуском сервиса, просто в момент написания статьи я забыл об этом :)


$ cd sparrowup
$ nohup carton exec ./app.pl minion worker &

Приложение SparrowUP написано на фреймворке Mojolicious и в качестве шедулера задач как следствие используется модуль Minion — все кому интересно могут обратится к документации для знакомства с данными инструментами.


Окей, спустя какое-то время шедулер начнет выполнять задачу:


image


image


И мы сможем увидеть результат в виде SparrowUP отчета:


image


А вот как, например, будет выглядеть отчет сценария 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'
 )

);


image


Заметим, что запуск новой задачи возможен и программным способом посредством 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 В конце статьи традиционно опрос, напрямую не касающийся основного топика.

какую систему мониторинга вы используете?

Проголосовало 14 человек. Воздержалось 4 человека.

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

Поделиться с друзьями
-->

Комментарии (2)


  1. fkvf
    31.07.2016 21:51

    По поводу опроса. Нужны чекбоксы. Я использую zabbix, но нахожусь в состоянии перехода на sensu(+graphite +grafana)


  1. alexey_melezhik
    01.08.2016 12:43

    да, я вас понял. к сожалению опрос поменять не уже могу.