- PVSM.RU - https://www.pvsm.ru -

Sparrowdo — простой инструмент управления конфигурациями

Здравствуйте! В данной статье хотел бы рассказать о простом инструменте управления конфигурациями — Sparrowdo [1]. Скажу сразу, что система Sparrowdo базируется на использовании так называемых Sparrow [2] плагинов, o которых мною был уже написан ряд статей [3] на habrahabr.ru

image image

Итак, отличительные особенности данного инструмента:

  • Конфигурационные сценарии пишутся на Perl6 [4] ( это объясняет появления логотипа с бабочкой вверху статьи :)

  • Решение задач по управлению конфигурациями происходит выбором того или иного подходящего плагина и запуска его на настраиваемом сервере. Каждый плагин — черный ящик по решению конкретной задачи. Собрав некоторое количество плагинов и запустив их на сервере с требуемыми параметрами, вы получаете необходимую конфигурацию системы. Плагины могут решать как элементарные задачи, такие как создание пользователей [5], групп [6], установка системных пакетов [7], так и более сложные, комплексные — установка приложения [8] из исходников в git репозитарии и запуск его в виде сервиса. Вы сами выбираете плагин, который подходит вам.

  • Некоторой аналогией плагинов в известных существующих системах управления конфигурациями могут быть ресурсы [9] или кукбуки [10] в chef [11], или же модули [12] в ansible [13].

  • Итак, Sparrowdo не предоставляет вам "из коробки" базовый набор функций, как это предлагается в chef или ansible, но вместо этого вы всегда можете воспользоваться готовым набором [14] плагинов, решающим типовые задачи. Но даже если вы найдете подходящего, вы сможете легко написать свой плагин и тут же воспользоваться им. Таким образом в Sparrowdo/Sparrow акцент делается не на готовом решении поставляемом изначально вместе с инструментом, а на возможности быстро и легко добавлять требуемую функциональность.

  • Сценарии Sparrowdo определяют списки Sparrow плагинов с входными параметрами — фактически, все что вам нужно, что бы описать требуемую конфигурацию сервера. Sparrowdo клиент проходится по списку плагинов и последовательно запускает их на целевом сервере, результат выводится в консоль в виде TAP [15] отчетов, причем запуск каждого плагина порождает свой отчет.

  • Сценарии пишутся на Perl6 [4], используется простой API [16] по запуску плагинов на удаленной машине, конкретные примеры я приведу чуть позже.

  • Для работы 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

У клиента есть множество дополнительных параметров [17], которые вы можете использовать, например указать имя пользователя под которым вы будете запускать ssh сессии или увеличить детализацию отчета параметром --verbose:

 $ sparrowdo --host=192.168.0.1 --ssh_user=admin --verbose

Примеры

Ну а теперь несколько примеров, что бы можно было увидеть как с помощью Sparrowdo можно автоматизировать типовые задачи настройки серверов.

Установка CPAN [18] модулей

Так система 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 [19] и DBI [20], причем в качестве установочной директории (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 [7], хочется заметить, что пока он поддерживает небольшое кол-во платформ — 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 [5] и group [6]. Вот как может выглядеть 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 [21].

Воспользуемся плагином templater [22]. Для того, что бы все работало, создадим шаблон в той же директории, где находится 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

Использование приватных плагинов

Все плагины, о которых только что шла речь являются публичными [23]. Они все находятся в общедоступном центральном репозитарии Sparrow плагинов SparrowHub [24]. Если по каким-то причинам вы не хотите выкладывать свои плагины в общий доступ, вы можете разместить их в удаленных git репозитариях и использовать их оттуда. Это называется приватные [25] 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 можно завершить. С полным списком существующих плагинов можно ознакомиться здесь [14]. Новые плагины добавляются постоянно, те, кого заинтересовала данная статья могут включится в процесс, как я уже неоднократно говорил — написание новых Sparrow плагинов под силу каждому, кто пишет на Perl, Bash или Ruby, для разработки плагинов существует специальная среда под названием Outthentic [26], в документации к которой можно найти всю информацию. Процесс "превращения" пользовательских скриптов в Sparrow плагины также описан в документации по Sparrow [27].

Резюме

Итак, как сказано в заголовке статьи, Sparrowdo именно простое, но достаточно эффективное средство управления конфигурациями. Простое потому что, там нет многих фич присутствующих в известных системах управления конфигурациями — таких как запуск сценариев в dry-run режиме, как в chef или управление зависимостями между плагинами. Однако важной характеристикой, отличающей систему Sparrowdo/Sparrow от ряда других является возможность быстрой разработки нужных вам плагинов и их последующее "включение" в систему через единый репозитарий. По сравнению со сложным LWRP API в chef написание нового плагина Sparrow решающим вашу задачу будет на порядок быстрее и проще. Да и код на выходе будет проще для понимания, отладки и сопровождения.

Так же важно упомянуть, что Sparrow не навязывает вам никакого DSL в рамках которого вы пишите плагины, но предоставляет унифицированный API для всех трех языков разработки плагинов ( Perl, Bash, Ruby ).

Что же касается самой системы Sparrowdo — это своего рода тонкий клиент к Sparrow плагинам. У него простой API, с возможностью конструирования списков применяемых плагинов в чисто императивном стиле, используя всю мощь современного языка Perl6 [28].

Спасибо за внимание. Как всегда, жду критики по делу, вопросов и комментариев.

Спасибо.

PS и в конце простенький опрос, не касающийся напрямую темы статьи.

Автор: alexey_melezhik

Источник [29]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/perl/152132

Ссылки в тексте:

[1] Sparrowdo: https://github.com/melezhik/sparrowdo

[2] Sparrow: https://metacpan.org/pod/Sparrow

[3] статей: https://habrahabr.ru/search/?target_type=posts&q=sparrow&order_by=date

[4] Perl6: https://perl6.org/

[5] пользователей: https://sparrowhub.org/info/user

[6] групп: https://sparrowhub.org/info/group

[7] пакетов: https://sparrowhub.org/info/package-generic

[8] установка приложения: https://sparrowhub.org/info/perl-app

[9] ресурсы: https://docs.chef.io/resource.html

[10] кукбуки: https://docs.chef.io/cookbooks.html

[11] chef: https://www.chef.io/

[12] модули: http://docs.ansible.com/ansible/modules.html

[13] ansible: https://www.ansible.com/

[14] набором: https://sparrowhub.org/search

[15] TAP: https://testanything.org/

[16] API: https://github.com/melezhik/sparrowdo#usage

[17] параметров: https://github.com/melezhik/sparrowdo#sparrowdo-client-command-line-parameters

[18] CPAN: https://en.wikipedia.org/wiki/CPAN

[19] CGI: https://metacpan.org/pod/CGI

[20] DBI: https://metacpan.org/pod/DBI

[21] Template-Toolkit: http://template-toolkit.org

[22] templater: https://sparrowhub.org/info/templater

[23] публичными: https://metacpan.org/pod/Sparrow#Public-plugins

[24] SparrowHub: https://sparrowhub.org

[25] приватные: https://metacpan.org/pod/Sparrow#Private-plugins

[26] Outthentic: https://metacpan.org/pod/Outthentic

[27] Sparrow: https://metacpan.org/pod/Sparrow#Publishing-public-sparrow-plugin-to-SparrowHub

[28] Perl6: http://perl6.org/

[29] Источник: https://habrahabr.ru/post/304982/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best