Rex - управляем множеством машин с помощью SSH и Perl

Материал из Rosalab Wiki
Перейти к: навигация, поиск
Rex-logo.png

В статье про групповые политики для Chromium в Linux мы упомянули, что json-файлы с политиками Chromium можно распространить по большому количеству машин с помощью программ управления конфигурацией типа Puppet или CFEngine. Но многие сисадмины считают эти программы слишком монструозными для подобных задач и предпочитают раздачу файлов по старому доброму SSH. Однако чтобы раздать файл множеству машин, придется уже написать небольшой скрипт на Shell. А поскольку раздача файлов — явно не единственная задача, которую захочется выполнить таким образом, то со временем у вас накопится куча Shell-скриптов, которая имеет тенденцию превращаться в свалку.

К счастью, имеются инструменты для более изящного использования SSH при выполнении задач на всех подвластных машинах. Одно из таких средств — это Rex. Никаких агентов на клиентских машинах, никаких сложных настроек — просто скрипты, выполняющие задаче на множестве компьютеров. Скрипты пишутся на языке Perl, но знать этот язык для выполнения большинства операций не обязательно. Rex предоставляет богатую библиотеку функций для выполнения типичных задач (копирования файлов, получения информации о системе и так далее), так что обычно скрипты умещаются в десяток строчек.

В этом году Rex перевалил за версию 1.0 и считается теперь вполне стабильным и надежным. А начиная с релиза 0.55.0, Rex официально поддерживает РОСУ (не без нашей помощи — в свое время мы делали обзор Rex для журнала «Системный администратор», было бы странно при этом не добавить в Rex поддержку наших дистрибутивов).

В ROSA Desktop Fresh пакет Rex уже есть в репозиториях и можно его установить через urpmi:

# urpmi Rex

А самую свежую версию всегда можно установить с сайта разработчика в одну команду:

# curl -L get.rexify.org | perl - --sudo -n Rex

Для совсем простых задач можно даже не писать скрипты, а командовать Rex прямо из консоли. Например, вот так можно скопировать файл test_policy.json в директорию /etc/chromium/policies/managed на машинах с именами client0, client1, … client10:

# rex -H client[0..10] -e 'upload "test_policy.json", "/etc/chromium/policies/managed"'

Поскольку Rex общается с клиентскими машинами по SSH, то на каждой машине должен быть запущен SSH-сервер, а программе необходимо передать логин и пароль для доступа (а лучше использовать авторизацию по ключу, чтобы не вводить пароль каждый раз).

Можно описывать задачи в скриптах. Например, создадим файл следующего содержания и назовем его Rexfile (Rex по умолчанию ищет файл с таким именем в текущей директории, так что можно его не указывать в параметрах вызова):

 user "your_user";
 password "your_password";
 
 task "get_os", "localhost", sub {
    say get_operating_system();
 };

Здесь мы определили задачу get_os, которая будет выполняться на нашей локальной машине («localhost») и будет печатать нам имя операционной системы. В начале файлы необходимо задать имя и пароль (либо ключ) для доступа к целевым машинам.

Теперь запустим Rex, приказав ему выполнить задачу get_os (и подавив вывод излишней информации с помощью опции -q):

$ rex -q get_os
RosaDesktopEnterprise

Как видим, в качестве имени ОС Rex извлек значение DISTRIB_ID из файла /etc/lsb-release (которое также можно получить, выполнив команду lsb_release -i).

В одном файле можно описывать несколько задач, а каждую задачу можно ассоциировать с множеством машин. Вовсе не обязательно ограничиваться копированием файлов и «игрушечными» задачами. Возможностей у Rex довольно много — можно управлять пакетами, сервисами, всевозможными настройками клиентских машин, проводить инвентаризацию оборудования и даже управлять облаками. Познакомиться со всеми этими возможностями можно разделе документации на сайте разработчика. Но учтите — в отличие от простых задач, более сложные могут потребовать написания более сложных скриптов на Perl, так что перлоненавистникам этот подход вряд ли понравится.

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.