Здравствуйте! В данной статье хотел бы рассказать о простом инструменте управления конфигурациями — Sparrowdo. Скажу сразу, что система Sparrowdo базируется на использовании так называемых Sparrow плагинов, o которых мною был уже написан ряд статей на habrahabr.ru
)
Итак, отличительные особенности данного инструмента:
Конфигурационные сценарии пишутся на Perl6 ( это объясняет появления логотипа с бабочкой вверху статьи :)
Решение задач по управлению конфигурациями происходит выбором того или иного подходящего плагина и запуска его на настраиваемом сервере. Каждый плагин — черный ящик по решению конкретной задачи. Собрав некоторое количество плагинов и запустив их на сервере с требуемыми параметрами, вы получаете необходимую конфигурацию системы. Плагины могут решать как элементарные задачи, такие как создание пользователей, групп, установка системных пакетов, так и более сложные, комплексные — установка приложения из исходников в git репозитарии и запуск его в виде сервиса. Вы сами выбираете плагин, который подходит вам.
Некоторой аналогией плагинов в известных существующих системах управления конфигурациями могут быть ресурсы или кукбуки в chef, или же модули в ansible.
Итак, Sparrowdo не предоставляет вам "из коробки" базовый набор функций, как это предлагается в chef или ansible, но вместо этого вы всегда можете воспользоваться готовым набором плагинов, решающим типовые задачи. Но даже если вы найдете подходящего, вы сможете легко написать свой плагин и тут же воспользоваться им. Таким образом в Sparrowdo/Sparrow акцент делается не на готовом решении поставляемом изначально вместе с инструментом, а на возможности быстро и легко добавлять требуемую функциональность.
Сценарии Sparrowdo определяют списки Sparrow плагинов с входными параметрами — фактически, все что вам нужно, что бы описать требуемую конфигурацию сервера. Sparrowdo клиент проходится по списку плагинов и последовательно запускает их на целевом сервере, результат выводится в консоль в виде TAP отчетов, причем запуск каждого плагина порождает свой отчет.
Сценарии пишутся на Perl6, используется простой API по запуску плагинов на удаленной машине, конкретные примеры я приведу чуть позже.
- Для работы Sparrowdo выбрана push идеология. У вас есть мастер хост, на котором установлен Sparrowdo клиент, с которого по ssh запускаются плагины на целевом сервере. Для запуска плагинов на целевых серверах должен быть установлен Sparrow клиент. Вот как все будет выглядеть с точки зрения конкретных команд по установке данной системы.
Установка Sparrowdo клиента на мастер хост:
$ ssh master.host $ panda install Sparrowdo
Установка Sparrow клиента на целевые хосты:
$ ssh target.host $ cpanm Sparrow $ yum install curl
Схема работы Sparrowdo системы:
+-----------------+ | | ssh | |------------> < host-1 > 192.168.0.1 | <master host> | ssh | {sparrowdo} |------------------> < host-2 > 192.168.0.2 | | ssh | |-----------------------> < host-N > 192.168.0.3 | | +-----------------+ +-------------+ | | | <host> | | | | {sparrow} | | {curl} | | | +-------------+
Для того, что бы все это работало необходимо обеспечить два условия:
- с мастер хоста на целевые машины должен обеспечиваться безпарольный ssh доступ
- пользователь из под которого создается ssh сессия должен иметь безпарольный sudo на целевой машине
Если оба критерия удовлетворены мы может создать Sparrowdo сценарий и запустить его с мастер хоста на целевой машине:
$ ssh master.host $ nano sparrowfile # создание сценария $ sparrowdo --host=192.168.0.1
У клиента есть множество дополнительных параметров, которые вы можете использовать, например указать имя пользователя под которым вы будете запускать ssh сессии или увеличить детализацию отчета параметром --verbose:
$ sparrowdo --host=192.168.0.1 --ssh_user=admin --verbose
Примеры
Ну а теперь несколько примеров, что бы можно было увидеть как с помощью Sparrowdo можно автоматизировать типовые задачи настройки серверов.
Установка CPAN модулей
Так система Sparrowdo/Sparrow написана на Perl6/Perl5, и прежде всего ориентирована на Perl разработчиков, то не могу не начать с этого, классического для экосистемы Perl use кейса.
$ ssh master.host $ cat sparrowfile task_run %( task => 'install some cpan packages', plugin => 'cpan-package', parameters => %( list => 'CGI DBI', install-base => '/opt/perl' ) );
Данным сценарием мы устанавливаем два CPAN модуля — CGI и DBI, причем в качестве установочной директории (install base ) используем путь /opt/perl.
Вот как все это будет выглядеть на моей тестовой машине:
$ sparrowdo --host=192.168.0.1 running sparrow tasks on 192.168.0.1 ... running task <install some cpan packages> plg <cpan-package> parameters: {install-base => /opt/perl, list => CGI DBI} /tmp/.outthentic/5385/opt/sparrow/plugins/public/cpan-package/story.t .. # [/opt/sparrow/plugins/public/cpan-package/modules/cpanm] # install CGI into /opt/perl ... # Successfully installed HTML-Parser-3.72 (upgraded from 3.64) # Successfully installed Test-Deep-1.120 # Successfully installed Sub-Uplevel-0.25 # Successfully installed Carp-1.38 (upgraded from 1.11) # Successfully installed Test-Warn-0.30 # Successfully installed CGI-4.31 (upgraded from 3.51) # 6 distributions installed # install ok ok 1 - output match 'install ok' # [/opt/sparrow/plugins/public/cpan-package/modules/cpanm] # install DBI into /opt/perl ... # Successfully installed DBI-1.636 # 1 distribution installed # install ok ok 2 - output match 'install ok' # [/opt/sparrow/plugins/public/cpan-package] # cpan-package-done ok 3 - output match 'cpan-package-done' 1..3 ok All tests successful. Files=1, Tests=3, 91 wallclock secs ( 0.02 usr 0.01 sys + 72.58 cusr 8.26 csys = 80.87 CPU) Result: PASS
Установка системных пакетов
Для этой цели воспользуемся плагином package-generic, хочется заметить, что пока он поддерживает небольшое кол-во платформ — Ubuntu/Debian/CentOS но его легко "доточить" при необходимости. Вот как будет выглядеть сценарий по установке nginx, nano и telnet.
$ ssh master.host $ cat sparrowfile use v6; use Sparrowdo; task_run %( task => 'install my packages', plugin => 'package-generic', parameters => %( list => 'nginx nano telnet' ) );
Создание, удаление пользователей и групп
Эта типичная задача решается плагинами с очевидными названиями user и group. Вот как может выглядеть Sparrowdo сценарий:
$ ssh master.host $ cat sparrowfile use v6; use Sparrowdo; task_run %( task => 'this is me', plugin => 'user', parameters => %( name => 'melezhik' ) ); task_run %( task => 'admins group', plugin => 'group', parameters => %( name => 'admins' ) ); task_run %( task => 'remove unknown users', plugin => 'user', parameters => %( name => 'Unknown' , action => 'delete' ) );
Управление сервисами
Не мог пропустить это классический кейс. Вот как все будет выглядеть в Sparrowdo сценарии:
$ ssh master.host $ cat sparrowfile use v6; use Sparrowdo; task_run %( task => 'start nginx ', plugin => 'service', parameters => %( name => 'nginx' ) ); task_run %( task => 'stop nginx ', plugin => 'service', parameters => %( name => 'nginx' , action => 'stop' ) ); task_run %( task => 'add nginx to autostart', plugin => 'service', parameters => %( name => 'nginx' , action => 'enable' ) ); task_run %( task => 'remove nginx from autostart', plugin => 'service', parameters => %( name => 'nginx' , action => 'disable' ) );
Использование шаблонов для настройки конфиг файлов
И последний пример по-сложнее. Как можно управлять конфиг файлам используя шаблоны в формате Template-Toolkit.
Воспользуемся плагином templater. Для того, что бы все работало, создадим шаблон в той же директории, где находится Sparrowdo сценарий, например такой
$ ssh master.host $ cat foo.conf.tmpl Hello, my name is [% name %]! I speak [% language %]
Теперь напишем сценарий по установке конфигурационного файла на основе нашего шаблона, к который мы передадим пару переменных:
$ ssh master.host $ cat sparrowfile use v6; use Sparrowdo; task_run %( task => 'install my config', plugin => 'templater', parameters => %( variables => %( name => 'sparrowdo', language => 'perl6' ), target => '/etc/foo.conf', owner => 'user', mode => '644', source => slurp 'foo.conf.tmpl' ) );
В итоге, после применения данного сценария на целевом сервере получим файл /etc/foo.conf с содержимым
Hello, my name is sparrowdo! I speak perl6
Использование приватных плагинов
Все плагины, о которых только что шла речь являются публичными. Они все находятся в общедоступном центральном репозитарии Sparrow плагинов SparrowHub. Если по каким-то причинам вы не хотите выкладывать свои плагины в общий доступ, вы можете разместить их в удаленных git репозитариях и использовать их оттуда. Это называется приватные Sparrow плагины.
Вот как бы выглядел пример, для сценария установки системных пакетов, если бы пользовались приватным плагином package-generic, находящимся в github репозитарии ( я опускаю детали, связанные с аутентификацией ):
$ ssh master.host $ cat sparrowfile use v6; use Sparrowdo; set_spl %( package-generic => 'https://github.com/melezhik/package-generic.git' ); task_run %( task => 'install my packages', plugin => 'package-generic', parameters => %( list => 'nginx nano telnet' ) );
На этом обзор существующих возможностей системы Sparrowdo/Sparrow можно завершить. С полным списком существующих плагинов можно ознакомиться здесь. Новые плагины добавляются постоянно, те, кого заинтересовала данная статья могут включится в процесс, как я уже неоднократно говорил — написание новых Sparrow плагинов под силу каждому, кто пишет на Perl, Bash или Ruby, для разработки плагинов существует специальная среда под названием Outthentic, в документации к которой можно найти всю информацию. Процесс "превращения" пользовательских скриптов в Sparrow плагины также описан в документации по Sparrow.
Резюме
Итак, как сказано в заголовке статьи, Sparrowdo именно простое, но достаточно эффективное средство управления конфигурациями. Простое потому что, там нет многих фич присутствующих в известных системах управления конфигурациями — таких как запуск сценариев в dry-run режиме, как в chef или управление зависимостями между плагинами. Однако важной характеристикой, отличающей систему Sparrowdo/Sparrow от ряда других является возможность быстрой разработки нужных вам плагинов и их последующее "включение" в систему через единый репозитарий. По сравнению со сложным LWRP API в chef написание нового плагина Sparrow решающим вашу задачу будет на порядок быстрее и проще. Да и код на выходе будет проще для понимания, отладки и сопровождения.
Так же важно упомянуть, что Sparrow не навязывает вам никакого DSL в рамках которого вы пишите плагины, но предоставляет унифицированный API для всех трех языков разработки плагинов ( Perl, Bash, Ruby ).
Что же касается самой системы Sparrowdo — это своего рода тонкий клиент к Sparrow плагинам. У него простой API, с возможностью конструирования списков применяемых плагинов в чисто императивном стиле, используя всю мощь современного языка Perl6.
Спасибо за внимание. Как всегда, жду критики по делу, вопросов и комментариев.
Спасибо.
PS и в конце простенький опрос, не касающийся напрямую темы статьи.
