RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Система оповещения о превышении допустимой температуры в серверной на основе связки Nagios + Digitemp [2011]
Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp. Процесс изготовления простейшего контроллера шины 1-Wire DS9097 для съёма показаний с датчика температуры DS1820 и установки программы Digitemp на FreeBSD подробно описан в статье http://www.lissyara.su/articles/mad_hands/computers/ds9097+ds1820/ В статье http://www.lissyara.su/articles/freebsd/programms/mrtg+digitemp/ описано применение этого устройства для отображения графиков изменения температуры в помещении серверной. Однако, участь всё время пялиться в монитор, отслеживая момент, когда сломается кондиционер не совсем подходит для . . . (здесь могло бы быть Ваше резюме) ;). Представим себе ситуацию: мы сидим в последнюю тяпницу июля в кафе . . . , а где-то там перегреваются сервера . . . ЖУТЬ!
Имеем Сервер с операционной системой FreeBSD 8.1-RELEASE amd64 с установленной и настроенной системой мониторинга Nagios (каминг сун). К COM-порту сервера подсоединен контроллер DS9097 с датчиком температуры DS1820, на сервере установлена и настроена программа Digitemp. Как мы видели в предыдущей статье, с датчика DS1820 можно снять показания значения температуры в градусах Цельсия и в Фаренгейтах с точностью до сотых долей. Прозападные Фаренгейты и слишком точные "цельсии” нам не нужны (мы же не самогонку варим) – нам нужно целое число отражающее температуру в градусах Цельсия. Команда для получения нужного параметра выглядит так:
Теперь прикручиваем это всё к Nagios Немного лирики (теория). Для проверки какого-либо сервиса Nagios использует соответствующие программы/команды, которые описываются в файлах конфигурации примерно в таком виде:
В данном примере переменные: - USER1 соответствует местонахождению проверочных программ (обычно определяется в файле resource.cfg;
$USER1$=/usr/local/libexec/nagios
- HOSTADDRESS – адрес проверяемого узла; - ARG1 – порог предупреждения (при превышении, которого статус проверяемого сервиса меняется на Warning); - ARG2 – порог аварии (при превышении – статус Critical).
Никто не запрещает писать свои команды со своими переменными.
При выполнении, такая команда должна опросить сервис "чёта_там” на узле HOSTADDRESS и получить от него какие-то данные. Эти данные сверяются со значениями порогов. В зависимости от результата проверки проверочная программа может завершиться с кодом:
0 – ОК всё нормально; 1 – Warning – превышено значение ARG1; 2 – Critical - превышено значение ARG2; 3 – Unknown – непонятки.
Термин «превышение» я использовал чисто для наглядности, применительно к процессу наблюдения за перегревом. Ведь существуют и ситуации, когда важно знать - насколько что-то там понизилось. Адрес узла нам не нужен (мы проверяем помещение, а не какой-то сервер). Наша команда проверки температуры должна принимать на входе только значения порогов срабатывания оповещений и завершаться с выдачей показания текущей температуры и возвращать одно из трёх значений (0,1 или 2). Простейший скрипт будет выглядеть следующим образом.
#!/bin/sh T=`/usr/local/etc/digitemp/digitemp -a -q -o "%.C" -c /usr/local/etc/digitemp/.digitemprc` if test `expr $2 - $T` -gt 0 then echo "OK " $T exit 0 fi
if [ `expr $T - $4` -gt 0 ] then echo "OVERHEAT " $T exit 2 fi
echo "WARNING " $T exit 1
Небольшие пояснения для тех, кто мало знаком с программированием на shell. Переменные могут быть только строковыми (string), т.е. запись
F=314
не создаст переменную $F, содержащую целое значение триста четырнадцать а, создаст строковую переменную $F, содержащую символы три, один и четыре. Для того чтобы выполнить какую-нибудь математическую операцию используют конструкцию вида:
‘expr $F‘
Переменные вида $число (в данном примере $2 и $4)в программах на shell соответствуют подстрокам (параметрам) перечисленным после указания самого исполняемого файла. Если была запущена программа /гдетотам/прога –w 25 –c 30 Значения переменных переданных в программу «прога» будут
$1 "-w” $2 "25” $3 "-c” $4 "30”
Данный скрипт вполне рабочий, его можно использовать, но он не содержит никаких проверок входных данных, хотя, если вы пишите чисто для внутреннего применения, такой подход можно (да и то с натяжкой) применять на практике. Сколько уязвимостей находится/эксплуатируется каждый день из-за того, что кто-то в погоне за призрачной прибавкой в скорости поленился проверить входные данные. Простейшая проверка $1 могла бы выглядеть примерно так
if [ "-w"=$1 ] then WARNLIM=$2 else echo "Unknown input parameter" exit 3 fi
Теперь пора перейти к практике.
Настраиваем Nagios. Создаем команду проверки
#ee /usr/local/libexec/nagios/checkthermo.sh
#!/bin/sh
T=`/usr/local/etc/digitemp/digitemp -a -q -o "%.C" \
-c /usr/local/etc/digitemp/.digitemprc`
if test `expr $2 - $T` -gt 0
then
echo "OK " $T
exit 0
fi
if [ `expr $T - $4` -gt 0 ]
then
echo "OVERHEAT " $T
exit 2
fi
echo "WARNING " $T
exit 1
Возможные грабли: Если вы используете сторонние скрипты (скачанные из интернета, например), убедитесь, что они действительно написаны на Shell. Линуксяторы используют BASH, и такой скрипт может у вас не заработать. В данном случае установите BASH из портов и поменяйте первую строку на #!/usr/local/bin/bash Делаем наш скрипт исполняемым
define host{ use freebsd-server host_name 0_THERMAL_0 alias thermal address 172.17.254.119 hostgroups 101 parents monitor icon_image gradusnik.png statusmap_image gradusnik.png }
Для наглядности я сделал отдельный виртуальный хост для того, чтобы в таблице сервисов запись о состоянии температуры шла отдельной строкой, хотя это дело вкуса. В таблице хосты расставляются по алфавиту и, чтобы показания были сверху я название для хоста начал с нолика. Теперь определим сервис
После того, как Nagios перечитает конфигурацию, уведомления о превышении температуры будут получать члены контакт группы admins. Что и требовалось.
Теперь рассмотрим ситуацию, когда необходимо мониторить температуру в удалённом помещении (в серверной филиала, например) или, как в моём случае, нет возможности подцепить датчик напрямую к серверу наблюдения (низковольтный COM-порт или отсутствие такового вообще). Я подключил датчик к другому серверу, на котором было поднято приложение NRPEhttp://en.wikipedia.org/wiki/NRPE (Сервер, конечно на FreeBSD). В данном случае помещаем наш проверочный скрипт checkthermo.sh в папку /usr/local/libexec/nagios/ удалённой машины. В конфигурацию NRPE добавляются такие строки:
вторая строка содержит ссылку на скрипт digitemp3.sh с таким содержанием
#!/bin/sh /usr/local/etc/digitemp/digitemp -a -q -o "%.C" -c /usr/local/etc/digitemp/.digitemprc
С помощью него я получаю данные для MRTG. У меня стоит опция
dont_blame_nrpe=0
поэтому входные параметры для команд я прописываю сразу на удалённой стороне. В данном случае описывать команду проверки не нужно, а описание проверки сервиса будет выглядеть так: