Разработка скриптов-обёрток с помощью инструмента Sparrow

в 19:45, , рубрики: bash, bash scripting, bash-скрипт, devops (*nix), perl, perl6, pip, python, автоматизация, Разработка под Linux

Доброе время суток! В данном посте я хочу рассказать как с помощью инструмента Sparrow лёгко и просто писать собственные обёртки к существующим скриптам и утилитам, а так же зачем вам это может понадобиться.

Очень часто мы имеем дело с различными скриптами, которые нам приходится запускать для разных задач и на разных серверах. Эти скрипты могут быть написанными нами самими же или устанавливаться как часть пакетов программного обеспечения. Так или иначе очень часто задача сводится к тому, что нужно просто запустить некий скрипт с набором параметров:

 script <arguments>

Основной трудностью здесь может быть, то что аргументы скрипта могут быть достаточно развесистыми и сложными, и при этом, в зависимости от контекста задачи, ещё и разными. Это порождает ряд неудобств, конечно не таких критичных, но тем не менее о которых хочется упомянуть:

  • Приходится каждый раз вспоминать ( или искать в history ) аргументы передаваемые на вход скрипту, если запускаешь скрипт вручную.

  • Если прописываешь запуск скрипта в крон, то, в случае с большим количеством аргументов, записи получаются сложные, и, как следствие, тяжело читаемые и редактируемые, легко ошибиться при очередной правке вручную.

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

Вместо того, что бы писать свои скрипты-обёртки можно воспользоваться инструментом Sparrow, и я покажу сейчас как легко и просто это можно сделать.

Установка Sparrow

Sparrow — это CPAN модуль, поэтому ставим его соответственно:

$ cpanm Sparrow 

Выбор скрипта, для которого будем писать обёртку

Так как это обучающая статья — выберу любой скрипт, в чисто ознакомительных целях, в реальной жизни, это будет скрипт или скрипты, которые вы используете в своей работе. Пусть это будет утилита speedtest-cli, предназначенная для тестирования скорости интернета на вашем локальном узле. Судя по документации, у скрипта достаточное большоеи количество настроек, задаваемых через аргументы командной строки — как раз тот самый случай, когда обёртка может быть уместна. Представим себе что мы хотим запускать данный скрипт по крону и отсылать отчёты что бы анализировать доступность интернета в течение определённого периода времени. Пердположим на интересуют два варианта вызова скрипта:

sppedtest-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-upload

Наши обёртки готовы и работают как надо.

Заключение

Sparrow позволяет легко и просто писать обёртки для практически любых консольных утилит. Это избавляет от необходимости писать отдельные скрипты для запуска одной и той же утилиты с различными параметрами, для этого есть простой и мощный инструмент Sparrow задач. Sparrow плагины переносимы практически на любой Linux сервер, где установлен Perl. Также настройка скриптов в стиле Sparrow подразумевает генерацию входных данных в форматах YAML и JSON, что сильно упрощает запуск подобных скриптов из любых современных языков программирования и делает их автоматизацию более простой. Для примера можно посмотреть проект Sparrowdo, который позволяет настраивать и запускать Sparrow задачи удалённо по ssh.

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

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

Автор: Алексей

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js