Доброе время суток! В данном посте я хочу рассказать как с помощью инструмента 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.


Ссылки по теме



С уважением, Алексей Мележик, автор Sparrow

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

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


  1. Krebs
    22.07.2017 22:39

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


    1. alexey_melezhik
      22.07.2017 22:51

      Извиняюсь, ответил отдельным тредом…


  1. alexey_melezhik
    22.07.2017 22:51

    Насчёт быстрее — это, на мой взгляд, вопрос спорный, но главное даже не это.


    Здесь смысл больше в том, что подход, описаный в статье избавляет вас от необходимости для каждой отдельной конфигурации писать свой скрипт-обёртку, вы просто создаёте очередную задачу, в которой описываете все параметры, а плагин ( фактически вызываемый скрипт ) у вас всегда остаётся один и тот же. Фактически это такой паттерн, когда вы отделяете входные данные от самого скрипта. В случае когда вы не используете обертку, а просто вызываете скрипт с набором параметров, это тоже так, но тогда вы можете упереться в те, проблемы, о которых я сказал в начале статьи — когда входных параметров очень много и они сложные.


    И потом достаточно удобно когда входные параметры описываются в виде структуировнных данных типа json или yaml это может быть удобно когда вы хотите вызвать скрипт с какими-то параметрами из обычной программы.