Здравствуйте. В течение этого года я написал ряд статей о Sparrow — системе управления пользовательскими скриптами. В конце года я хотел бы сделать своего рода результирующий пост, где еще раз попытаюсь описать основную суть этого инструмента.
Итак, что же такое Sparrow? Если не вдаваться в различные варианты использование данной системы, Sparrow позволяет быстро разрабатывать, настраивать и запускать пользовательские скрипты.
Приведу конкретный пример. В моей работе мне приходится часто заходить на множество серверов и делать там что-то, что называется руками. При этом хочется что бы окружение для моего акаунта было если не таким же, то сильно похожим на то, с чем я имею дело на собственной машине. Вот что имею ввиду:
- список установленных пакетов, которые часто требуется мне в работе — например tree, curl, nano, git, mc
- определенная настройка для редактора nano
- определенная настройка для клиента git
И так далее. Список подобного рода мелочей у каждого может быть свой. Все это, конечно можно настраивать и устанавливать вручную, как говорится не "rocket science", но во-первых, нужно каждый раз вводить кучу команд и лезть в документацию, что бы правильно настроить софт. Во-вторых, вы можете банально что-то забыть или упустить, ведь сложно держать все в голове. Все это требует времени и сил. Итак, ни для кого не открою здесь aмерики, нужна обычная автоматизация.
Окей. Сразу же предвижу здесь комментарии вида, а почему бы не использовать для такого рода задач какой-нибудь chef или ansible. На это у меня есть ряд мыслей, вот они:
- Chef или Ansible хороши для решения задач промышленного масштаба, когда у вас есть много серверов и типовая, хорошо организованная инфраструктура, которую легко выразить через (cook/play)буки.
- Если у вас есть кастомные, личные скрипты, которые, по сути, устраивают вас и вы не хотели бы их превращать в универсальные решения — то решения типа chef или ansible уже может быть своего рода перебором.
- Так же нельзя забывать, что тот же chef в своем стандартном workflow требует серверной части и правильно настроенного шеф клиента ( регистрация ноды ) — согласитесь уже многовато для решения задачи типа — установить редактор nano или настроить конфиг git клиента.
- И, наконец, порой у вас уже есть готовый и устраивающий вас bash скрипт, который вы хотите просто запустить на целевом сервере, при этом совершенно не желая превращать его chef cookbook или ansible playbook и совершать дополнительные "телодвижения", связанные с портированием вашего кода ( что, кстати не всегда гладко для обычных bash/shell скриптов — но этом тема для отдельного поста ) в экоситемы данных инструментов.
- Все это наводит на мысль, что нужно простое, но при этом достаточное гибкое решение позволяющее ( разрабатывать и ) распространять пользовательские скрипты на различные машины. Так появилась идея Sparrow и репозитария пользовательских сценариев SparrowHub. Подробно об этом я писал* в том числе на Хабре.
(*) пост слегка устарел относительно текущей реализации Sparrow, но основная суть там отражена.
Итак, если резюмировать основные особенности Sparrow, можно сказать следующее:
Sparrow — это оркестратор пользовательских сценариев, позволяющий разрабатывать, распространять и управлять разнообразными скриптами, упакованными и настраиваемыми унифицированным способом.
Таким образом, скрипты загружаются в единый репозитарий, имеют автора, версию и документацию, все это аналогично любой системе распространения пакетов, такой как apt/debian или CPAN/Perl.
Sparrow предоставляет консольный клиент позволяющий искать (индекс репозитария) и устанавливать и запускать скрипты.
Установка скриптов может происходить по последней или заданной версии. Вообще, версионность скриптов поощряет их использование в команде, когда разработчик может вносить очередные изменения в скрипт, выкладывая его с новой версией в репозитарий, при этом пользователи в случае нарушения обратной совместимости всегда могут "откатиться" к предыдущим версиям скрипта. Также упрощается процесс отслеживания изменений в скрипте, когда, зная версию, вы всегда можете посмотреть в changelog файле, что же обновилось за последнее время.
В случае с приватными скриптами, когда вы не хотели бы выкладывать их в публичный доступ ( режим работы центрального репозитария ), Sparrow позволяет устанавливать скрипты, размещенные на удаленных git репозитариях ( так называемые private sparrow plugins ).
Sparrow в некоторой степени — language agnostic система. Скрипты, загружаемые в репозитарий SparrowHub могут писаться на одном из трех языков:
- Perl
- Ruby
- Bash
Для любого из данных языков реализован Sparrow API позволяющий удобным способ настраивать скрипты и организовать многосценарные программы ( то что в Sparrow называется модули ), так же не зависимо от языка написания сценария вы получаете достаточно мощный DSL по верификации выходного потока (stdout) запускаемых скриптов, что делает Sparrow очень привлекательным для написания скриптов тестирования, мониторинга и аудита. ( В качестве одного из примеров посмотрите проект — minoca-pkg-test — тестирования собранных пакетов в операционной системе Minoca OS ). Об всем об этом можно подробно почитать в документации по модулю Outthentic, реализующим среду разработку Sparrow скриптов.
- Сам Sparrow написан на Perl и ставится как CPAN модуль. У него очень небольшой overhead по зависимостям, что делает достаточно простым в установке.
Это основные, но не все характеристики экосистемы Sparrow, далее что бы пост не получился чересчур теоретичным, приведу типичные варианты использования данного инструмента, это конечно даже не введение, но поможет уловить суть того, как работает Sparrow.
Установка Sparrow
Ставим как обычный CPAN модуль. Так же нам потребуется curl. И на этом все.
$ cpanm --notest -q Sparrow
$ yum install curl
Забрать обновления индекса SparrowHub репозитария.
То, что вы обычно делаете выполняя команду apt-get update
в Sparrow будет выглядеть так:
$ sparrow index update
Поиск скриптов
Теперь, обновив индекс, можно поискать скрипты, которые в Sparrow называются плагинами. Например, мне нужно все что относится к редактору nano:
$ sparrow plg search nano
Можно использовать поиск по регулярным выражениям:
$ sparrow plg search ssh.*
Установка плагинов
Ставим плагин так:
$ sparrow plg install nano-setup
Кстати, если у скрипта есть зависимости, они так же будут установлены. Sparrow поддерживает объявление и установку зависимостей через cpanfile для Perl и Gemfile для Ruby.
Как уже говорилось можно поставить плагин по требуемой версии:
$ sparrow plg install nano-setup --version 0.1.2
Запуск плагина
Установив плагин, мы можем его запустить. Вот, например как я настраиваю nano-rc файл:
$ sparrow plg run nano-setup
В зависимости от плагина мы можем передать ему на вход различные параметры:
$ sparrow plg run nano-setup --param tabsize=2 --param speller='hunspell -x -c'
Или же, если мы планируем запускать плагин не один раз, и/или параметров много, мы можем создать задачу, в которой определяем параметры запускаемого плагина, например вот так можно создать задачу по поиску ошибок вида 500 в логе nginx, используя плагин logdog:
$ sparrow plg install logdog
# проект - это просто контейнер для задач
$ sparrow project create nginx
# задача имеет имя и связанный с ней плагин
$ sparrow task add nginx 500-errors logdog
# теперь мы настраиваем задачу:
$ sparrow task ini nginx/500-errors
<logdog>
file /var/log/nginx/access.log
time_pattern \[(\d+\/\S+\/\d+):(\S+)
time_format %d/%b/%Y %T
history 5 minutes
timezone Europe/Moscow
filter HTTP\/\S+?"\s+500\s
key_field (\S+)
density 3
check_mode report
</logdog>
Теперь мы можем запустить задачу с заданными параметрами:
$ sparrow task run nginx/500-errors
Или же переопределить некоторые параметры в момент запуска:
$ sparrow task run nginx/500-errors --param logdog.density=10 --param logdog.history="'1 weeks'"
Если мы забыли как использовать плагин, всегда можно получить его документацию:
$ sparrow plg man nano-setup
Или же воспользоваться web интерфейсом SparrowHub найдя требуемый плагин:
https://sparrowhub.org/info/nano-setup
Публикация задач
Иногда удобно сохранить собственную задачу, чтобы воспользоваться ей позже на другом сервере. Приведу простой пример. У меня есть список пакетов, которыми я часто пользуюсь в ходе своей работе. Можно сказать, что они с большой вероятностью понадобятся при работе с новым сервером. Окей, воспользуемся плагином package-generic для установки пакетов под разные дистрибутивы.
Сначала установим плагин и создадим задачу:
$ sparrow plg install package-generic
$ sparrow project create utils
$ sparrow task add utils my-packages package-generic
$ sparrow task ini utils/my-packages
list tree mc nano hunspell git
Теперь сохраним задачу на сервере SparrowHub в моем акаунте:
$ sparrow remote task upload utils/my-packages 'my useful packages'
Теперь, зайдя на другой сервер, не мучаясь и не вспоминая список требуемых мне пакетов, просто устанавливаю их из задачи:
$ ssh new-server
$ sparrow remote task run utils/my-packages
Получить список моих удаленных задач ( remote tasks ) можно так:
$ sparrow remote task list
Можно так же сделать мою удаленную задачу публичной, что бы затем любой другой мог воспользоваться ей:
$ sparrow remote task share utils/my-packages
Теперь пользователи могут запустить мою задачу:
$ sparrow remote task run melezhik@utils/my-packages
Получить список всех доступных удаленных задач на SparrowHub можно так:
$ sparrow remote task public list
Разработка и публикация собственных плагинов — тема для отдельного топика, кому интересно может посмотреть мой пост* на Хабре об этом.
(*) публикация слегка устарела относительно текущей версии Sparrow но может быть полезна как отправная точка, далее можно обратиться к документации по среде разработки Sparrow плагинов — Outthentic или же в случае с написанием сценариев тестирования для web приложений — системе swat .
На этом пожалуй все, хотя конечно же это был беглый экскурс в систему, подробнее о всевозможных фичах Sparrow можно почитать на страницах документации.
Резюме
Итак, чем же может быть полезен Sparrow? Попытаюсь подытожить:
- быстрое сохранение собственных скриптов с целью их повторного использования вами или другими на различных серверах.
- полезный API дающий возможности "из коробки" настраивать ваши скрипты с большим набором поддерживаемых "форматов" конфигураций — INI style, Config::General, YAML, JSON, командная строка. Поддержка переопределения отдельных параметров конфигурации ( с сохранением значений по умолчанию ).
- встроенный DSL для верификации вывода скриптов позволяет легко и быстро писать различные скрипты для мониторинга, тестирования и аудита, с применением модели BlackBox тестирования.
PS: Поздравляю всех с наступающим! Успехов!
Да и в конце традиционно небольшой опросник со схожей тематикой.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (10)
VolCh
29.12.2016 14:35bash и php
alexey_melezhik
29.12.2016 14:49приветствую! это ответ на опросник? Или заявка на добавление языков в Sparrow?
Sirikid
Конечно же
POSIX sh
во имя переносимости!alexey_melezhik
Ну да, можно отнести в сторону bash ))). Надеюсь никого не обидел? )))
Sirikid
Прямо на больную мозоль… Вы из тех людей которые просто пишут
#!/bin/bash
и не заморачиваются?alexey_melezhik
нет, на самом деле я понимаю отличие
bash
отsh
. и Sparrow работает гарантированно именно с bash. А в опроснике видимо все-таки надо было указать bash/sh ?Sirikid
Есть ещё много разных шеллов, как минимум
csh
,zsh
,fish
. Последний, кстати, очень приятен в плане написания скриптов.alexey_melezhik
да, я понимаю. На самом деле Sparrow c точки зрения интеграции с другими шелами/языками очень просто расширить. Я просто пока остановился на трех языках более-менее близких мне. Будет интерес — дайте знать ( тикет в проект в гитхабе ) — добавлю новые языки.