Мониторинг по 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 из блэклиста.