Введение
Ansible модули и sparrow плагины представляют собой строительные блоки для решения простейших задач из области configuration management и автоматизации деплоя. Ansible модули пользуются в более высокоуровневых сценариях — плейбуках, написанных на языке YAML, в то время как sparrow плгагины аналогичным образом встраиваются в sparrowdo сценарии написанные на языке Perl6.
Данная статья — вольный авторский перевод собственного оригинала с английского.
Поддержка языков разработки
ansible — вы можете выбрать фактически любой язык разработки для написания модулей.
"Из коробки" ansible предоставляет продвинутый API для Python ( т.н. shortcuts ). При разработке модулей на других языках вы должны будете использовать вспомогательные библиотеки ( нативные для каждого языка ) для упрощения процесса разработки и интеграции в ansible.
sparrow — у вас есть на выбор одни из трех (*) языков — Perl5, Bash или Ruby. Для разработчика плагинов sparrow предоставляет унифицированный API ( доступный для любого из трех языков ), так же, как и в случае с ansible упрощающий процесс разработки и интеграции плагинов в систему sparrow. Данный API предоставляет только базовые возможности и не такой продвинутый как API ansible для Python.
(*) в ближайшее время планируется добавление поддержки Python.
Дизайн
ansible — ansible модули — автономные блоки программного когда ( скрипты ) для решениях элементарных задач. Ansible модули не могу зависеть или вызывать другие ansible модули.
sparrow — sparrow плагины аналогично ansible модулям — автономные, закрытые блоки кода для решения элементарных задач. Однако sparrow предоставляет дополнительную степень свободы на данном уровне разработки. Sparrow плагины представляют собой наборы (suites) скриптов. Одни скрипты могут вызывать другие, передавая им параметры. Подобного рода дизайн позволяет разбивать любую задачу на скрипты, взаимодействующие друг с другом. В качестве примера можно рассмотреть простой случай — установка и удаление пакетов ПО. Мы можем смотреть на эту задачу как на единый блок кода (скрипт), но при реализации разбить все на два скрипта: один для установки пакетов, другой — для удаления. Так же можно ввести третий скрипт, который будет разбирать входные параметры и делать диспетчеризацию вызовов (*). Такой подход подробно писан в статье Эволюция sparrow плагинов.
(*) На самом деле так реализован плагин package-generic.
Вот простая иллюстрация всего сказанного:
Интеграция в инструмент управления конфигурациями
ansible — ansible модули составная часть более высокоуровневых сценариев конфигурирования — ansible плейбуков. ansible плейбук — написанный на YAML сценарий, декларирующий вызов ansible модулей с некоторыми заданными параметрами. Такая конструкция в ansible называется задачей.
sparrow — подобно ansible модулям sparrow плагины являются составной частью
более общей системы — sparrowdo сценариев, написанных на языке Perl6. Подобно ansible — sparrowdo — система управления конфигурациями, но построенная на sparrow плагинах. Sparrow плагины вызываются с параметрами внутри sparowdo сценариев.
Интерфейс конечного пользователя
ansible — ansible модули, как уже было сказано, вызываются посредством YAML DSL кода, декларирующего запуск модулей с передаваемыми параметрами. Это происходит в плейбуках. Возможен вариант запуска модулей консольным скриптом с параметрами передаваемыми как аргументы командной строки.
Ниже приведен пример кода ansible плейбука для установки web сервера httpd посредством менеджера пакетов yum ( одноименный ansible модуль ):
$ cat playbook.yml
---
- hosts: webservers
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
sparrow — sparrow плагины вызываются внутри sparrowdo сценариев с помощью Perl6 API. Параметры плагинов передаются в виде Perl6 хэшей. Вы также можете использовать консольный клиент для запуска плагинов "как есть", минуя sparrowdo ( похожим образом как вы это можете делать ansible модули ). Это может быть удобно при разработке и отладке плагинов. В таком режиме запуска у вас появляется множество дополнительных возможностей по передачи входных параметров — командная строка, форматы JSON/YAML и Config::General
Далее приведен эквивалент предыдущего ansible плейбука для установки web сервера httpd. Приведены два варианты кода ( core-dsl и plugin API ) sparrowdo сценария:
$ cat sparrowfile
# core-dsl API более лаконичный, потому что он предоставляет
# высокоуровневые "обертки" для вызова плагинов
# но он реализован только для ограниченного набора плагинов
package-install 'httpd';
# однако, если у вас нет реализации через core-dsl
# вы всегда можете вызывать любой плагин,
# используя plugin API
# что тоже не очень сложно:
task-run 'ensure apache is at the latest version', 'package-generic', %(
list => 'httpd'
);
Передача и обработка входных параметров
ansible — входные параметры модуля передаются ввиде пар ключ=значение(*), в общем случае, при разработке модуля вы должны обеспечить парсинг параметров с целью "выделения" данных и их присваивание соответствующим переменным, с целю дальнейшего использования в коде модуля. Под разные языки разработки существуют многочисленные "хелперы", решающие эту задачу.
(*) Возможен вариант передачи вложенных структур данных.
Также как уже говорилось ansible предоставляет высокоуровневый API для Python, называемый в документации по ansible — shortcuts. Данный API позволяет автоматически парсить входные параметры, генерить аксессоры, определять типы входных параметров и делать их проверку, определять дефолтные значения и тому подобное.
Ниже приведен кусочек anible модуля, реализующий разбор входных параметров с помощью Python ansible API:
$ cat library/greetings.py
from ansible.module_utils.basic import *
def main():
fields = { "message": {"default": "Hi!", "type": "str" } }
module = ansibleModule(argument_spec=fields)
module.params['message']
# some other code here to return results
if __name__ == '__main__':
main()
sparrow — sparrow реализует унифицированный API ( доступный для любого из языков разработки ) для обработки входных параметров плагина, так что вам не приходится парсить данные вручную.
Таким образом, вне зависимости от языка, на котором вы разрабатываете плагин, вы получаете
"из коробки" API для доступа к входным данным фактически не написав ни строчки вспомогательного кода.
Также существует возможность определять дефолтные значения для параметров, в случае если последние не будут заданы явно.
Встроенная типизация и проверка параметров, как в случае с ansible Python API отсутствует.
Ниже приведен эквивалент упомянутого ansible кода, разбирающего входные параметры. В качества языка реализации плагина выбран Bash(*)
(*) что бы показать как даже на таком далеко не самом высокоуровневом языке разработки можно легко писать sparrow плагины, "не утыкаясь" в обработку входных параметров:
# это скрипт плагина
$ cat story.bash
message=$(config message)
# это параметры по умолчанию:
$ cat story.ini
message = Hi!
А вот как можно с помощью того же Bash разбирать вложенные входные параметры:
# вызов плагина в sparrowdo сценарии
$ cat sparrowfile
task-run "run my task", 'foo-plugin', %(
foo => {
bar => {
baz => 'BAZ'
}
}
);
# код плагина на Bash
# доступ к входным параметрам:
$ cat story.bash
baz=$(config foo.bar.baz)
Возвращаемые значения
ansible — ansible модули всегда возвращают результат в виде JSON строки. Причем сам JSON должен иметь специальную структуру. Подробнее об этом можно почитать на страницах документации ansible по разработке модулей.
Но вот, что хочется отметить насчет процесса возврата значений из ansible модулей:
код завершения ( скрипта реализующего молудь ) ansible модулей игнорируется
единственным требованием по возврату из модуля — наличие в STDOUT строки в формате JSON. Структура JSON ответа также должна соответствовать определенным требованиям.
таким образом, если в ответе от модуля мы не получаем валидный JSON это расценивается как ошибка
STDOUT/STDERR, генерируемый модулем не виден (*) в выводе плейбука
(*) — при определенных условиях или написав дополнительный код это вывод все же можно получить, но здесь я говорю о поведении по умолчанию
- Для того, что бы модуль вернул какое-либо значение, оно должно быть представлено в виде поля JSON структуры, которую необходимо вернуть в STDOUT
Приведу пример с модулем currenttime для возвращения текущего времени:
$ cat library/currentime.py
import datetime
import json
date = str(datetime.datetime.now())
print json.dumps({
"time" : date
})
sparrow — sparrow плагины, в отличие от ansible модулей могут возвращать все что угодно, sparrow не как не регламентирует возвращаемые плагином данные. ( Однако смотрите следующие секцию — "Обработка выходных данных").
Вот что важно знать о выходных данных с точки зрения sparrow:
код завершения плагина ( результирующий, т.к. в случае со sparrow мы можем иметь дело не с одним скриптом, а с с несколькими ) имеет значение. Если он ненулевой — это трактуется как ошибка выполнения плагина
- STDOUT, генерируемый плагином просто передается далее и виден в результирующем выводе. Никаких "перепаковываний" или фильтрации результатов, как в случае с ansible не происходит. Мы всегда видим вывод как есть, как если бы мы просто запустили аналогичный скрипт с консоли
Далее я приведу эквивалент предыдущего ansible модуля для вывода текущего времени. Будет на этот раз при написании плагина использовать Perl5, в силу всего сказано код плагина получится тривиальным:
# скрипт плагина
$ cat story.pl
print scalar localtime;
Обработка выходных данных
ansible — ansible модули всегда должны возвращать JSON, поэтому очень легко имея на выходе структурированные данные превратить их в переменные и обработать где-то "выше", на самом деле в ansible плейбуках. Хотя это и достаточно мощная фича, ее ценность в системах управления конфигурациями лично для меня является спорной. Дело в том, что к моменту (*) выполнения списка задач на целевом сервер все уже должно быть определенно в виде статического, детерминированном списка, любая попытка добавить ветвление и динамику в таком уже сформированном списке только усложняет, а не упрощает решение общей задачи — конвергенции сервера к заданному виду.
(*) здесь важно понимать, что я как раз не против динамической генерации подобных списков задач или ресурсов, как раз здесь императивный подход вполне уместен, как это происходит в случае с chef или sparrowdo. Но возможно, я не так хорошо знаю ansible что бы рассуждать каким образом данные, возвращаемые модулями используются далее в плейбуках.
Вот пример простого модуля, который просто возвращает переданный ему входной параметр, который далее "регистрируется" в плейбуке и выводится в консоль:
$ cat playbook.yml
- hosts: localhost
tasks:
- name: tell me what I say
echo:
message: "hi there!"
register: result
- debug: var=result
$ cat library/echo.py
from ansible.module_utils.basic import *
def main():
module = ansibleModule(argument_spec={})
response = {"you_said": module.params['message']}
module.exit_json(changed=True, meta=response)
if __name__ == '__main__':
main()
sparrow — как уже было сказано, sparrow "все равно" что плагин сообщает в STDOUT, нет никакой возможности использовать эти данные далее. На самом деле это не совсем так.
С точки зрения того, что эти данные никак не будут обработаны далее — это правда, но вы имеет возможность определить проверочные правила с помощью которых можно верифицировать вывод скрипта. Такое своего рода встроенное тестирование — характерная фича sparrow плагинов. Проверочные правила прописываются в виде конструкций языка Outthentic::DSL и позволяют делать различные текстовые проверки — соответствие текста различным регулярным выражением, работа с отдельными кусками текста, которые соответствуют нашим выражениям ( т.н. captures ) и многое другое. Обо всем этом можно почитать на страницах документации Outthenic::DSL.
Если верификация не пройдена это трактуется ( наряду с ненулевым кодом завершения ), как ошибка выполнения плагина.
Таким образом написание подобного рода "самотестирующихся" скриптов позволяет писать плагины не только для задач из области configuration management, но для задач тестирования, мониторинга и аудита.
Сложно построить аналогию с предыдущим ansible модулем, в силу всего сказанного, но
вот что-то приближенно "похожее", что можно сделать в sparrow. Передать плагину параметр, вывести его в STDOUT и написать проверочное правило, что бы убедится что на выходе именно то, что было на входе:
# вызов плагина в сценарии sparrowdo
$ cat sparrowfile
run-task "tell me what I say", "echo", %( message => 'hi there!' )
# реализация плагина и проверочного правила
$ cat story.bash
echo you said $(config message)
$ cat story.check
generator: config()->{message}
Процесс установки
ansible — большое количество ansible поставляются как часть ansible, они готовы к использования, вам нет необходимости каким-то особенным образом устанавливать их. Так же пользователи пишут так называемые custom модули и как правило сохраняют в какой-либо системе контроля версий — Git/Svn ( например в github или gitlab ). Далее модули в виде обычных файлов чекаутятся на мастер сервер ( тот, с которого запускают ansible задачи по ssh на целевых серверах ), опять таки же в этом случае весть деплой сводится к обычному чекауту из системы контроля версий.
Итак, экосистема модулей включает в себя две большие подсистемы:
Основной репозиторий ansible ( main ansible repository ) — модули, поставляемые вместе с ansible
- Пользовательские модули
Резюмируя можно сказать, что в ansible реализована push based схема деплоя, причем с отсутствием агента (agentless) на целевом сервере. Модули в виде файлов просто копируются на целевой сервер и уже там запускаются в виде скриптов.
Далее приводится графическая схема процесса депллоя пользовательских модулей ansible:
sparrow — в sparrow процесс деплоя немного другой. Хотя в целом там взята на вооружения та же push-based схема. Однако в случае со sparrow здесь присутствует агент ( или клиент, кому как удобнее ), который занимается установкой плагинов.
Итак, sparrow плагины не что иное как упакованные скрипты, распространяемые подобно классическим система дистрибуции пакетов ПО, таких как deb, rpm, CPAN,RubyGems.
sparrow предоставляет менеджер по установке данных плагинов, этот же менеджер используется для запуска плагинов. Менеджер должен быть предустановлен на целевом сервере, что бы все работало.
sparrowdo компилирует сценарии, размещенные на центральном (master) сервера в мета данные, которые в виде JSON файлов копируется по scp на целевые машины, далее на тех же целевых машинах менеджер, используя скопированные данные скачивает, устанавливает настраивает и, наконец, запускается sparrow плагины, результат возвращается обратно ( как и в случае с ansible ) ввиде ответа на центральный сервер.
Итак, важно понимать, что в отличие от ansible установка плагинов — это не просто копирование файлов на целевой сервер, т.к. в случае со sparrow копируются не сами плагины, а их мета информация, далее по мета информации происходит процесс фактического деплоймента.
sparrow плагины размещаются в центральном репозитарии sparrow плагинов — sparrowHub. Плагины имеют автора, версию, описание и документацию.
Вот как выглядит файл с мета информацией вышеупомянутого плагина package-generic для установки пакетов ПО:
{
"name" : "package-generic",
"version" : "0.2.16",
"description": "Generic package manager. Installs packages using OS specific package managers (yum,apt-get)",
"url" : "https://github.com/melezhik/package-generic"
}
В sparrow нет жесткого разделения на кастомные и "core" плагины. Любой плагин, загруженный в sparrowHub, становится тут же доступным пользователям системы, и, таким образом его можно использовать в sparrowdo сценариях.
По желанию пользователи могут размещать свои плагины на удаленных git репозитариях, в sparrow такие плагины называются частными (private), при этом данные плагины без труда могут быть использованы в ваших сценариях конфигурирования, наряду с плагинами со sparrowHub ( т.н. публичные плагины )
Далее приводится схема деплоймента плагинов в sparrow:
Зависимости
ansible — в ansible нет возможности управлять зависимостями ПО на уровне модулей. Скорее всего ( я на так хорошо знаю ansible, я предполагаю ) это происходит уровнем выше — в плейбуках. Таким образом, если ваш модуль зависит от какой-то библиотеки вам необходимо позаботится о разрешение зависимостей где-то в другом месте, например, вызвав установку зависимостей в другом месте плейбука.
sparrow — sparrow предоставляет штатные возможности по управлению зависимостями (*) на уровне sparrow плагина. Таким образом, если плагин зависит от каких-либо библиотек, вы можете описать данные зависимости прямо в плагине и менеджер плагинов позаботится о них
во время установки плагина. Пока управление зависимостями ограничивается модулями CPAN для Perl5 посредством файла cpanfile и модулями RubyGems для Ruby посредством файла Gemfile.
(*) — зависимости ограниченны пока CPAN для Perl5 и RubyGems для Ruby
Заключение
ansible завоевал большую популярность не в последнюю очередь благодаря большому количеству готовых модулей. Однако на мой личный взгляд процесс разработки новых модулей имеет свои недостатки и сама архитектура не является хорошим решением для некоторых задач. Я нахожу отдельные фичи sparrow более привлекательными и интересными в сравнении с ansible. Это, конечно, IMHO :), перечислю некоторые моменты:
Плейбуки против sparrowdo сценариев — sparrowdo предоставляет императивные возможности программирования конфигураций с помощью мощного и современно языка Perl6
В то время как в ansible вы ограничены возможностями чисто декларативного YAML.
- Скрипто-ориентированный дизайн — благодаря, ориентированной на использование скриптов схеме, sparrow поощряет разбиение задачи на отдельные куски и написание для каждого куска отдельного скрипта, причем сами скрипты органично взаимодействуют другом с другом, посредством, передаваемых ими другу другу параметров ( то что в sparrow называется истории-модули ) В случае с ansible, вы, как правило ограниченны схемой один модуль = один скрипт. Конечно, и в случае с ansible вы можете писать в подобном стиле ( несколько скриптов в модуле ), но ansible, конечно же, by design не приспособлен для такого рода вещей.
Итак, в практическом смысле, часто при решение задач и написании рутинных скриптов мы разбиваем проблему на несколько частей и имеем набор скриптов, взаимодействующих друг с дргуом, так почему же не привнести этот подход и сюда?
Жизненный цикл и управление модулями и плагинами — sparrow плагины еще более обособленны и отделены от самого инструмента управления конфигурациями. Как я уже говорил, sparrow плагины могу использоваться без sparrowdo. Де факто они разрабатываются, отлаживаются и хостятся и управляются вне рамок данной системы (sparrowdo) и используются в ней как черные ящики. Все это делает процесс разработки новых плагинов и их использования внутри sparrowdo еще более гибким и простым.
Bash/Shell скриптование — sparrow предоставляет лучшую, по сравнению с ansible поддержку по интеграции обычных bash/shell скриптов. В силу того, что последний налагает ограничение на возвращаемые данные и не выводит по умолчанию потоки STDOUT/STDERR, в ряде случаев становится сложно отлаживать обычные bash скрипты или понимать что идет не так. В то время как sparrow фактически прозрачно транслирует весь вывод от скриптов обратно в отчет. Также играет немалую роль игнорирование в ansible кода завершения работы скрипта, где на плечи разработчика возлагается "переопределение" ошибка на уровне возвращаемого JSON. Sparrow же в этом случае просто генерирует ошибку, действуя в конвекционном стиле выполнения unix/linux команд.
Программный API — sparrow предоставляет унифицированный интерфейс для всех языков разработки плагинов. Это значит, что фактически каждый язык из списка поддерживаемых "имеет одни и те же права" с точки зрения базового API предоставляемого системой. В то время, как модули ansible в большинстве своем пишутся на python, в силу того, что поддержка для данного языка наиболее полная ( ansible modules python API )
- Возможности тестирования — sparrow предоставляет встроенные возможности тестирования, позволяющее смотреть на этот инструмент как на универсальное средство автоматизации, которой можно использовать в том числе ( помимо перечисленных ) в задачах аудита, мониторинга и тестирования.
PS как всегда интересно услышать мнение читателя и его конструктивную критику. Традиционного опросника на этот раз не привожу, статья и так получилась объемной.
Комментарии (26)
alexey_melezhik
23.01.2017 22:43Приветствую!
Использовать YAML для разработки сценариев — это боль. Не учили видать разработчики Ansible историю, и продолжают настойчиво продвигать свою идею.
здесь согласен
Sparrow — противоположная крайность, т.е. запутанная и очень сложная, в основе которой все та же идея — не дать разработчику сценария свернуть не туда
вот здесь хочется конкретики. в чем сложность то? здесь imho все просто -
- пишем плагин на чем хотим, который решает нашу задачу.
- используем его в sparrowdo как черный ящик
- если не подходит это конкретно черный ящик — делаем другой и переходим в пункт 1
:)
как то так, по моему так просто. А вообще насколько просто кодировать конфигурации на sparrowdo/sparrow вы можете посмотреть тут — https://github.com/melezhik/sparrowdo/blob/master/core-dsl.md — это типа набор плагинов, которые вы уже можете использовать ( в обще-то их больше — полный список тут — https://sparrowhub.org/search )
alexey_melezhik
23.01.2017 22:49да и по поводу:
не дать разработчику сценария свернуть не туда
в sparrowdo как раз свернуть можно где угодно и как угодна это же просто Perl6 (высокий уровень) — полная свобода — просто код в любом стиле + строительные блоки ( плагины ) — там тоже свободы хоть отбавляй (((:
по моему так по сравнению с кодирование на YAML в стиле ansible — свобода полная ((((:
renskiy
23.01.2017 23:10+1свобода полная
Полная свобода написания каких угодно костылей — вот как я это понимаю. Польза от такого подхода весьма сомнительна.alexey_melezhik
23.01.2017 23:22давайте еще раз сформулирую.
вы изначально писали — " в основе которой все та же идея — не дать разработчику сценария свернуть не туда"
когда я вам в ответ написал, что sparrowdo/sparrow дает вам свободу, я вам всего лишь хотел донести, что данный инструмент в обще-то ничего не навязывает ( вы употребили выражение "не дать разработчику свернуть ни туда"), ну а уж как разработчик этой свободой распорядится, это в общем то него самого зависит ( опыта и знаний ) будет ли он писать костыли или же вменяемый код
но опять таки же я не вижу что sparrow/sparrowdo что-то там навязывал или форсировал кого-то к чему-то, правильнее сказать он предоставляет некий удобный набор инструментов для задач автоматизации, фреймоврк если хотите, извините, конечно же это термин в наше время сильно перегружен :))))…
renskiy
23.01.2017 23:07в чем сложность то?
Если пишем на чем хотим, то откуда взялись ограничения (Perl, Ruby, Bash)? Если бы было бы просто, то наверно таких ограничений не было бы, согласитесь?alexey_melezhik
23.01.2017 23:15вопрос понятен. давайте так сформулирую.
1) концептуально sparrow плагин может писаться на любом языке, так как это просто набор скриптов или там один скрипт, не важно
2) но unified api — некий API который попросту упрощает разработку и добавляет некоторые очень полезные функции реализован пока для Perl5, Ruby, Bash
теперь, добавление ( реализация API) для нового языка не что называется rocket sience, вот, например в ближайшее время добавлю по запросу пользователя поддержку Python, вы же кстати тоже, судя по профилю на Python пишите?
Итак у нас будет Perl5,Bash,Ruby, Python, вам еще мало? :))))))))
PS А чисто концептуально, если вы зайдете на https://sparrowhub.org — вы там прочтете — "SparrowHub — reusable automation scripts." И это на самом деле весь "концепт" — скрипты автоматизации ( на разных языках )
renskiy
23.01.2017 23:25вам еще мало?
на самом деле как раз наоборот, черезчур много. Ведь все это надо будет поддерживать — а это большая ответственность. У Ansible и без того уже давно наблюдаются проблемы с поддержкой плагинов. А кто будет поддерживать эти reusable automation scripts? Стоит ли разводить всю эту мешанину из различных способов, если потом нельзя будет точно сказать что будет работать, что уже deprecated, а что вообще уже не работает.alexey_melezhik
23.01.2017 23:35дак в этом и вся сложность проектирования любой системы, которую вы бы хотили передать в пользование другим… ну дак вот что я хочу здесь сказать — что называется by desing функции, реализованные в unified API — их немного и они очень простые, меняться там сильно нечему, sparrow более-менее уже стабилизировался, что с ним может происходить в будующем дак это добавление ( поддержка ) новых языков ( если будет потребность ) — самая спецификация, API сильно не изменится. Это первый уровень системы, скажем так базовый.
теперь если уже говорить o sparrowdo — высокуровневых сценариях на Perl6 — там все еще очень изменичиво и динамично, но это нормально, т.к. кирпичики (плагина) которыми оперирует sparrowdo с ним никак не связаны ( loosely coupled )
Такой дизайн дает нам большую гибкость с одной стороны (sparrowdo) и стабильность (sparrow)
alexey_melezhik
23.01.2017 23:40А кто будет поддерживать эти reusable automation scripts?
да и еще момент хотел прояснить в духе моего предыдущего ответа. Sparrow — очень простая по своей сути система, она просто реализует некий набор полезных функций для языков разработки сценриев, плюс предоставляет систему дистрибуции данных скритов, сценариев. Тут как раз ключевой момент, что сами скрипты ( плагины ) — пишут пользователи, пишут на том языке, какой им нравится, и решая те задачи что они хотят, да и фактически кодирая скрипты в свободном стиле. Sparrow просто своего рода клей, плюс набор очень полезных базовых функций. Вот, собсвенно и все — систем простая и не сильно связанная внутри себя
renskiy
23.01.2017 23:43вы упоминаете что скрипты используют unix way (обработка сигналов, коды возврата), неужели этого оказалось мало и понадобился отдельный unified API? Если вы избавитесь от него, то система станет намного проще и гибче, без необходимости взваливать на себя груз поддержки 72+ существующих языков программирования (72 взял с потолка).
alexey_melezhik
23.01.2017 23:56вы упоминаете что скрипты используют unix way (обработка сигналов, коды возврата), неужели этого оказалось мало и понадобился отдельный unified API?
да мало. например я хочу передавать простым способом параметры в скрипты, причем не зависимо от языка и не писать каждый раз с нуля для этого код. попробуйте например в bash скрипт передать на вход что-то типа хэша — набор вложенных параметров и потом его там распарсить. там вот sparrow это предоставляет из коробки. или еще вот пример — вам очень часто будет хотется определять некие дефотные значения для параметров, если он не заданы. Давайте добавим сюда возможность передавать входные параметры в разных форматах, не только command line, я хочу например JSON и это нормально. И я не хочу каждый раз для это писать вспомогательный код. Да и вы делали разбор JSON на bash? :)) и так далее — как видете возникают "мелочи" — но которые сильно упрощают и ускоряют разработку кода. А еще я хочу написать свой набор скриптов, запаковать его и отправить на другой сервер, что бы там это все разаработало, без шаманства. Да и это тоже sparrow умеет. И присваиание версий своим скриптам и их установка по версиям и удаление и поиск и т.д. Думаете это все мелочи? Вся правда в том, что как раз не имея под рукой решения для подобного рода вещей люди и начинают изобретать велосипеды. Я кстати уже подробно этом писал, в том числе и на хабре
alexey_melezhik
24.01.2017 00:00Если вы избавитесь от него, то система станет намного проще и гибче, без необходимости взваливать на себя груз поддержки 72+
да и тут груза то особого нет. он был бы если бы API который нужно было реализовывать был бы сложным, а, так как это всегда ( я уже говорил не раз ) — простой ( но жизненоважный ) набор функций, то его поддержка — если он и есть вобще не обремительна. Как говорится — там ломаться нечему :)))
alexey_melezhik
24.01.2017 00:14ну да, еще забыл про тестирование. я иногда хочу не просто проверить что скрипт завешился с нулевым кодом, иногда этого недостаточно. Например по регескпам или еще каким-нибудь способом проверить, ЧТО вернул это скрипт. Для написания скриптов в стиле — мониторинг или аудит или blackbox тесты — это вобще супер удобная штука. Ну дак вот в sparrow скриптах, в независимости от языка написания плагина вы можете пользоваться встроенным DSL для этого. Да и еще sparrow иттегрируется (умеет зарускать) со swat — вид sparrow плагинов для тестирвания web сервисов
alexey_melezhik
24.01.2017 00:27или вот еще кейс ( последний, хотя их может быть много ) — ближе к обычному админству. вот есть у вас замечательный скипт, но только с очень сложным набором входных параметров, и вы хотите запускать его в зависимости от задачи каждый разными парамтрами. и вот что бы все это не держать в голове и не полагаться на файл history вы просто биндите набор параметро на скрипт — в sparrow это называется задача. очень удобно. черех пару недель, когда вы уже забыли какие параметры нужны скрипту, вы просто запусаете эту задачу. очень удобно, проверено на опыте. да и еще задачи можно группировать, удобно когда их много.
просто, как видите порой все не укладываетя в один exit code :))))
ls1
24.01.2017 12:07+1Более интереснее почитал бы статью про Ansible 2.x vs Ansible 1.x
alexey_melezhik
24.01.2017 12:27тут, не помогу. я конечно не эксперт в Ansible, но при сравнение со Sparrow старался брать общие вещи, которые не сильно менялись при обновлениях в Ansible. Хотя может что-то и упустил.
nightvich
24.01.2017 17:05Коллеги, что за сценарии на YAML вы пишете, что они вам доставляют боль?
Поясните пожалуйста.
alexey_melezhik
24.01.2017 17:41Приветсвую! Я лично на yaml сценариев не пишу :)… вопрос для меня больше в том что yaml чисто декларативный язык, создавать на нем императивные конструкции типа условных операторов или циклов очень неудобно, если и возможно. А в сценариях по управлению конфигурациями данные конструкции очень упрощают жизнь. Вот как то так.
Spigello
26.01.2017 12:46Здравствуйте. Вопрос относится к sparrowDO. Несколько раз вы говорили про CoreDSL и PluginDSL для него. Насколько я понял, разница лишь в самом синтаксисе в sparrowfile. Т.е. в первом случае создается json и кидается на целевой хост, который исполняется клиентом, во втором — параметры передаются напрямую. Но в sparrowDO есть еще и модули, судя по документации. Кроме того, что они пишутся на perl6, особо не понятно, зачем они нужна. Фраза
They implemented in terms of sparrowdo tasks ( relying on sparrowdo API ) rather then with sparrow tasks.
особо ничего не дает. Что за sparrowdo API?alexey_melezhik
26.01.2017 13:37Но в sparrowDO есть еще и модули, судя по документации.
Да, модули — это можно сказать третья сущность в sparrowdo ( наряду с core-dsl и task-run ). На самом деле вот что такое sparrowdo модули
- во-первых это обычные Perl6 модули ( примеры на modules.perl6.org — https://modules.perl6.org/#q=sparrow )
- во вторых модуль должен реализовать функцию tasks — которая как правило просто вызывает одну или несколько функций task-run — все это сильно похоже как реализованы функции core-dsl
- в третьих вы можете инклюдить готовый модуль в своем sparrowdo сценарии и запускать его как
module_run 'module-name' %parameters
Параметры
%parameters
просто передадутся в реализованную в модуле функциюtasks
, которая разберет их и сделает одни или несколько вызовов функцийtask-run
. На самом деле ровно так же реализованы функции core-dsl. Можно смотреть на модули как third-party дополнения к sparrowdo которые по определенным причинам не включены в core-dsl, в принципе, если модуль достаточно полезный и часто используемый — он может быть хорошим кандидатом на миграцию в core-dsl, как-то так.
alexey_melezhik
26.01.2017 13:15Здравствуйте. Спасибо за вопросы. Отвечу по порядку.
Несколько раз вы говорили про CoreDSL и PluginDSL для него. Насколько я понял, разница лишь в самом синтаксисе в sparrowfile. Т.е. в первом случае создается json и кидается на целевой хост, который исполняется клиентом, во втором — параметры передаются напрямую
В обоих случаях ( и core-dsl API и plugin API ) — это просто функции, написанные на Perl6 ( в случае с Plugin API — это только одна функция — task-run(...)), которые в конечно счете генерируют на выходе некую мета информацию — taskbox ( она сериализуется в JSON и определяет какие плагины, с какими параметрами и в каком порядке запускать ) — которая в виде JSON файла копируется на целевой хост, далее на этом же целевом хосте запускается sparrow клиент, который на вход получает файл с этой самой мета информацией ( task box ) и по данным в ней устанавливает, настраивает ( передает параметры ) и запускает sparrow плагины по порядку определенному в файле taskbox.
На самом деле, что бы было понятнее — если посмотреть в сам taskbox файл — это просто массив, задающий задачи, например так:
[ { "plugin" : "user", "task" : "create user zookeeper", "data" : { "name" : "zookeeper", "action" : "create" } }, { "plugin" : "directory", "task" : "create directory /var/data/zoo", "data" : { "path" : "/var/data/zoo", "action" : "create" } }, { "plugin" : "file", "task" : "create file /var/data/zoo/birds.txt", "data" : { "owner" : "zookeeper", "action" : "create", "target" : "/var/data/zoo/birds.txt" } } ]
Кстати обо всем можно почитать на блог сайте sparrowdo, например в этой статье — sparrow plugins evolution
Насколько я понял, разница лишь в самом синтаксисе в sparrowfile
и в синтаксисе тоже. Plugin dsl — это вызов плагина через функцию task-run, используя его API как есть ( API плагина всегда доступен ввиде его документации в sparrowhub ).
Core-dsl — это набор определенных заранее в Sparrowdo функций ( поэтому и core ) — оберток вокруг вызовов одного или нескольких плагинов — нетрудно догадаться или же если посмотреть код, что любая функция core-dsl на самом деле не что инное как один ( сейчас пока что все функции core dsl мэпятся одна функция — одни плагин, но вообще говоря это может быть подругому ) или несколько вызовов функции task-run: task-run(params), task-run(params), и т.д. По сути core-dsl функции — это сконструированные более сложные черные ящики из более мелких черных ящиков — плагинов (task-run). Таким образом, core-dsl — абстракции более высокого уровня, собранные из "примитивов" — task-run. Сейчас они во основном добавляют syntax sugar, что бы можно было писать короткие вызовы типаfile
вместоtask-run 'file'
… и валидация входных параметров.
They implemented in terms of sparrowdo tasks ( relying on sparrowdo API ) rather then with sparrow tasks.
Имеется ввиду как раз то, что функции core-dsl оперируют/реализованы через вызовы task-run ( sparrowdo tasks ) — эти абстракции не нужно путать с сильно похожими на них абстракция в предметной области самого sparrow клиента — который также выполняет задачи (tasks) — ( sparrow task — абстракция для именованной пары — плагин + параметры ) — которые изначально описываются в sparrowdo сценариях задачами ( функции task-run — абстракция для вызова sparrow task через sparrowdo )
Spigello
26.01.2017 13:43Насколько я понял, разница лишь в самом синтаксисе в sparrowfile.
Я имел ввиду, что для пользователя (обывателя). Я понимаю, что core-dsl это обертка.
Но все-таки, насчет модулей не совсем понятно. Это набор тасков из названия. Я правильно понимаю, что можно в них использовать циклы и ветвления, в отличие от core|plugin-dsl в sparrowfile?alexey_melezhik
26.01.2017 13:54для обычно пользователя:
- plugins API — это функция task-run для вызова конкретного sparrow плагина с парамтерами
- core-dsl — набор готовых функций — пользователь не знает КАК они устроены, он просто их запускает, но де-факто, функции core-dsl устроены так, что они запускают один или несколько sparrow плагинов с параметрами
- модули — это с одной стороны готовые для использования расширения sparrowdo — поставляемые в виде обычных Perl6 модулей ( вот их список ) — по своей сути очень похожие на то, что делают функции core-dsl — вам опять таки же не нужно знать как они устроены внутри, вы просто их используете, исходя из документации,
с другой стороны модули — это API для разработчика расширений, задокументированное тут и вот здесь вы просто пишите произвольный Perl6 код, как хотите, с ветвлениями, циклами и чем угодно. Основное требование с точки API разработки — вы должны реализовать внутри модуля функциюtasks
, принимающую на вход хэш параметры, что она будет делать это вобщем=то ваше дело, но де факто — ( посмотрите примеры и документацию ) она скорее всего сделает один или несколько вызовов функций task-run или core-dsl функций — что бы сделать что-то полезное ((:
alexey_melezhik
26.01.2017 14:07ок, что бы было еще проще (:, извиняюсь если сложно объясняю:
core-dsl — функции, plugin API — функция task-run — просто функции, которые пользователи вызывают в sparrowdo сценариях, вам не надо их писать, если кто и добавляет новые функции в core-dsl — это разработчик sparrowdo, то бишь я.
sparrowdo modules — вы можете использовать готовые в своих sparrowdo сценариях или можете написать свои и так же их использовать. Создание своего sparrowdo модуля подразумевает создание обычного Perl6 модуля в неймспейсе Sparrowdo:: и реализации в нем функции
tasks
принимающей на вход хэш параметры. Вот как то так. Конкретно по написание модулей на Perl6 — это уже в Perl6 комьюнити — у них отличный irc канад — они всегда готовы помочь, ну и конечно сайт https://perl6.org/
renskiy
Использовать YAML для разработки сценариев — это боль. Не учили видать разработчики Ansible историю, и продолжают настойчиво продвигать свою идею.
Sparrow — противоположная крайность, т.е. запутанная и очень сложная, в основе которой все та же идея — не дать разработчику сценария свернуть не туда (или они думают, что такое решение действительно упрощает решение задачи деплоя?), а это в итоге приводит к порождению множества костылей всех форм и размеров.
alexey_melezhik
за аналогию с apache ant — зачет (((: