Настройка мониторинга температуры в серверной
Настал момент когда захотелось удаленно мониторить температуру в серверной, а также следить за тем как холодит кондиционер.
Следить за температурой мы будем с Linux-хоста в котором есть COM(RS-232)-порт. Если таковой отсутствует, то можно приобрести переходник USB->RS232
Для измерения температуры используются датчики температуры DS1820 от Dallas

На этой схеме:
Два диода Шотки 1N5818
Стабилитрон 1N5228 3.9 V
Стабилитрон 1N5234 6.2 V
Резистор 1.5 кОм.
9 -pin’овый разъем ( для подключения к Com – порту материнской платы )
При данной реализации схемы мы используем всего 2 провода для подключения датчика (земля и питание закорочены), что уменьшает количество используемых датчиков и максимальную длину кабеля, по данным из интернета – такая схема может вытягивать 10датчиков на длине 60м. Собственно мне больше и не нужно 🙂
Схема в сборе
Схему я спаял на плате и поместил в корпус RS232 разьема.
Фото:
Установка и настройка Digitemp
Для сбора информации с датчиков используется программа Digitemp
Установка программы в Gentoo :
USE="ds9097" emerge digitemp |
Установка программы в Ubuntu :
apt-get install digitemp |
Теперь попробуем инициализировать датчики:
digitemp_DS9097 -i -s /dev/ttyS0 В ответ нам выдаст: ...... Searching the 1-Wire LAN 10FBF32C020800C2 : DS1820/DS18S20/DS1920 Temperature Sensor ROM #0 : 10FBF32C020800C2 Wrote .digitemprc |
Собственно все замечательно.
Примечание: Если подключать схему через USB-переходник. то необходимо в системе установить libusb и включить в ядре
USB_SERIAL=y |
а так-же выбрать правильный драйвер. Я не мучался и включил поддержку для почти всех USB-контроллеров.
При этом инициализация датчиков происходит где-то так:
digitemp_DS9097 -i -s /dev/ttyUSB0 |
Продолжаем……
После того как датчики инициализировась необхимо с них снимать показания:
digitemp_DS9097 -a -s /dev/ttyS0 DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane GNU Public License v2.0 - http://www.digitemp.com Jul 01 17:26:27 Sensor 0 C: 18.62 F: 65.53 |
Тут помимо температуры вываливается куча спама, чтоб его отсеять:
digitemp_DS9097 -t 0 -s /dev/ttyS0 -q -o "%.2C" |
Собственно вот и температура….. но теперь ее нужно как-то визуализировать… тут 2 варианта:
– с помощью rrdtool рисовать графики по показаниям
– передавать данные о температуре по SNMP в Cacti
Реализуем оба варианта.
Создание графика температуры с помощью RRDTool
Для рисования с помощью rrdtool необходимо установить его 🙂 а так-же иметь настроеный веб-сервер (о его настройке можно почитать в инете)
Создаем скрипт отрисовки
cat /script/temperature/get.sh
#!/bin/bash # переходим в каталог скрипта cd /script/temperature/ # Команда для получения текущей температуры с датчика! SENSOR=`digitemp_DS9097 -t 0 -s /dev/ttyUSB0 -q -o "%.2C"` RRDTOOL=/usr/bin/rrdtool # Путь к базе, в которой храниться температура DATABASE=/script/temperature/space-temperature.rrd # Периодичность поступления данных в базу (сек) - соответственно должен быть настроен CRON PERIOD=60 # Путь к папке, в которой будут лежать изображения с графиками зависимости, каталог web-сервера. IMAGE_PATH=/var/www/xxxx.com.ua/weather/ #Сохраняем значение в файл echo $SENSOR > $IMAGE_PATH/temp.txt # Горизонтальная надпись в заголовке графика TITLE_TEXT='Температура' # Горизонтальная надпись в легенде под графиком UNDER_TEXT='Статистика температуры' # ========= ШАГ 1. Запись в базу данных полученных значений температуры ====== # Проверяем, присутствует ли вообще база для температуры. Если нет - создаём if ! [ -f $DATABASE ] then $RRDTOOL create $DATABASE -s $PERIOD DS:temperature:GAUGE:600:U:U \ RRA:AVERAGE:0.5:1:576 \ RRA:AVERAGE:0.5:6:672 \ RRA:AVERAGE:0.5:24:732 \ RRA:AVERAGE:0.5:144:1460 fi $RRDTOOL update $DATABASE N:$SENSOR # ============================================================================ # Функция для построения зависимости температуры от времени function DRAW_GRAPHIC { # Определяем время, во сколько генерируется график NOW_HOUR=`date +%H` NOW_MIN=`date +%M` NOW_SEC=`date +%S` # На основе параметра 2, переданного функции вычисляем какой комментарий написать case $2 in day) TIME_TEXT="за последние 24 часа" ;; week) TIME_TEXT="за последнюю неделю" ;; month) TIME_TEXT="за последний месяц" ;; year) TIME_TEXT="за последний год" ;; esac $RRDTOOL graph $IMAGE_PATH/$1 \ -s -1$2 \ -e now \ -a PNG \ -v 'градусы Цельсия' \ -t "$TITLE_TEXT $TIME_TEXT" \ -r \ -E \ -i \ -R light \ --zoom 1 \ -w 500 \ -h 150 \ --font DEFAULT:10:/usr/share/fonts/corefonts/arial.ttf \ DEF:temperature=$DATABASE:temperature:AVERAGE \ LINE2:temperature#33cc33 \ GPRINT:temperature:LAST:'Текущая\:%2.1lf'\ GPRINT:temperature:MIN:'Мин\:%2.1lf' \ GPRINT:temperature:MAX:'Макс\:%2.1lf' \ GPRINT:temperature:AVERAGE:'Средняя\:%4.1lf' } # ========= ШАГ 2. Отрисовка графиков зависимости температуры от времени ======== DRAW_GRAPHIC 'temp_d.png' 'day' DRAW_GRAPHIC 'temp_w.png' 'week' DRAW_GRAPHIC 'temp_m.png' 'month' DRAW_GRAPHIC 'temp_y.png' 'year' |
Добавляем в crontab наш скрипт:
*/1 * * * * root /script/temperature/get.sh |
После того как сгенерировались графики, нужно их вывести на экран.
Для этого можно использовать простенькую страничку
cat /var/www/xxxxx.com.ua/weather/index.php
<html> <head> <meta charset='utf8'> <title> Temperature </title> </head> <body bgcolor='#B8860B'> <br> <center> <h2><font face='Arial'>Температура в комнате</font></h2> <?php $text = file_get_contents( "temp.txt" ); ?> <center> <h1><font color="#FFFFFF" face='Arial'><?php print $text ?> C°</h1></font> <br><br> <center> <img src='temp_d.png'> </center><br> <center> </h2> <img src='temp_w.png'> </center><br> <center> <img src='temp_m.png'> </center><br> <center> <img src='temp_y.png'> </center> </body> </html> |
Пример отрисовки http://weather.21th.com.ua/
Мониторинг с помощью Cacti
Будем считать, что Cacti уже установлен и настроен 🙂
Пишем небольшой скриптец который снимает показания с датчика температуры и выдает ее в stdout
cat /scripts/checktemp
#!/bin/bash digitemp_DS9097 -t 0 -s /dev/ttyS0 -q -o "%.2C" | tail -n 1 |
Теперь нужно обьяснить утилите SNMP откуда брать температуру и в какой oid выкладывать значения.
Для этого нужно в файл /etc/snmp/snmpd.conf добовить такую строчку:
...... extend .1.3.6.1.4.1.2021.2000.1 temp0 /scripts/checktemp |
Перезапускаем SNMP
/etc/init.d/snmpd restart |
Проверяем выдаются ли наши значения по запросу:
snmpwalk -v1 -c public 10.0.0.198 .1.3.6.1.4.1.2021.2000.1 UCD-SNMP-MIB::ucdavis.2000.1.1.0 = INTEGER: 1 UCD-SNMP-MIB::ucdavis.2000.1.2.1.2.5.116.101.109.112.48 = STRING: "/scripts/checktemp" UCD-SNMP-MIB::ucdavis.2000.1.2.1.3.5.116.101.109.112.48 = "" UCD-SNMP-MIB::ucdavis.2000.1.2.1.4.5.116.101.109.112.48 = "" UCD-SNMP-MIB::ucdavis.2000.1.2.1.5.5.116.101.109.112.48 = INTEGER: 5 UCD-SNMP-MIB::ucdavis.2000.1.2.1.6.5.116.101.109.112.48 = INTEGER: 1 UCD-SNMP-MIB::ucdavis.2000.1.2.1.7.5.116.101.109.112.48 = INTEGER: 1 UCD-SNMP-MIB::ucdavis.2000.1.2.1.20.5.116.101.109.112.48 = INTEGER: 4 UCD-SNMP-MIB::ucdavis.2000.1.2.1.21.5.116.101.109.112.48 = INTEGER: 1 UCD-SNMP-MIB::ucdavis.2000.1.3.1.1.5.116.101.109.112.48 = STRING: "17.94" UCD-SNMP-MIB::ucdavis.2000.1.3.1.2.5.116.101.109.112.48 = STRING: "17.94" UCD-SNMP-MIB::ucdavis.2000.1.3.1.3.5.116.101.109.112.48 = INTEGER: 1 UCD-SNMP-MIB::ucdavis.2000.1.3.1.4.5.116.101.109.112.48 = INTEGER: 0 UCD-SNMP-MIB::ucdavis.2000.1.4.1.2.5.116.101.109.112.48.1 = STRING: "17.94" |
Собственно в последней строке и есть наша температура в серверной.
Теперь научим Cacti брать эту температуру и строить график.
Заходим в настройки нашего хоста и добавляем Add Graph Template:SNMP – Generic OID Template

