03 апреля 2016

Мониторинг хостов на коленке, за 5 минут, на Bash

Мне понадобилось организовать мониторинг доступности хостов по сети используя минимум ресурсов. Очевидно что использовать для этого тяжелую артиллерию в виде Zabbix не разумно.

Посему я на коленке накидал скрипт который:
1. Опрашивает хосты через ping.
2. Оповещает по почте при падении хоста.
3. Оповещает по почте когда хост поднимается.
2. Записывает последний статус хоста, чтобы не отправлять повторные оповещения.








Записываем хосты в файл /home/scripts/monhosts в виде:
10.10.2.1 R-KRASNOGORSK 1
10.10.3.1 R-ZAGOPINSK 1

Где:
10.10.2.1 - IP для ping
R-KRASNOGORSK - имя хоста
1 - начальный статус

Создаем скрипт /home/scripts/mon.sh
#!/bin/bash
# Начальные настройки
FILE="/home/scripts/monhosts"
FILETMP="/home/scripts/monhosts.tmp"
MAILFROM="robot@example.com"
MAILTO="alarm@example.com"
SMTP="smtp.yandex.ru"
SMTPPASS="111"


cp $FILE $FILETMP
> $FILE

while read -r IP HOST STATUS
  do

  RESULT=`ping -c 5 $IP | grep ttl`
  if [ "$RESULT" == "" ] && [ "$STATUS" == "1" ];
  then
    sendEmail -f $MAILFROM -t $MAILTO \
    -u "$HOST упал" -m "Не доступен хост $HOST" \
    -s $SMTP \
    -o tls=yes -xu $MAILFROM -xp $SMTPPASS   
    STATUS=0
  elif [ "$RESULT" != "" ] && [ "$STATUS" == "0" ];
  then
    sendEmail -f $MAILFROM -t $MAILTO \
    -u "$HOST поднялся" -m "$HOST снова доступен" \
    -s $SMTP \
    -o tls=yes -xu $MAILFROM -xp $SMTPPASS
    STATUS=1
  fi
  echo "$IP $HOST $STATUS" >> $FILE
done <"$FILETMP"

rm $FILETMP
exit

Делаем его исполняемым
chmod +x /home/scripts/mon.sh

Добавляем задание в Cron на запуск каждые 30 минут
*/30 *   * * *   root    /bin/bash /home/scripts/mon.sh