Почти ansible, да не совсем. Почти rsync, да не совсем. Почти apt-get, но надо проще.
-
Есть 10 одноплатников, у каждого / смонтирован «ro», чтобы не портили. Файловые системы могут отличаться только разными настройками сети, плюс у каждого в /etc/my-role.conf лежит своё имя «роли» этого одноплатника. Роль - это основное, чем он характеризуется для внешнего мира, десять штук с одинаковой ролью - одинаковые. Одноплатник тут упомянут зачем, чтобы сделать акцент на копеечных масштабах и нагрузках. Бывает одноплатник для видеонаблюдения, бывает одноплатник для измерения температуры, бывает одноплатник для пожарной сигнализации. И т.п.
-
У каждого одноплатника в рамдике есть каталог W, который после старта пустой, но куда согласно его роли нужно накатить набор библиотек, исполняемых бинарников и прочих файликов и некоторые из них запустить. Так же нужно, чтобы они обновлялись и перезапускались.
-
Нужно чтобы на каждом одноплатнике работал некий не обновляемый прибитый гвоздями процесс R, запускаемый как systemd «simple» сервис, который бы периодически ходил на центральный прибитый гвоздями домен, отправлял туда описание каталога W и свою роль. В ответ бы он получал пути, которые нужно удалить или обновить. Описание каталога W - это список путей до существующих файлов в каталоге W, где про каждый файл изестен sha1 и размер. Какбэ индекс W. Центральный сервер в ответ на описание каталога W выдаёт новое описание W1. Далее процесс R скачивает недостающие или не правильные файлы и обновляет и атомарно подменяет их в W (rename downloading.tmp goodname.so). Так же процесс R удаляет файлы, которых нет в новой версии W1.
-
Так же нужно, чтобы процесс R служил неким простым systemd, который бы умел простую вещь: понимать список запущенных процессов, их sha1 и их аргументов. Если у процесса A это меняется (поменялся sha1 и был скачан новый бинарник), то старому надо послать TERM или -9 и запустить его заново. То есть, помимо W1 передаётся некий список RUN1, где перечислены бираники и их sha1, которые щас должны работать.
В общем, обмен списком содержимого каталога и поддерживальщик запущенности бинарников таким sha1, которые есть в списке «должно быть запущено». Всё лежит на рамдиске, теряется при первом же ребуте. Единственно стабильные вещи это:
- имя роли
- запущенные процесс R с флешки
- гвоздями прибитый домен «дистрибьютора», куда можно прийти с ролью и сказать «чо почём, как дила, я роль N, мой W такой-то, дай новый W1 и RUN1».
Белых айпишников нет, в железки никто пойти не может.
Такие дела. Есть чё?
P.S. За пару вечеров нафигачил на C++ костяк собственного решения. Не сложное что-то. Оно же будет служить и заменой systemd для моих «демонов». Сделать fork() + execve() оказалось легко и не больно, а получать SIGCHLD и узнавать кто подох и перезапустить через заданный таймаут тоже проще простого. В общем, получается такой компактное решение, которое всё что надо делает из коробки…