Переходим в раздел “Create Graphs for this Host” , создаем график на основе шаблона

Появится окно настроек нового графика:

В разделе Custom Data нужно ввести значение oid в котором хранится наша температура.
Его полная запись :
extend .1.3.6.1.4.1.2021.2000.1 temp0 /scripts/checktemp
+
UCD-SNMP-MIB::ucdavis.2000.1.4.1.2.5.116.101.109.112.48.1 = STRING: “17.94”
=
.1.3.6.1.4.1.2021.2000.1.4.1.2.5.116.101.109.112.48.1
Полученое значение вставляем в наше поле.
В итоге получаем такой график:
Воть так вот 🙂
Но и это не все! ))))
А если ЧП? Админы во сне графики не видят…. и нужно их как-то уведомить о происходящем.
Проще простого.
Голосовое оповещение о температуре в серверной
Пишем-с скрипт:
cat temp_warn.sh
#!/bin/bash cd /scripts TEMP=`/bin/bash checktemp | cut -b1-2` echo $TEMP if [ $TEMP -gt 33 ] then echo "Temperature in DataCenter is "$TEMP cp /scripts/callfile /var/spool/asterisk/outgoing/ sendEmail -f server@corp.ua -t admins@corp.ua -u "Message from DataCenter №1" -m "Temperature in DataCenter is critical "$TEMP -s smtp.corp.ua:25 -xu server@corp.ua -xp password fi |
Файл checktemp мы используем описаный выше. В результате если температура поднимется выше 33градусов, то всем (ответственным) админам отправится сообщение на почту + выполнится звонок на мобильный телефон.
Звонок на мобильный происходит когда специально подготовленый файл callfile помещается в каталог исходящих звонков Asterisk‘a
Содержимое файла:
cat callfile
Channel: DAHDI/g1/Se0501113355 Application: Playback Data: temp-warning |
temp-warning – это подготовленый звуковой файл который лежит в /var/lib/asterisk/sounds/en/
2 thoughts on “Настройка мониторинга температуры в серверной”
Лучше заранее создать /etc/portage/package.use/digitemp с содержимым
Если использовать USE прямо во время сборки, при обновлении системы будут проблемы 🙂
Вкурсе, так и делаю, в данном случае просто лень было расписывать 🙂