Доброе время суток! В данном посте я хочу рассказать как с помощью инструмента Sparrow лёгко и просто писать собственные обёртки к существующим скриптам и утилитам, а так же зачем вам это может понадобиться.
Очень часто мы имеем дело с различными скриптами, которые нам приходится запускать для разных задач и на разных серверах. Эти скрипты могут быть написанными нами самими же или устанавливаться как часть пакетов программного обеспечения. Так или иначе очень часто задача сводится к тому, что нужно просто запустить некий скрипт с набором параметров:
script <arguments>
Основной трудностью здесь может быть то, что аргументы скрипта могут быть достаточно развесистыми и сложными, и при этом, в зависимости от контекста задачи, ещё и разными. Это порождает ряд неудобств, конечно не таких критичных, но тем не менее о которых хочется упомянуть:
Приходится каждый раз вспоминать ( или искать в history ) аргументы передаваемые на вход скрипту, если запускаешь скрипт вручную.
- Если прописываешь запуск скрипта в крон, то, в случае с большим количеством аргументов, записи получаются сложные, и, как следствие, тяжело читаемые и редактируемые, легко ошибиться при очередной правке вручную.
Итак, здесь нас могут выручить скрипты-обёртки, которые будут инкапсулировать все, что связанно с логикой подготовки входных параметров для заданной скрипта, а затем запускать данный скрипт с данными параметрами.
Вместо того, что бы писать свои скрипты-обёртки можно воспользоваться инструментом Sparrow, и я покажу сейчас как легко и просто это можно сделать.
Установка Sparrow
Sparrow — это CPAN модуль, поэтому ставим его соответственно:
$ cpanm Sparrow
Выбор скрипта, для которого будем писать обёртку
Так как это обучающая статья — выберу любой скрипт, в чисто ознакомительных целях, в реальной жизни, это будет скрипт или скрипты, которые вы используете в своей работе. Пусть это будет утилита speedtest-cli, предназначенная для тестирования скорости интернета на вашем локальном узле. Судя по документации, у скрипта достаточное большое количество настроек, задаваемых через аргументы командной строки — как раз тот самый случай, когда обёртка может быть уместна. Представим себе что мы хотим запускать данный скрипт по крону и отсылать отчёты что бы анализировать доступность интернета в течение определённого периода времени. Пердположим, на. интересуют два варианта вызова скрипта:
speedtest-cli --no-download # не выполнять тест скачивания
и
speedtest-cli --no-upload # не выполнять тест закачивания
И в обоих случаях мы хотим всегда добавлять опцию
--bytes # выводить информацию в отчёте в байтах, а не в битах
Также, допустим что в первом случае мы хотим указать тайм-аут ожидания при http запросах:
--timeout 10 # http тайм-аут
Хорошо, таким образом, у нас есть два отдельных запуска скрипта speedtest-cli с различными параметрами.
Написание скрипта-обёртки в виде Sparrow плагина
Создаём скрипт-историю:
$ nano story.bash
speedtest-cli $(args_cli)
В данном случае всю работу делает предопределённая в Sparrow bash функция args_cli, котороя прозрачно передаст на вход скрипта speedtest-cli все входные параметры.
Определяем загрузчик утилиты speedtest-cli. Sparrow умеет ставить зависимости для скриптов, поддерживая ряд пакетных менеджеров, определённых для различных языков программирования, в том числе для Python. Утилита speedtest-cli ставится как pip модуль, так что просто определим файл зависимостей в стиле установщика pip:
$ nano requirements.txt
speedtest-cli==1.0.6
Хорошо, идём дальше, осталось определить файл с мета данными плагина и собственно загрузить его в репозиторий Sparrow плагинов:
$ nano sparrow.json
{
"name" : "speedtest-cli",
"description" : "Simple wrapper for speedtest-cli from https://github.com/sivel/speedtest-cli",
"version" : "0.0.1",
"url" : "https://github.com/melezhik/sparrow-plugins/tree/master/speedtest-cli",
"category": "utilities",
"python_version" : 2,
"sparrow_version": "0.2.45"
}
Формат файла мета данных для Sparrow плагина подробно описан в документации по Sparrow, здесь мы его разбирать не будем, нам важно лишь то, что плагин называется аналогично скрипту, для которого он предоставляет обёртку.
Теперь у нас все готово, что бы загрузить плагин в репозитарий:
$ sparrow plg upload # запускаем из дериктории где лежат файлы плагина
Настройка Sparrow задач для запуска скрипта-обёртки
Здесь собственно начинается самое интересное. Это то, как мы будем использовать созданный нами плагин для запуска утилиты speedtest-cli, описанной ранее.
Допустим, мы хотим запускать данную утилиту на другом сервере. Не трудно догадаться, что сначала нам необходимо установить соответсвующий Sparrow плагин:
$ sparrow plg install speedtest-cli
Если все пройдёт успешно мы получим установленный Sparrow плагин и собственно саму утилиту speedtest-cli вместе со всеми Python зависимостями.
Сделаем простую поверку, что плагин работает:
$ sparrow plg run speedtest-cli -- --help
Если все хорошо, то мы получим help от утилиты speedtest-cli.
Что бы связать запускаемый плагин с определёнными параметрами создадим задачи. Вспоминаем, что нам требуется запускать speedtest-cli с разными аргументами.
$ sparrow project create monitoring # создадим проект - это контейнер для задач
$ sparrow task add monitoring nettest-download speedtest-cli
$ sparrow task add monitoring nettest-upload speedtest-cli
Последними двумя командами мы создали задачи для разных запусков утилиты speedtest-cli, теперь настроим их:
$ sparrow task ini monitoring/nettest-download
---
args:
- timeout: 10
-
- bytes
- no-upload
$ sparrow task ini monitoring/nettest-upload
---
args:
-
- bytes
- no-download
Теперь нам просто остается запустить наши задачи:
$ sparrow task run monitoring/nettest-upload
$ sparrow task run monitoring/nettest-download
Наши обёртки готовы и работают как надо.
Заключение
Sparrow позволяет легко и просто писать обёртки для практически любых консольных утилит. Это избавляет от необходимости писать отдельные скрипты для запуска одной и той же утилиты с различными параметрами, для этого есть простой и мощный инструмент Sparrow задач. Sparrow плагины переносимы практически на любой Linux сервер, где установлен Perl. Также настройка скриптов в стиле Sparrow подразумевает генерацию входных данных в форматах YAML и JSON, что сильно упрощает запуск подобных скриптов из любых современных языков программирования и делает их автоматизацию более простой. Для примера можно посмотреть проект Sparrowdo, который позволяет настраивать и запускать Sparrow задачи удалённо по ssh.
Ссылки по теме
- код плагина speedtest-cli — https://github.com/melezhik/sparrow-plugins/tree/master/speedtest-cli
- страница плагина в репозитории SparrowHub — https://sparrowhub.org/info/speedtest-cli
- документация по Outthentic — фреймворка по разработке скриптов, который используется при написании Sparrow плагинов — https://github.com/melezhik/outthentic
- документация по Sparrow — менеджере сценариев — https://github.com/melezhik/sparrow
С уважением, Алексей Мележик, автор Sparrow
Комментарии (3)
alexey_melezhik
22.07.2017 22:51Насчёт быстрее — это, на мой взгляд, вопрос спорный, но главное даже не это.
Здесь смысл больше в том, что подход, описаный в статье избавляет вас от необходимости для каждой отдельной конфигурации писать свой скрипт-обёртку, вы просто создаёте очередную задачу, в которой описываете все параметры, а плагин ( фактически вызываемый скрипт ) у вас всегда остаётся один и тот же. Фактически это такой паттерн, когда вы отделяете входные данные от самого скрипта. В случае когда вы не используете обертку, а просто вызываете скрипт с набором параметров, это тоже так, но тогда вы можете упереться в те, проблемы, о которых я сказал в начале статьи — когда входных параметров очень много и они сложные.
И потом достаточно удобно когда входные параметры описываются в виде структуировнных данных типа json или yaml это может быть удобно когда вы хотите вызвать скрипт с какими-то параметрами из обычной программы.
Krebs
Намного быстрее самостоятельно написать два скрипта обёртки, чем мутить с дополнительным костылём и кучей конфигов.
alexey_melezhik
Извиняюсь, ответил отдельным тредом…