Простой скрипт мониторинга сервера через 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 statusSystem Power : onPower Overload : falsePower Interlock : inactiveMain Power Fault : falsePower Control Fault : falsePower Restore Policy : always-onLast Power Event :Chassis Intrusion : inactiveFront-Panel Lockout : inactiveDrive Fault : falseCooling/Fan Fault : falseFront Panel Control : noneЕсли Вы получили вдруг ошибку, то проверьте открыт ли соответствующий порт:
[root@diag ~]# nmap -sU -p 623 172.16.10.100Starting Nmap 5.51 ( http://nmap.org ) at 2014-04-11 09:32 FETNmap scan report for 172.16.10.100Host is up (0.00024s latency).PORT STATE SERVICE623/udp open|filtered asf-rmcpMAC 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 из блэклиста.