СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Мониторинг серверов HP через iLO в Zabbix в черновиках

Введение


В процессе внедрения Zabbix в нашей весьма разветвленной инфраструктуре, я столкнулся с необходимостью мониторинга аппаратной части довольно большого парка серверов HP Proliant разных моделей и поколений независимо от ОС и агентов HP.

Сама собой напрашивалась мысль реализовать все это через iLO, однако задача оказалась далеко не такой тривиальной, какой выглядела изначально. В итоге ее решения получилась довольно-таки интересная конструкция, которая:

  • Использует функцию discovery, избавляющую нас от необходимости задавать вручную вообще что-либо, кроме адреса iLO,
  • Отслеживает состояние температур, кулеров и питания на серверах Proliant, начиная от 5 поколения,
  • Отслеживает состояние памяти и жестких дисков на серверах Proliant, начиная от 7 поколения,
  • Собирает общую информацию для инвентаризации — серийные номера, номера модели, версии прошивок.


Теперь о том, как именно это было реализовано.

Казалось бы, все просто: iLO умеет отдавать данные через IPMI, а в Zabbix есть штатная поддержка этого протокола, но, как водится, гладко было на бумаге. При детальном рассмотрении вопроса сразу появились три проблемы:

  1. Zabbix использует библиотеку openipmi, в которой есть баг — успешное соединение с iLO произойдет только в том случае, если оно инициировано от имени учетной записи, имеющей привилегии администратора. С точки зрения безопасности это в корне неправильно. Проблему можно решить патчем/обновлением, но она не избавляет от других,
  2. Снятие информации с дискретных датчиков через IPMI не поддерживается,
  3. И, наконец, для разных моделей серверов ключи, имена и количество датчиков различаются. Делать для каждой модели шаблоны вручную — крайне непродуктивно.


В связи с вышеизложенным, было принято решение написать отдельный механизм для взаимодействия с iLO, опираясь на скрипты и сторонние утилиты работы с IPMI. В качестве языка программирования был выбран perl, а в качестве источника данных — пакет FreeIPMI. На всех подопечных серверах в iLO была создана учетная запись мониторинга с read-only правами. Логически вся конструкция делится на две части:

  • Скрипт обнаружения источников данных ilo_discovery.pl — опрашивает iLO на предмет поддерживаемых параметров и ключей, парсит их и выдает в формате, понятном Zabbix,
  • Скрипт получения данных ipmi_proliant.pl — по запросу выдает значение конкретного параметра.


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

Скрипт обнаружения


Этот скрипт выдает данные в формате zabbix discovery в зависимости от того, какой класс данных был запрошен — датчики, информация шасси и так далее. Подобное разделение обусловлено логикой шаблона, который используется совместно со скриптами.
ilo_discovery.pl


Скрипт получения данных


Этот скрипт выдает значение конкретных датчиков — опять же, в зависимости от того, какой класс данных был запрошен. Полученные данные кэшируются в текстовом файле, дабы случайно не заddosить iLO одновременными запросами.
ipmi_proliant.pl


Шаблон мониторинга


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

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


