Мониторинг по IPMI

Простой скрипт мониторинга сервера через iLO или DRAC используя протокол IPMI.

IPMI (от англ. Intelligent Platform Management Interface) — интеллектуальный интерфейс управления платформой, предназначенный для автономного мониторинга и управления функциями, встроенными непосредственно в аппаратное и микропрограммное обеспечения серверных платформ.

Источник: http://ru.wikipedia.org/wiki/Intelligent_Platform_Management_Interface

Чтобы все получилось, нужно установить пакет ipmitool.

Скриптик опрашивает сервер через iLO или DRAC вот таким образом:

[sf@diag ~]# ipmitool -I lanplus -L user -H 172.16.10.100 -U user -P pass chassis status
System Power         : on
Power Overload       : false
Power Interlock      : inactive
Main Power Fault     : false
Power Control Fault  : false
Power Restore Policy : always-on
Last Power Event     :
Chassis Intrusion    : inactive
Front-Panel Lockout  : inactive
Drive Fault          : false
Cooling/Fan Fault    : false
Front Panel Control  : none

Если Вы получили вдруг ошибку, то проверьте открыт ли соответствующий порт:

[root@diag ~]# nmap -sU -p 623 172.16.10.100
Starting Nmap 5.51 ( http://nmap.org ) at 2014-04-11 09:32 FET
Nmap scan report for 172.16.10.100
Host is up (0.00024s latency).
PORT    STATE         SERVICE
623/udp open|filtered asf-rmcp
MAC Address: D4:85:64:52:A7:3E (Hewlett Packard)
Nmap done: 1 IP address (1 host up) scanned in 0.36 seconds

Если порт закрыт, то возможно нужно включить IPMI на сервере, мне пришлось включать это на сервере Dell PowerEdge R710.

В скрипте нужно определить переменную $email, указав адрес, куда будут присылаться сообщения, так же

нужно вписать в массив $host список серверов, в формате "ip-сервера";имя пользователя;пароль;комментарий"

Так же можно поправить массив $ipmi, по своему желанию, суть тут такая, скрипт проверяет из этого массива первую фразу, например

"System Power" и сравнивает ее с "on" (к примеру), если не совпадает отправляет сообщение.

Код скрипта:

#!/usr/bin/php
<?php
// 2014 (c) Yury Konovalov aka Speccyfan (speccyfan@gmail.com)
//адрес для уведомлений
$email="admin@domain.com";
//массив хостов
//IP;user;pass;description
$host[]="172.16.10.100;user;pass;vmware1";
$host[]="172.16.10.101;user;pass;vmware2";
$host[]="172.16.10.102;user;pass;vmware3";
$host[]="172.16.10.103;user;pass;vmware4";
//ключи, если значения отличаются от заданных, отправляется сообщение
$ipmi[]="System Power;on";
$ipmi[]="Power Overload;false";
$ipmi[]="Main Power Fault;false";
$ipmi[]="Power Control Fault;false";
$ipmi[]="Chassis Intrusion;inactive";
$ipmi[]="Front-Panel Lockout;inactive";
$ipmi[]="Drive Fault;false";
$ipmi[]="Cooling/Fan Fault;false";
$ipmi[]="Front Panel Control;none";
for ($h=0;$h!=count($host);$h++){
    $ipmi_string = explode(";",$host[$h]);
    $ipmi_host = $ipmi_string[0];
    $ipmi_user = $ipmi_string[1];
    $ipmi_pass = $ipmi_string[2];
    $ipmi_desc = $ipmi_string[3];
    exec("ipmitool -I lanplus -L user -H $ipmi_host -U $ipmi_user -P $ipmi_pass chassis status",$result);
    foreach($result as $line){
        $data = explode(":",$line);
        $key = trim($data[0]);
        $value = trim($data[1]);
        for ($i=0;$i!=count($ipmi);$i++){
                $ipmi_arr = explode(";",$ipmi[$i]);
                $ipmi_key = $ipmi_arr[0];
                $ipmi_val = $ipmi_arr[1];
                //ищем ключик
                if ($key == $ipmi_key){
                    //совпадает?
                    if ($value != $ipmi_val){
                        //что-то случилось
                        send($key." = ".$value);
                    }
                }
        }
    }
}
function send($text){
    global $ipmi_host;
    global $ipmi_desc;
    global $email;
    $send="Device: $ipmi_host ($ipmi_desc)"."\n"."Message: $text"."\n";
    passthru("echo \"$send\" | mail -s 'IPMI Notification' $email",$e);
    //echo $send;
}

Не забываем сделать скрипт запускаемым:

[root@diag opt]# chmod +x ./ipmi-monitor

Потом в крон добавляем так например:

*/10    *       *       *       *       /opt/ipmi-monitor >/dev/null 2>/dev/null

Все это опробовано на серверах HP Proliant DL360 G7, а так же Dell PowerEdge R710.

Если будут какие-то ошибки, то скорее всего в php.ini нужно выкосить функции passthru и exec из блэклиста.