Утилиты Calculate vs Puppet

Ой чувствую сейчас начну холивар, но все же начну. Хочу написать описание двух инструментов “массового управления”, посмотреть на их плюсы и минусы. Я понимаю, что это попытка сравнения яблок и груш, но…

Уже сейчас хочу сказать что заголовок правильнее написать как Утилиты Calculate + Puppet. Потому что заменить друг-друга целиком они не могут. Только с большим обвесом дополнительный скриптов.

Рассмотрим ситуацию, когда нужно обслуживать некоторое количество однотипных рабочих станций и серверов, с рядом отклонений из однотипности. Будем считать что ОС (конечно gentoo), и наши подопытные уже установлены.

Про состав утилит calculate на этом форуме, думаю, рассказывать не надо. Расскажу немного про puppet.

Это клиент-серверное приложение, написан на ruby, сайт http://www.puppetlabs.com/. Есть встроенный интерфейс файлообмена, есть поддержка внешних модулей (и большое количество модулей), подсветка синтаксиса для vim и emacs. Клиент (со своим сертификатом) раз в 30 минут подключается к серверу, получает от него слепок конфигурации, согласно hostname. И применяет ее, результат применения конфигурации (например триггер выполнение команды, которая должна выполниться только один раз в сутки) сохраняется для последующего использования.

Теперь рассмотрим ряд задач, которые нужно решить сферическому администратору в офисном вакууме. Возьмем типично гентушные:

1) Держать дерево portage синхронизированным.
2) Держать пакет обновленным. Например “sys-apps/portage”, а то как перейдут на EAPI4… И держать пакет установленным.
3) Положить файл на удаленный компьютер.
4) Изменить файл на удаленном компьютере, по шаблону.
5) Установить/удалить пакет на группе компьютеров в сети.

В Calculate Linux 11 будет включена более тесная интеграция при введении клиента в домен. Например механизм синхронизации портежей, который я недавно описал в блоге.

В составе утилит Calculate 2 скоро появится один интересный пакет ‘calculate-soap’, позволяющий удаленно управлять утилитами. Поддержка со временем будет добавлена во все пакеты. Через API можно будет писать простые клиенты для администрирования.

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

Страница Управление клиентскими машинами конечно уже устарела и соответствует Calculate Linux Desktop не выше версии 10.4

Задача 1: Держать дерево portage синхронизированным.

