У меня давно была идея сделать мониторинг нескольких хостов, но смысла мониторить изнутри нету, если пропадет доступ в интернет, толку от такого мониторинга не много.


Когда Oracle стали раздавать пару виртуалок на халяву, я подумал, вот оно. Я быстренько накрутил там Zabbix, настроил оповещение в Телеграм и около месяца все было отлично. А потом.... Потом оракловый агент на этой машине сожрал всю память. Я полез разбиратся, агента убил, справедливость востановил, но обратил внимание, что mysql даже после тюнинга и настройки все равно мегабайт 200 в памяти держит, а у меня всего 1024.

Тут я подумал, зачем собственно мне забикс, ради 4 проверок? Начал искать что-то попроще и нашел(со второго или третьего раза), это Monit.

Это простое как две копейки приложение, консольное. Есть пара файлов с настройками.  

  • monitrc - основной файл с настройками, ничего особо там менять не надо, кроме частоты опроса, лежит где-то тут: /etc/monit
  • файл с настройками конкретного сервиса, как бы вы его не назвали, лежит где-то тут: /etc/monit/conf.d

Мой файл с настройками ниже, мне кажется даже объяснять ничего не надо.

check host yandexru.ping with address yandex.ru
    if failed icmp type echo count 3 with timeout 10 seconds
      then exec "/opt/telegram/telegram.sh TELEGRAM_ID PING"
      else if succeeded then exec "/opt/telegram/telegram.sh TELEGRAM_ID PING"
check host yandex.ru with address yandex.ru
    depends on yandexru.ping
    if failed port 80 protocol HTTP
      request /
      with timeout 3 seconds
      then exec "/opt/telegram/telegram.sh TELEGRAM_ID HTTP"
      else if succeeded then exec "/opt/telegram/telegram.sh TELEGRAM_ID HTTP"
    if failed port 443 protocol HTTPS
      request /
      with timeout 3 seconds
      then exec "/opt/telegram/telegram.sh TELEGRAM_ID HTTPS"
      else if succeeded then exec "/opt/telegram/telegram.sh TELEGRAM_ID HTTPS"
    if failed port 22 protocol SSH
      with timeout 3 seconds
      then exec "/opt/telegram/telegram.sh TELEGRAM_ID SSH"
      else if succeeded then exec "/opt/telegram/telegram.sh TELEGRAM_ID SSH"

У меня сделано два сервиса, для того, чтобы если упал целиком хост, то остальное не проверять. Жирным выделен именно хостнейм который надо проверять, после host идет просто название сервиса.

Первый сервис проверяет просто пинг. Второй уже по отдельным сервисам. В случае падения, мне в телеграм отправляется вообщение. TELEGRAM_ID это мой номер в телеграме. Скрипт отправки проще некуда, для работы скрипта нужно создать бота.

#!/bin/bash
token='BOT_ID:BOT_HASH'
chat="$1"
subj="$2"
event=$MONIT_EVENT
desc=$MONIT_DESCRIPTION
host=$MONIT_HOST
service=$MONIT_SERVICE
date=$MONIT_DATE
subj="${subj} - ${event}</b>"
if [[ "$event" == "Connection failed" ]]; then
        subj="<b>⛔PROBLEM: ${subj}"
elif [[ "$event" == "Connection succeeded" ]]; then
        subj="<b>✅RESOLVED: ${subj}"
else
        subj="<b>❔UNKNOWN : ${subj}"
fi
message="<code>Date: ${date}. \nDescription: ${desc}. \nService: ${service}. </code>"
/usr/bin/curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${chat}\",\"text\":\"${subj}\n${message}\",\"parse_mode\":\"html\"}" "https://api.telegram.org/bot${token}/sendMessage"

Скрип странно отобразился, но это не меняет его сути, тут все очень просто. Нужно только указать BOT_ID и BOT_HASH. BotFather вам в помощь.

На выходе получаются сообщения.

Такие дела.