Tuesday, December 15, 2015

UnixDaemonReloader - перезапуск демонов при модификации конфигов.
(Update 2016.01.03)



     Серия "мои поделки" или "и снова изобретаем велосипед" продолжается ;)
     Занялся я в последнее время кластеризацией всевозможных сервисов. Таких как почта, прокси, VoIP и т.п. Ну чтоб и баланс нагрузки, и отказоустойчивость, ну и для опыта полезно что-то новое делать и изучать. Предприятию опять же польза :) И встала у меня задача, не только синхронизировать конфиги определённых сервисов на разных хостах, но и как-то реагировать не эти изменения... Ну допустим на мастер хосте изменили конфиг postfix, он отреплицировался на вторую ноду кластера, и что дальше ? Надо как-то передёрнуть postfix, вернее сказать ему reload. И так, и сяк я пробовал, и в скрипт синхронизации многострочные конструкции встраивал, которые определяли наличие изменений и делали разные действия, перезагружали и заставляли перечитывать конфиги разные сервисы. В общем было название этому: геморрой. Встал я как-то утром, покачал спину, и решил сделать программу которая будет сама висеть демоном, перечитывать свой конфиг перед каждым циклом работы и выполнять действия которые ей предписаны в случае изменения заданных файлов. Сказано - сделано! И название я этому сервису дал - UnixDaemonReloader :)

Конфигурацияонный файл:













     Собственно конфиг вполне простой. Описываем где у нас живёт шелл и с каким ключом он может выполнять внешние команды в таком виде: /bin/sh -c "ps ax" , затем в виде списка задаем строки с отслеживаемыми файлами и каталогами:

["/каталог", "файл", "действие", "предварительное действие", "результат предварительного действия","скрипт ошибки предварительного действия"],

["/каталог", "маска*файла*", "действие", "", "",""],
["/каталог", "!все*файлы*кроме*этого,!кроме*этого,!и*кроме*этого", "действие"]

Обновление от 2016.01.03: 
     Добавлены параметры "скрипт предварительной проверки", "результат удачной проверки" и "скрипт в случае ошибки проверки" в список файлов для отслеживания в кофигурационном файле. Скрипт предварительной проверки должен возвращать результат проверки на стандартный вывод. Например: "OK". Если Возвращенное текстовое значение равно тому что в конфиге - выполняется скрипт перезапуска, иначе после окончания попыток проверки исполнится скрипт ошибки. Смотри README.md для ознакомления с новым синтаксисом.
     PS: Вы можете добавить в скрипт предварительной проверки например проверку конфига на правильность или бекап конфига. В скрипт ошибки тоже можно добавить отправку E-Mail, SMS или возврат копии конфига из бэкапа.
     Добавлен параметр UDR_ScriptsPath, указывающий путь к предварительным скриптам.
     Добавлен параметр UDR_PreAppAttempt, указывающий количество попыток исполнения скрипта предварительной проверки, поселе чего исполняется скрипт обработки ошибки или попытки прекращаются.
     Исправлен тотальный перезапуск всего и вся после первого создания базы файлов.
Обновление от 2015.12.23: 
UDR_PauseBefore - пауза в секундах перед запуском скрипта. Этот параметр сделан для того, что бы если вы вдруг случайно во время редактирования конфига сохранили файл "недоделанным", то у вас было время на исправление ошибки до перезапуска демона.
UDR_ScriptsPath - путь до папки со скриптами предварительной проверки.
UDR_PreAppAttempt - количество попыток исполнения файла проверки конфигурации
UDR_PauseBefore - пауза в секундах перед запуском скрипта. Этот параметр сделан для того, что бы если вы вдруг случайно во время редактирования конфига сохранили файл "недоделанным", то у вас было время на исправление ошибки до перезапуска демона.
Sleep_Time - сколько спать между циклами проверки конфигов,
SQLite_DB - путь к базе SQLite, в которой хранятся контрольные суммы файлов.

     Действия могут быть разными, не обязательно restart, reload или "kill -HUP", можно например вызвать мейлер и отправить сообщение, что дескать, файл изменили :)
     Применять, опять же, можно не только на кластерах, но и на обычных серверах, чтоб не перестартовывать сервисы руками :)

     Программа написана на Go, т.е. собрать из исходников можно под что угодно, linux, bsd, mac,  да хоть под Android.

     Исходники:
          UnixDaemonReloader Source Code

     Скомпилированные версии для FreeBSD и Linux:
          UnixDaemonReloader on SourceForge
          UnixDaemonReloader on My Google Drive

No comments :

Post a Comment