Мониторинг серверов через IPMI в Zabbix

в 14:54, , рубрики: Серверное администрирование, системное администрирование

Введение

В процессе обновления парка серверов в компании, я столкнулся с потребностью мониторить их на аппаратном уровне, без привязки к вендору и с минимальными трудозатратами для включения мониторинга на новых железках.

В качестве средства мониторинга у нас используется 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. Все найденные сенсоры аккуратно туда заносятся. На выходе получается такой результат

Мониторинг серверов через IPMI в Zabbix - 1

Скрипт запускает cron каждые 3 минуты.

ipmisensorsmysql.sh

#!/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.

ipmisensors.sh

#!/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 для основных сенсоров, прототипы элементов данных и прототипы триггеров к ним.

Применение на практике

Для использования этого решения у себя, нужно сделать следующие шаги:

  1. Скачиваем архив c шаблоном и скриптами
  2. Импортируем шаблон в заббикс
  3. Включаем debug в конфиге zabbix
  4. Переносим оба скрипта в externalscripts и делаем их исполняемыми
  5. Добавляем в cron ipmisensorsmysql.sh
  6. Создаём новый узел сети
  7. Добавляем ему IPMI интерфейс и вносим параметры аутентификации
  8. Применяем к нему шаблон
  9. Ждём, когда отработают правила Auto Discovery

На выходе получается следующее:

HP Gen10

Мониторинг серверов через IPMI в Zabbix - 2

Старый SuperMicro

Мониторинг серверов через IPMI в Zabbix - 3

Послесловие

Работоспособность решения была проверена на серверах HP и SuperMicro разных поколений. Все сенсоры корректно находятся и обрабатываются. В планах протестировать сервера Dell и реализовать сбор общей информации (версии прошивок, серийные номера).

Автор: Лунтик

Источник

Поделиться

  1. ing:

    В логи не сыпятся сообщения о добавленных сенсорах. Поддержка IPMI добавлена, поллеры запущены, в логах про ipmi пусто…
    Из командной строки ipmi-tool отрабатывает корректно, показывает все датчики и их значения

* - обязательные к заполнению поля