Nagios SMS - Kiedy admin śpi a serwer ma kłopoty
Na wstępie zaznaczam że nie jest to najlepsze rozwiązanie ... Aby Nagios miał sens należałoby podpiąć pod niego fizycznie komórkę. Sposób poniżej jest raczej zabawą - nie działającą w 100% (wystarczy awaria łącza i mamy zonk) - ale dającą pewną darmową kontrolę :)
Na początek należy zainstalować sam system. w skrócie to :
emerge nagios nagios-core
Oczywiście pomijam tutaj pakiety typu nagios-nrpe i inne bez których nie mamy łączności z innymi serwerami - zakładam że wiesz jak je zainstalować i skonfigurować.
Po ustawieniu wszystkiego i upewnieniu się że działa mamy system który powiadamia nas poprzez email i np. wtyczkę do Firefox'a (nagios-checker) o każdym alarmie typu Warning i Critical.
Teraz do rzeczy ... Czytałem w internecie o pluginach do nagiosa aby wysyłał on także poprzez bramkę sms do nas powiadomienie. Chciałem jednak czegoś darmowego :) . GOOGLE - tak a dokładniej Google Calendar.
Kalendarz naszego dużego brata oferuje możliwość powiadomienia nas na komórkę o zbliżającym się wydarzeniu w naszym kalendarzu ... Czytałem także że Google zaczyna to blokować ( bo pewnie nie mają z tego pieniędzy) ale na razie u mnie to działa.
Na początku zabrałem się za to przy pomocy perla i Net::Google::Calendar ale zrezygnowałem po kilkudziesięciu minutach poszukiwań rozwiązania problemu dodania remindera do naszego wydarzenia (jeśli ktoś ma działający kod dodający wydarzenie z powiadomieniem - proszę o kontakt).
Przesiadałem się więc na ulubiony PHP ... Żeby nie pisać za dużo skorzystałem z biblioteki Zenda (ZendFramework) a dokładnie Zend_Gdata_Calendar. Jeśli nie masz go zainstalowanego w systemie to jest za darmo do pobrania ZendFramework
Po pobraniu musisz w skrypcie podać ścieżkę do niego
/* Add the Zend Framework library to the include path so that we can access the ZF classes */
set_include_path('../library' . PATH_SEPARATOR . get_include_path());
Skrypt jest bardzo prosty, wymaga jeszcze kilku zmian - ale one wychodzą "w praniu" :
date_default_timezone_set('Europe/Warsaw');
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
$args = $_SERVER["argv"];
if(!isset($args[1]))
die('Nagios Alert not defined!');
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient('EMAIL', 'HASŁO', $service);
$service = new Zend_Gdata_Calendar($client);
// Create a new entry using the calendar service's magic factory method
$event= $service->newEventEntry();
// Populate the event with the desired information
// Note that each attribute is crated as an instance of a matching class
$event->title = $service->newTitle( $args[1] );
$event->where = array($service->newWhere("LOKALIZACJA NAGIOSA"));
$event->content =
$service->newContent( $args[1] );
// Set the date using RFC 3339 format.
$startDate = date("Y-m-d");
$startTime = date("H:i", mktime(date("H"), date("i")+2));
$endDate = date("Y-m-d");
$endTime = date("H:i", mktime(date("H"), date("i")+3));
$tzOffset = "+02";
$when = $service->newWhen();
$when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
$when->endTime = "{$endDate}T{$endTime}:00.000{$tzOffset}:00";
$reminder = $service->newReminder();
$reminder->method = "sms";
$reminder->minutes = "1";
$when->reminders = array($reminder);
$event->when = array($when);
// Upload the event to the calendar server
// A copy of the event as it is recorded on the server is returned
try {
$newEvent = $service->insertEvent($event);
//print_r($newEvent);
} catch (Zend_Gdata_App_Exception $e) {
echo "Error: " . $e->getMessage();
}
Musimy w nim zamienić wartości EMAIL i HASŁO na nasze dane do konta google, a także wpisać (opcja) lokalizację nagios (np. server w firmie).
Całość należy zapisać np. jako plik nagios-sms.php i umieścić w katalogu domowym użytkownika nagios. Nie zapominamy i odpowiednich uprawnieniach do pliku. Dla pewności zaszyfrowałem go także - nie chciałbym aby ktoś znał moje hasło w przypadku włamania ...
Pozostaje już tylko dopisanie do konfiguracji nagiosa podobnych linijek do contacts.cfg:
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-service-by-email,notify-service-by-sms
host_notification_commands notify-host-by-email,notify-host-by-sms
Oraz w commands.cfg :
# 'notify-host-by-sms' command definition
define command{
command_name notify-host-by-sms
command_line /usr/bin/php /var/nagios/home/nagios-sms.php "$NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$"
}
# 'notify-service-by-sms' command definition
define command{
command_name notify-service-by-sms
command_line /usr/bin/php /var/nagios/home/nagios-sms.php "$NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}
Jeśli Google na stałe zablokuje tę możliwość wykorzystania kalendarza to trzeba będzie wrócić (i płacić) do bramki np. Ery lub dać fizycznie komórkę przy serwerze :(
i to chyba tyle ... pozdrawiam :)
p.s. Jeśli interesują Cię także inne darmowe obejścia to zainteresuj się tym : link
Wasze opinie :
- 2013-02-22 08:39:02 proximus:
- Można też pójść w bardziej stabilne rozwiązanie i wstawić sobie bramkę sms do serwerowni. Np. coś takiego: http://exchange.nagios.org/directory/Addons/Notifications/SMS/SMS-Notifications-via-SMSEagle/details
Ale to już jest oczywiście kwestia inwestycji