LINUX.ORG.RU
ФорумAdmin

Посоветуйте систему раскидывания бинарников и их автоперезапуска.

 


0

1

Почти ansible, да не совсем. Почти rsync, да не совсем. Почти apt-get, но надо проще.

  1. Есть 10 одноплатников, у каждого / смонтирован «ro», чтобы не портили. Файловые системы могут отличаться только разными настройками сети, плюс у каждого в /etc/my-role.conf лежит своё имя «роли» этого одноплатника. Роль - это основное, чем он характеризуется для внешнего мира, десять штук с одинаковой ролью - одинаковые. Одноплатник тут упомянут зачем, чтобы сделать акцент на копеечных масштабах и нагрузках. Бывает одноплатник для видеонаблюдения, бывает одноплатник для измерения температуры, бывает одноплатник для пожарной сигнализации. И т.п.

  2. У каждого одноплатника в рамдике есть каталог W, который после старта пустой, но куда согласно его роли нужно накатить набор библиотек, исполняемых бинарников и прочих файликов и некоторые из них запустить. Так же нужно, чтобы они обновлялись и перезапускались.

  3. Нужно чтобы на каждом одноплатнике работал некий не обновляемый прибитый гвоздями процесс R, запускаемый как systemd «simple» сервис, который бы периодически ходил на центральный прибитый гвоздями домен, отправлял туда описание каталога W и свою роль. В ответ бы он получал пути, которые нужно удалить или обновить. Описание каталога W - это список путей до существующих файлов в каталоге W, где про каждый файл изестен sha1 и размер. Какбэ индекс W. Центральный сервер в ответ на описание каталога W выдаёт новое описание W1. Далее процесс R скачивает недостающие или не правильные файлы и обновляет и атомарно подменяет их в W (rename downloading.tmp goodname.so). Так же процесс R удаляет файлы, которых нет в новой версии W1.

  4. Так же нужно, чтобы процесс R служил неким простым systemd, который бы умел простую вещь: понимать список запущенных процессов, их sha1 и их аргументов. Если у процесса A это меняется (поменялся sha1 и был скачан новый бинарник), то старому надо послать TERM или -9 и запустить его заново. То есть, помимо W1 передаётся некий список RUN1, где перечислены бираники и их sha1, которые щас должны работать.

В общем, обмен списком содержимого каталога и поддерживальщик запущенности бинарников таким sha1, которые есть в списке «должно быть запущено». Всё лежит на рамдиске, теряется при первом же ребуте. Единственно стабильные вещи это:

  • имя роли
  • запущенные процесс R с флешки
  • гвоздями прибитый домен «дистрибьютора», куда можно прийти с ролью и сказать «чо почём, как дила, я роль N, мой W такой-то, дай новый W1 и RUN1».

Белых айпишников нет, в железки никто пойти не может.

Такие дела. Есть чё?

P.S. За пару вечеров нафигачил на C++ костяк собственного решения. Не сложное что-то. Оно же будет служить и заменой systemd для моих «демонов». Сделать fork() + execve() оказалось легко и не больно, а получать SIGCHLD и узнавать кто подох и перезапустить через заданный таймаут тоже проще простого. В общем, получается такой компактное решение, которое всё что надо делает из коробки…



Последнее исправление: lesopilorama (всего исправлений: 2)

sha1 процесса это как? У тебя все исполняемые файлы статически слинкованы? Если нет, то как быть с списком .so, которыми пользуется запускаемый бинарник? В целом выглядит как велосипед. Чем deb-то не устроил?

cobold ★★★★★
()

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

ac130kz ★★
()
Ответ на: комментарий от cobold

sha1 процесса это как? У тебя все исполняемые файлы статически слинкованы? Если нет, то как быть с списком .so, которыми пользуется запускаемый бинарник? В целом выглядит как велосипед. Чем deb-то не устроил?

Не процесса, а запускаемого бинаря. Список .so подвозится в тот же каталог и линкеру передаются нужные аргументы.

lesopilorama
() автор топика
Ответ на: комментарий от cobold

Чем deb-то не устроил?

Тем, что он модифицирует корень, всякие там реестры установленного ПО или как там это называется… а надо только один маленький каталог в tmpfs.

lesopilorama
() автор топика
Ответ на: комментарий от ac130kz

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

Тут минус в том, что на каждый бинарник, который вдруг понадобилось запускать придётся что-то мутить с /etc/systemd/, а это readonly всё.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

в принципе можно и ридонли сервис запилить, и при апдейте авторестарт. Всё делается силами лишь встроенных systemd/runit/… и apt/pacman/…, никуда бегать не нужно

ac130kz ★★
()
Ответ на: комментарий от lesopilorama

Если ты про /var/lib/apt, то ничего не мешает смонтировать и туда тмпфс. В остальном он кладет файлы туда, куда указано, плюс запускают инсталл скрипты, которые могут перезапускать что-то, накатывать какие-то миграции.

cobold ★★★★★
()