Допустим, мы почему то не хотим выложить /usr/portage и /var/lib/layman/* на nfs :). Допустим мы подняли локальное зеркало для portage и оверлеев. Но как запустить eix-sync? Стандартное решение положить скрипт в /etc/cron.daily/, или допустим в /etc/conf.d/local. Но пользовательские компьютеры выключаются ночью, не всегда включены днем, и мне не очень нравится идея ставить обновления, которые могут нагрузить систему и сеть на автозагрузку.

Как это сделать в puppet?

schedule { daily: 
period => daily, 
repeat => 1,
}

class portage-update {
$eix_with_opts="/usr/bin/eix-sync ${portage_sync} 2> /var/log/eix-sync2.log > /var/log/eix-sync.log& echo ok"
$ports_sync_mirror="SYNC=rsync://gw.local/gentoo-portage"

    exec { "emerge-sync":
        command => $eix_with_opts,
        environment => $ports_sync_mirror,
        schedule => daily
     }
}

$portage_sync - у меня меняется в зависимости от класса машины - на далеких серверах с тонкими каналами это “-W”, на серверах с безлимиткой и пользовательских компьютерах просто “”.

Класс portage-update раз в сутки запустит eix-sync. Когда сможет, тогда и запустит, будет компьютер включен ночью, обновит ночью, включится днем - обновится днем.

Calculate - возможности запуска команд удаленно нет, остается cron и скрипты.

Задача 2: Держать пакет обновленным. Например “sys-apps/portage”, а то как перейдут на EAPI4… И держать пакет установленным.

В принципе задача тривиальная, если нужно держать обновленным один пакет. Дописать в скрипт после eix-sync что то вроде emerge -u portage. Ну а если хочется иметь свежим “зоопарк”? Минорные релизы файрфокса выходят чуть ли не каждую неделю, adobe-flash тоже хочется свежим держать… Можно дописать весь список в emerge -1u $pkgs_list.

И вторая задача - держать пакет в системе установленным. Пакет просто должен стоять в системе, его версия не критична. Например sys-apps/ed, app-misc/screen и т.д.

В puppet это делается так:

class gentoo-latest {
    $gentoolatest = [ "sys-apps/portage", "app-portage/layman", "app-portage/gentoolkit" ]
    package { $gentoolatest:
    ensure   => 'latest'}
}

class gentoo-minimal {
    $gentoominimal = [ "sys-apps/ed", "app-misc/mc", "app-misc/screen", "media-sound/alsa-utils" ]
    package { $gentoominimal:
    ensure   => 'present'}
}

При каждом сеансе связи с сервером (по умолчанию 30 минут) в первом случае будет проверена версия пакета и при необходимости пакет будет обновлен, а во втором - наличие пакета, и при необходимости пакет будет установлен.

Зачем нужно держать пакет установленным? Это своего рода “регенерация” для защиты от кривых рук младшего админского состава, и своей забывчивости. Приведение старых рабочих станций к общему виду без крупных телодвижений.

В Calculate штатными средствами обновить пакет нельзя. В принципе обновить все “руками” не так сложно http://www.calculate-linux.ru/boards/6/topics/4942, но мне не хочется помнить о обновлении браузеров, офисов и плееров. Вышла новая версия поставить.

Задача 3. Положить файл на удаленный компьютер.

Задача тривиальна - каждый из Вас десяток способов назовет. Папку держать в синхронизированном состоянии - тоже не проблема. У Calculate это шаблоны, у Puppet это тип file.

    file { "/etc/portage/package.use/":
            ensure => directory,
            owner => "root",
            group => "root",
            recurse => true,
            purge => false,
            mode => 755,
            source => "puppet:///$ostype/etc/portage/package.use/"
    }

$ostype = рабочая это станция или сервер.

И Calculate и Puppet с этим справляются легко, это действительно тривиально. Единственная разница - это когда применятся шаблоны - у Calculate как я понимаю это завязано на вход в домен/logon пользователя. Т.е. для появления новой кнопочки на панельке нужно будет перезайти. Puppet обновит кнопочку по таймеру - т.е. раз в пол часа. Иногда (хотя довольно редко), пользовательские компьютеры тоже не перезагружаются по несколько дней - в силу “забывчивости” пользователей и торрентов.

Задача 4: Изменить файл на удаленном компьютере, по шаблону.

Изменить. Вот тут puppet сливает по полной программе. Puppet поддерживает шаблоны ruby ERB, имеет биндинги к augeas. Но шаблоны ERB не могут изменить файл, они подходят для создания нового файла, по шаблону, с подстановкой переменных. Augeas умеет редактировать файлы конфигурации, но по сути для каждого типа файлов нужно писать свой lens.

Шаблоны Calculate 2.2 справляются с задачей играючи - для них шаблонов это тривиально.

По поводу первой задачи. Если компьютер представляет собой ноутбук, который сотрудник может брать с собой, способ держать портежи на NFS уже не проходит. Это из серии, почему нужно качать профиль пользователя на CLD, а не монтировать /home по NFS с сервера. И кстати для обновления из бинарных пакетов дерево портежей не нужно, есть флаг ‘–getbinpkgonly’. Что касается когда синхронизировать, как мне кажется обновление лучше делать при загрузке системы.

По поводу второй задачи. Решений множество. Какой смысл дублировать сущности, реализуя это в утилитах. В CLD директория /var/calculate/remote при вводе в домен монтируется с сервера. Как поддерживать целостность пакетов? Банально, скриптом с вызовом emerge --noreplace -1 <пакеты>. Заметьте, в примере я привел параметр “-1”, чтобы после установки в world не попал этот пакет. В Вашем примере я не знаю с какими параметрами будет выполнятся emerge.

И Calculate и Puppet с этим справляются легко, это действительно тривиально. Единственная разница - это когда применятся шаблоны - у Calculate как я понимаю это завязано на вход в домен/logon пользователя. Т.е. для появления новой кнопочки на панельке нужно будет перезайти. Puppet обновит кнопочку по таймеру - т.е. раз в пол часа. Иногда (хотя довольно редко), пользовательские компьютеры тоже не перезагружаются по несколько дней - в силу “забывчивости” пользователей и торрентов.

Не только при входе или выходе из домена. Например при установке пакета. Поставьте например браузер Opera находясь в сеансе. Он уже будет настроен шаблонами. Если возможно обновлять панельку не выходя из сеанса, точнее как до этого дойдут руки, мы реализуем и это.

В первой версии утилит Calculate есть есть возможность накладывать патчи на систему. Патчи представляют собой скрипты написанные на любом языке. Задача утилит только контролировать выполнение их, чтобы не запускать дважды. Выполнение патчей можно привязать хоть к крону. Подобный функционал во вторых утилитах мы пока не восстановили. Возможно появятся какие-то другие интересные идеи.

  • Задача 5: Установить/удалить пакет на группе компьютеров в сети.
  • Есть несколько компьютеров - на них всех стоит CLDG. Но часть этих компьютеров стоит в бухгалтерии, часть в магазине, часть в отделе IT. В зависимости от типа рабочей станции (по hostname) на них должен стоять разный набор софта - где-то wine@Ethersoft, где-то vmware-server… А иногда что нибудь стоять не должно - например игрушки, хотя они и тянутся вместе с мета-пакетом.
  • Puppet это делает элементарно ensure => ‘present’ - пакет стоит. ensure => ‘absent’ - пакета нет. Прошло обновление системы emerge vuD world пакет по зависимостям появился, но не надолго.
  • В Calculate такого функционала нет.
  • Удалить пакет можно руками, но отследить наличие или отсутствие пакета по маске сложно, особенно если групп компьютеров и групп ПО много.

А иногда что нибудь стоять не должно - например игрушки, хотя они и тянутся вместе с мета-пакетом.

Игрушки тянутся с мета-пакетом?

По поводу удаления пакетов, этот вопрос пока не закрыт. Возможно поможет переход на сеты. По мне, так ничто не мешает убрать “кнопку пуск” из верхней панельки сотрудникам с урезанным функционалом. Возможно в офисе мы такой эксперимент скоро проведем. Уверен что нижней панельки задач хватит для запуска всех приложений для работы.

  • К чему я это все - есть задачи, которые очень хорошо решаются своими инструментами. Сделать универсальный инструмент для решения всех задач - сложно. Да и стоит-ли?
  • Puppet в режиме управления пакетами запускает emerge с параметрами из EMERGE_DEFAULT_OPTS, если запускать emerge через exec, все можно выставить ручками.
  • Первые утилиты calculate уже не актуальны, в 10.9 их нет. А система патчей с контролем выполнения - интересна. Еще интересная идея - клиент-серверное приложение, которое может передавать события, и согласно этим событиям выполнять определенные действия. Скорость реакции - мгновенно. Возможно это сможет делать calculate-soap, я пока плохо представляю себе его возможности.
  • gnome-extra/gnome-games тянется за gnome-base/gnome, он правда в CLDG не ставится, но… Это было для меня особенно актуально когда в старый CLDG входил gnome-light, который меня не устраивал, и я ставил полный гном.