Есть один проект, над которым я работаю уже достаточно
давно. Проект
называется LazyCat. Моей
целью в рамках этого проекта является создание системы для
администрирования множества (множества в математическом и в обычном
смысле) компьютеров, объединённых в сеть.
Идея, которая стоит за данным проектом достаточно проста - если у
вас есть много компьютеров, то иногда возникает потребность
выполнить какие-то однотипные действия на всех ваших ПК. Или же
бывает полезно получить "общую картину" происходящего. Это
достаточно просто, когда у вас есть доступ к компьютерам (физический
и/или сетевой), и когда компьютеров не много. С ростом количества
компьютеров такая задача, как развёртывание программного
дистрибутива, становится нетривиальной.
Возьмём наглядный пример.
Университет. Пятница. Вечер. Системный администратор по имени Боб
допивает свой кофе и готовится уйти домой. И в тот момент, когда он
уже накинул сумку на плечо и собрался уходить, к нему прибегает
преподаватель и просит сегодня же установить на все компьютеры в
классе номер 21 пакеты Inkscape и Gimp, так как только что стало
известно, что в субботу будут проходить курсы по компьютерной
графике.
Предположим, в классе 30 компьютеров. На каждый нужно установить
необходимые программы и (возможно) произвести некоторую настройку -
например, добавить учётные записи для новых пользователей. Итого -
требуется выполнить порядка 60 одинаковых действий. Что в такой
ситуации может сделать Боб? Он может, во-первых, пойти в класс номер
21 и поставить программы на каждый компьютер в отдельности. Но,
поскольку за плечами Боба - годы системного администрирования, то он
знает пару полезных трюков. Например, он может со своей машины зайти
по SSH на каждый из компьютеров и выполнить установку. Но ему
по-прежнему нужно залогиниться на каждый компьютер, выполнить
установку и настройку вручную. Лучше, чем бегать от компьютера к
компьютеру, но всё ещё не слишком удобно.
Было бы гораздо удобнее, если бы Боб мог отправить команду
установки сразу всем компьютерам в классе 21, и получить обратно
отчёт, если что-то пошло не так - например, если пакет уже был
установлен в системе, или же во время установки произошла ошибка.
Есть достаточно большое количество программного обеспечения,
которое решает подобную задачу (в Википедии есть
обширный список)
-
например, Ansible
и Puppet.
LazyCat - один из таких инструментов. Он написан на языке C и на
Scheme (диалекте Lisp) с
использованием Guile. На
языке C написано ядро проекта и прокси-сервисы. Под прокси в данном
контексте я понимаю процессы, которые непосредственно пересылают
сообщение по сети конечному хосту. Графический интерфейс
пользователя и высокоуровневая логика написаны на Scheme.
По сути, базовая часть LazyCat является интерпретатором Scheme с
дополнительным API. Благодаря использованию Scheme, LazyCat можно
легко расширить - например, написать другой интерфейс, добавить
функциональность или же использовать его в автоматическом
режиме.
Проект находится в разработке и пока не может похвастать большим
количеством возможностей. Вот, что сделано на данный момент:
- Графический интерфейс пользователя на GTK.
- Выполнение команд на хостах через TCP- и SSH-подключения.
- Базовый режим "Raw", в котором lazycat отправляет команду на
все хосты из списка и отображает необработанный вывод команд.
- Режим "Diff", при котором результат выполнения команды с
каждого хоста сравнивается с результатом выполнения этой же команды
с эталонного хоста.
- Группировка хостов в списке (пока имеет чисто эстетический
характер).
- Сохранение и восстановление списка хостов между сессиями.
В ближайших планах:
- Отладка.
- Возможность выбора эталонного хоста перед отправкой команды в
Diff-режиме (сейчас выбирается первый хост из списка).
- Возможность изменять информацию о хосте из графического
интерфейса (пока реализовано только API для этого).
- Возможность отправки сообщений только выбранным хостам из
списка, или же группе хостов.
- Организация списка хостов по типу контакт-листа IM-клиента (за
образец думаю взять Pidgin) - статусы, состояния (online/offline) и
т.п.
- Периодический опрос состояния хостов (для отображения их
статусов в списке).
Сейчас над проектом работаю я один, just for fun, в свободное от
работы время. В связи с этим прогресс идёт достаточно медленно, и
проекту не хватает тестирования. Если вас заинтересовал LazyCat и вы
можете и хотите поучаствовать в разработке - то вот страница проекта
на GitHub, откуда вы можете получить исходный код (под GPLv3) и дополнительную информацию о проекте:
https://github.com/artyom-poptsov/lazycat
- Артём