Введение
В процессе обновления парка серверов в компании, я столкнулся с потребностью мониторить их на аппаратном уровне, без привязки к вендору и с минимальными трудозатратами для включения мониторинга на новых железках.
В качестве средства мониторинга у нас используется Zabbix 3.0. Вопрос аппаратного мониторинга до этого не поднимался.
В ходе поисков способа решения данной задачи я остановился на мониторинге через IPMI. Дальнейшие поиски решения навели меня на замечательную статью Vengant Мониторинг серверов HP через iLO в Zabbix. К сожалению его решение подошло мне не полностью, поскольку ориентировано только на HP и не всегда корректно получает информацию с сенсоров. Но сам ход мыслей понравился и я решил действовать в этом же направлении.
По итогам решения этой задачи был создано универсальное решение, которое:
- Использует функцию Auto Discovery. Ручная работа сведена к минимуму. Достаточно добавить новый узел сети, прописать ему ip адрес IPMI и параметры аутентификации
- Работает для всех вендоров и моделей серверов с IPMI 2.0
- Корректно находит все сенсоры, считывает по ним информацию и рапортует если случилась беда
Как это было реализовано
В решении Vengant для поиска сенсоров используется пакет FreeIPMI. К сожалению на серверах HP Gen10 FreeIPMI отдаёт неверные имена сенсоров и zabbix не может корректно по ним получить информацию.
Было принято решение писать свои скрипты. Логически конструкция делится на 2 части
- Скрипт для обнаружения IPMI сенсоров
- Скрипт для генерации JSON для Auto Discovery
В качестве языка выбран bash. В качестве источника данных zabbix-server.log в debug режиме.
Скрипт для обнаружения IPMI сенсоров
Zabbix сервер переведён в режим debug для ведения лога. В этом режиме он пишет подробную информацию по всем найденным IPMI сенсорам в строки вида:
20764:20180322:095415.913 Added sensor: host:'192.168.17.50:623' id_type:0 id_sz:15 id:'21-VR P2 Mem 2' reading_type:0x1 ('threshold') type:0x1 ('temperature') full_name:'0(20.24).21-VR P2 Mem 2'
В этой строке нас интересуют 4 значения:
- host — ip адрес хоста, которому принадлежит сенсор
- id — имя сенсора
- reading_type — тип считывателя сенсора
- type — тип сенсора
Была создана отдельная таблица в БД zabbix. Все найденные сенсоры аккуратно туда заносятся. На выходе получается такой результат
Скрипт запускает cron каждые 3 минуты.
#!/bin/bash
# options
zabbixlogtemp=/tmp/zabbixlogtemp
IFS=$'n'
db="zabbix"
table="ipmi_sensors"
dbuser="user"
dbuserpass="password"
# body
cat /var/log/zabbix/zabbix_server.log | grep 'Added sensor' > $zabbixlogtemp
for line in $( cat $zabbixlogtemp)
do
host=`echo "$line" | cut -d ":" -f 5 | sed "s/'//g"`
id=`echo "$line" | cut -d ":" -f 9 | sed "s/'//g" | sed 's/ reading_type//g'`
rtype=`echo "$line" | cut -d ':' -f 10 | cut -d ' ' -f -1`
type=`echo "$line" | cut -d ':' -f 11 | cut -d ' ' -f -1`
chk=`mysql -u $dbuser -p$dbuserpass -D $db -e 'SELECT * FROM '$table' WHERE host = "'$host'" and id = "'$id'" and rtype = "'$rtype'" and type="'$type'";';`
if [ -z $chk ]
then
mysql -u $dbuser -p$dbuserpass -D $db -e 'INSERT INTO '$table' (host, id, rtype, type) VALUES ("'$host'", "'$id'", "'$rtype'", "'$type'");';
fi
done
Скрипт для генерации JSON для Auto Discovery
В правилах Auto Discovery этому скрипту отдаются 3 переменные. ip адрес хоста, тип считывания и тип сенсора. Скрипт ищет совпадения в mysql таблице. Если такие совпадения находятся, он генерирует JSON с именами всех найденных сенсоров и срабатывает правило Auto Discovery.
#!/bin/bash
# mysql options
db="zabbix"
table="ipmi_sensors"
dbuser="user"
dbuserpass="password"
# variables
host="$1"
rtype="$2"
stype="$3"
IFS=$'n'
awk="/usr/bin/awk"
# check mysql
if [ -z $stype ]
then
sensorsmysql=`mysql -u $dbuser -p$dbuserpass -D $db -e 'SELECT id FROM '$table' WHERE host = "'$host'" and rtype = "'$rtype'";';`
else
sensorsmysql=`mysql -u $dbuser -p$dbuserpass -D $db -e 'SELECT id FROM '$table' WHERE host = "'$host'" and rtype = "'$rtype'" and type="'$stype'";';`
fi
# json
echo "$sensorsmysql" | sed '1,1d' | ${awk} '
BEGIN {
FS = "|"
printf "{"
printf "n "data" : ["
sep="" # Initialize the object separator empty on the first run
}
{
printf sep
printf "n {"
printf "n "{#KEY}" : ""$sensor"""
printf "n }"
sep = ","
}
END {
printf "n ]"
printf "n}"
}
'
Zabbix шаблон
В шаблон добавлены правила Auto Discovery для основных сенсоров, прототипы элементов данных и прототипы триггеров к ним.
Применение на практике
Для использования этого решения у себя, нужно сделать следующие шаги:
- Скачиваем архив c шаблоном и скриптами
- Импортируем шаблон в заббикс
- Включаем debug в конфиге zabbix
- Переносим оба скрипта в externalscripts и делаем их исполняемыми
- Добавляем в cron ipmisensorsmysql.sh
- Создаём новый узел сети
- Добавляем ему IPMI интерфейс и вносим параметры аутентификации
- Применяем к нему шаблон
- Ждём, когда отработают правила Auto Discovery
На выходе получается следующее:
HP Gen10
Старый SuperMicro
Послесловие
Работоспособность решения была проверена на серверах HP и SuperMicro разных поколений. Все сенсоры корректно находятся и обрабатываются. В планах протестировать сервера Dell и реализовать сбор общей информации (версии прошивок, серийные номера).
Автор: Лунтик
В логи не сыпятся сообщения о добавленных сенсорах. Поддержка IPMI добавлена, поллеры запущены, в логах про ipmi пусто…
Из командной строки ipmi-tool отрабатывает корректно, показывает все датчики и их значения