Sentinela — это сторожевой таймер операционной системы с широкими возможностями настройки, который может выполнять действия на основе предварительно настроенных правил.
Первоначальной мотивацией было создание демона, который будет отслеживать набор файлов журналов и в случае отсутствия активности выключать операционную систему. Это было чрезвычайно полезно для обеспечения завершения работы моих экземпляров ec2 после определенного времени простоя.
Учитывая модульную природу Sentinela, вы также можете расширить его для мониторинга сетевого трафика, процессов, использования диска и т. д., а также выполнять любые действия, такие как отправка электронной почты, отправка оповещений SNMP и т. д.
Sentinela настраивается с помощью файла config/sentinela.cfg
, который позволяет включать правила, которые будут выполняться.
Правила определяются в коде Python и находятся в каталоге rules/
. В большинстве случаев правила используют два разных типа модулей: * modules/monitors/
: каждую минуту считываются из ресурса и сохраняются его статус. При необходимости верните True
чтобы вызвать действие. * modules/actions/
: Действия запускают команду, отправляют электронное письмо или любой другой код, определенный Python, который вы можете себе представить.
Чтобы запустить Sentinela, вам нужно запустить: text sudo python sentinela.py
Вы можете отслеживать все действия Sentinela, прочитав файл /var/log/sentinela.log
. Обычный файл журнала Sentinela выглядит следующим образом:
[2013-03-29 11:41:20,440][ИНФО] Началось успешно [2013-03-29 11:41:20,441][ОТЛАДКА] Импортированные правила.apache_shutdown [2013-03-29 12:51:50,480][ОТЛАДКА] Сентинела жива ... [2013-03-29 12:58:34,009][ОТЛАДКА] Собираюсь выполнить команду «завершение работы сейчас -h».
Создать свои собственные правила легко. Допустим, мы хотим создать правило, которое печатает имя монитора в файл журнала Sentinela, когда файл журнала /var/log/apache2/access.log
неактивен в течение 10 минут. Код будет выглядеть следующим образом:
1: из модулей.monitors.new_log_entries импортировать NewLogEntries 2: из модулей.actions.debug_print импортировать DebugPrint 3: 4: apache_log = NewLogEntries('/var/log/apache2/access.log', 10) 5: debug_print = DebugPrint() 6: 7: 8: защита call_every_mine(): 9: если apache_log.call_every_mine(): 10: debug_print.do(apache_log)
Общие правила будут иметь монитор и действие, в данном случае это NewLogEntries
и DebugPrint
(строки 1 и 2).
Оба они должны быть созданы на уровне модуля (строки 4 и 5), чтобы иметь возможность сохранять состояние. Если вы создаете экземпляры монитора или действия внутри call_every_minute
каждый раз будет создаваться новый экземпляр, и состояние не будет сохраняться.
Мониторы и действия могут иметь параметры, в этой строке 4 мы видим, как монитор NewLogEntries
принимает два параметра:
True
Чтобы правило было действительным, необходимо определить функцию call_every_minute
(строка 8). Эта функция, как следует из названия, будет вызываться Sentinela каждую минуту. Вы можете определить любые действия, которые будут выполняться в этом контексте, но мы решили вызвать метод монитора call_every_minute
и на основе его возвращаемого значения вызвать действие с экземпляром apache_log
в качестве параметра.
apache_log.call_every_minute()
вернет True
только в том случае, если в файле, переданном в качестве параметра, не будет новых записей в течение 10 минут.
debug_print.do
напечатает имя монитора, переданное в качестве параметра.
После того как вы создали собственное правило, вам нужно будет выполнить следующие шаги, чтобы запустить его:
.py
в каталог rules/
установки Sentinela.config/sentinela.cfg
, включив в него имя вашего правила (без расширения).Примеры правил можно найти в каталоге sendinela/rules этого репозитория.
Чтобы протестировать новые правила перед их развертыванием, вы можете выполнить следующие действия.
Сообщайте о своих проблемах и пожеланиях к функциям в системе отслеживания проблем Sentinela, и я буду более чем рад их исправить.