Система мониторинга на bash’е

Систем мониторинга существует достаточно много, у каждой есть свои плюсы и минусы. Тем не менее, для того, чтобы лучше понять основные принципы, используемые при разработке систем мониторинга, я предлагаю написать свою. Система мониторинга на bash’е хороша тем, что все для ее работы на машине скорее всего уже есть. У нее, естественно, есть и недостатки, куда без них. Но как пример она нам отлично подойдет.

Принципы работы

Прежде чем начинать писать, надо определиться, как будет устроена наша система мониторинга. Не будем усложнять архитектуру, сделаем как можно проще. Пусть у нас будет только серверная часть, клиентской части не будет. И задача у нас будет только одна, и притом простая — проверять, в сети ли машина, за которой мы следим, точнее, пингуется ли она. Для больших сетей такой вариант не подойдет, возможно, будет недостаточно информативен, а для небольшой локальной сети на пару десятков машин его может быть вполне достаточно.

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

Да, надо как-то назвать систему мониторинга, желательно оригинально. Пусть будет Byams (Bash-written Yet Another Monitoring Script). Написанный на баше еще один скрипт мониторинга. :) Будем надеяться, что это название еще не занято.

Приступим

Начнем с первого этапа — подключение хоста к нашей системе мониторинга. На практике это просто запись информации об адресе или доменном имени хоста в какой-то файл. Пусть это будет /etc/byams/hosts, например.

Вот пример этого файла:

192.168.0.10

Для простоты будем писать один единственный файл скрипта, который будет добавлять в мониторинг хост, удалять из мониторинга хост и, собственно, мониторить хосты, находящиеся в списке. И выглядеть это будет следующим образом:

byams add 
byams remove 
byams

Как вы уже поняли, если скрипт запущен без параметров, он просто запустит мониторинг всех хостов, находящихся в данный момент в списке.

Ну, и для простоты настройки давайте вынесем файл с настройками в директорию /etc/byams. Вы можете, в принципе, вынести этот файл в любую директорию, доступную пользователю, от имени которого скрипт будет запускаться, поскольку он не требует привелегий суперпользователя для своей работы, достаточно прав обычного пользователя.

Подробно

В файле настроек будет находиться следующее:

# Директория, где будет храниться файл с данными
DATA_DIR="/etc/byams"
# Название самого файла для хранения данных
DATA_FILE_NAME="hosts"
# Адрес электронной почты, на который будут посылаться оповещения о недоступности хостов
MAILTO=root@localhost

Вот как будет выглядеть сам скрипт:

#!/bin/bash

# Подключаем файл настроек
. /etc/byams/byams.conf

# Формируем полное имя файла с данными
DATA_FILE="$DATA_DIR/$DATA_FILE_NAME"

add_to_monitoring(){
  # Дописываем IP-адрес или имя хоста в файл данных
  echo $2 >> $DATA_FILE
}

remove_from_monitoring(){
  # Удаляем IP-адрес или имя хоста из файла данных
  sed -i '/$2/d' $DATA_FILE
}

run_monitoring(){
  # Для каждого хоста из списка, содержащегося в файле данных
  # последовательно выполняем функцию check_host
  for HOST in `cat $DATA_FILE`
  do
    check_host $HOST
  done
}

check_host(){
  # Функция check_host может содержать любые действия по проверке
  # доступности одного хоста и реакции на недоступность этого хоста
  # В нашем случае мы просто посылаем один ICMP-пакет, и если пришел ответ, значит
  # всё в порядке, если не пришел, то переменная RESULT получит пустое значение
  RESULT=`ping -c 1 $1 | grep ttl`
  if [ "$RESULT" == "" ]
  then
    # А здесь будут выполнены действия по извещению о недоступности хоста
    # Мы просто посылаем письмо о том, что хост, который мы проверяем, недоступен
    MESSAGE="$1 is unavailable"
    echo "$MESSAGE" | mail -s "$MESSAGE" $MAILTO
  fi
}

case "$1" in
  add)
    add_to_monitoring $2
  ;;
  remove)
    remove_from_monitoring $2
  ;;
  *)
    run_monitoring
  ;;
esac

Вот такая простая система мониторинга, состоящая из одного скрипта на bash’е, у нас получилась. Вы можете ее расширить так, как вам это необходимо. Самое главное, что она показывает — для решения задачи простого мониторинга доступности машин в локальной сети необязательно ставить какую-то серьезную систему мониторинга, например, Nagios или Cacti, а можно обойтись простым скриптом размером до 1 килобайта, реализующего в удобном виде добавление хоста в мониторинг, исключение хоста из мониторинга и автоматическое извещение о недоступности хоста, включенного в мониторинг, поскольку этих функций часто бывает достаточно.

Автоматический запуск

Автоматический запуск можно обеспечить, включив вызов скрипта в таблицу заданий cron’а.
Причем, поскольку для работы этого скрипта не требуется прав root’а, включать вызов скрипта можно в таблицу заданий непривелегированного пользователя, либо включать его вызов в глобальный crontab, и указывать в нем для запуска логин непривелегированного пользователя.

[wysija_form id=»2″]