Для практического применения вышеописанной конструкции необходимо:

  1. Скачать архив со скриптами и шаблоном, импортировать шаблон в Zabbix,
  2. Положить скрипты ilo_discovery.pl и ipmi_proliant.pl в папку, указанную в качестве хранилища ExternalScripts в конфиге Zabbix, и сделать их исполняемыми,
  3. Скачать и установить FreeIPMI (FAQ по сборке и зависимостям лежит тут):
    # wget http://ftp.gnu.org/gnu/freeipmi/freeipmi-1.2.1.tar.gz 
    # tar -xvzf freeipmi-1.2.1.tar.gz
    # cd freeipmi-1.2.1
    # ./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man
    # make install

    Для 64-битных систем строка configure будет такой:
    ./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --libdir=/usr/lib64

  4. Создать в iLO учетную запись для Zabbix и прописать ее данные в скриптах ($user и $pass),
  5. Проверить, что FreeIPMI успешно подключается к iLO (адрес, логин и пароль подставляем свой):
    # /usr/sbin/ipmi-sensors -D LAN2_0 -h 192.168.0.1 -u monitor -p P@$$w0rd -l USER -W discretereading --no-header-output --quiet-cache --sdr-cache-recreate --comma-separated-output --entity-sensor-names

    В ответ мы должны получить список датчиков наподобие:
    0,System Chassis 1 UID Light,OEM Reserved,N/A,N/A,'OEM Event = 0000h'
    1,System Chassis 2 Health LED,OEM Reserved,N/A,N/A,'OEM Event = 0000h'
    2,Processor Module VRM 1,Power Unit,N/A,N/A,'Device Inserted/Device Present'
    3,Power Supply Power Supply 1,Power Supply,N/A,N/A,'Presence detected'

  6. Проверить, что скрипт успешно парсит данные обнаружения (адрес подставляем свой):
    # /usr/lib/zabbix/externalscripts/ilo_discovery.pl 192.168.0.1 sensor temp numeric

    В ответ мы должны получить примерно такой вывод:
    {
            "data":[
                    {
                            "{#CLASS}":"sensor",
                            "{#KEY}":"Air Inlet 01-Inlet Ambient",
                            "{#SECTION}":"Temperature",
                            "{#TYPE}":"numeric",
                            "{#MEASURE}":"C"},
                    {
                            "{#CLASS}":"sensor",
                            "{#KEY}":"Processor 02-CPU",
                            "{#SECTION}":"Temperature",
                            "{#TYPE}":"numeric",
                            "{#MEASURE}":"C"},

  7. В веб-интерфейсе Zabbix для сервера, который мы хотим опрашивать через iLO, прописать адрес iLO в макросе {$ILO} (в поле адреса ipmi интерфейса ничего указывать не надо),
  8. Привязать к этому серверу шаблон мониторинга iLO
  9. Подождать, пока отработает обнаружение.

Примерно так будет выглядеть раздел lastest data для узла с мониторингом iLO:


Графики по получаемым данным прилагаются:


Заключение


Данный механизм мониторинга был успешно протестирован с серверами HP Proliant серий DL, ML и BL 5, 6, 7 и 8 поколений. Общая рекомендация — стараться перед его применением обновлять iLO до последних версий прошивок.

Что же касается младшей линейки серверов, имеющей на борту Lo100 вместо iLO — с ними все это тоже будет работать, но некоторая информация, получаемая со старших моделей того же поколения, будет недоступна, поскольку lo100 отдает меньше данных, чем iLO.

комментарии (7)

0
alexvl ,  

Спасибо за интересную статью. Уверен, что многим она будет полезна. На самом деле дискретные датчики поддерживаются уже начиная с версии 2.2.0.

0
Vengant ,  

Да, вы правы. Просто когда рассматривал возможность использования штатных функций Zabbix для работы с IPMI, тестировал, если мне не изменяет память, на ветке 2.0. В продакшн пошел как раз на тот момент вышедший релиз 2.2, но к тому времени уже появилась идея и были первые наметки описанного здесь решения, так что переделывать я уже ничего не стал. Тем более, что, насколько я помню, через штатные функции все равно не получилось бы снимать флаги состояния шасси и тому подобные данные, не относящиеся к датчикам.

+1
saamich ,  

Мониторю у себя по похожему принципу, только:
1) скриптом создаю сразу готовый шаблон под конкретные датички.
2) таже мониторю sel логи ( наслучай если с железкой что случилось «по железу»), но туда проблемы с дисковой подсистемой не попадают, их отдельно скриптами через userparametr
3) Обновление «элементов данных» идет разово( на G8 серверах ipmi крайне тормозной)- скриптом через zabbix_trapper, а скрипт дергает сам же забикс и если обновление не пройдет — кинет алерт.

0
Vengant ,  

Тоже вариант, да. Но у нас больно много серверов, генерить шаблон под каждую модель даже в полуавтоматическом режиме — шибко долго выйдет. Поэтому и задался целью сделать универсальное решение.

А что касается trapper'а — я к нему отношусь крайне осторожно. Насколько надежно он у вас работает? Часто бывает, что не проходит обновление?

0
saamich ,   * (был изменён)

По факту шаблон генерится на «поколение»( G5, G6, G7), сервера в принципе с одинаковой начинкой и список датчиков в пределах поколения одинаковый.

Не могу сказать проблема именно в трапире или нет, у меня скрипт просто выходит с определенным кодом если «что-то пошло не так». Такие ошибки редко бывают.

0
Vengant ,  

Понятно.
Насчет поколения не согласен — для DL360 и DL380, к примеру, будут разные наборы датчиков с разными именами, даже если они принадлежат к одному поколению. А что касается тормозов IPMI в G8 — такого не замечал, но был другой прикол — на старых версиях прошивок iLO у G8 через пару-тройку опросов с периодичностью в минуту просто переставал отвечать по IPMI. После обновления прошивок на актуальные проблема более не наблюдалась.

0
saamich ,  

Да, оговорился- не поколение в целом, а на модель.

Про тормознутость IPMI я это и имел ввиду. Ловил такое поведение где-то в сентябре прошлого года, на тот момент были зашиты последние версии ilo.