Monitoring Serwerów - Forum o monitoringu infrastruktury IT
op5 Monitor, zaczynamy! Piszemy skrypt dla QNAP
#1
To, że warto monitorować stan swoich systemów i urządzeń jest oczywiste. Istnieją do tego rozmaite narzędzia z których najlepszą opcją wydaje się być op5 Monitor łączący zalety produktów open source’owych z zaletami programów komercyjnych. Czasami jednak chcielibyśmy dodać do swojego systemu monitoringu urządzenia lub usługi, które nie zostaną automatycznie wykryte przez nasz system. Jak się zabrać za monitoring świeżo nabytego sprzętu?
Podejście ideowe:
1. Wyszukujemy informacje o bazie MIB danego urządzenia.
2. Wybieramy interesujące nas wartości,
3. Piszemy skrypt wykonujący zapytania,
4. Podłączamy pod op5 Monitor.
Podejście praktyczne zaprezentuję na przykładzie urządzenia QNAP TS-869 Pro.
Założenia wstępne:
Urządzenie dostępne jest w sieci (na potrzeby tego wpisu pod adresem IP 192.168.1.113).
Posiadamy co najmniej szczątkową umiejętność obsługi basha.
Jesteśmy dumnymi posiadaczami op5 Monitor.
Ad.1. Qnap zarządzany jest przez aplikację webową, więc po przejściu do panelu administracyjnego w zakładce Network Services możemy ustawić SNMP oraz pobrać bazę MiB.

[Image: qnapsnmp.png]

Po pobraniu bazy instalujemy sobie darmową przeglądarkę MiB np.
http://download.cnet.com/iReasoning-MIB-Browser-Personal-Edition/3000-2651_4-10336502.html
Ad. 2
Po instalacji otwieramy ściągnięty z urządzenia plik i wyszukujemy interesujące nas wartości:

[Image: drzewomib.png]

Nazwy są dość oczywiste, to co nas interesuje to OID, czyli w tym przypadku wartość
Code:
.1.3.6.1.4.1.24681.1.2.1.0


W celu sprawdzenia użycia procesora wykonujemy na systemie linux następującą komendę:
Code:
snmpget -v 2c -c public 192.168.1.113 .1.3.6.1.4.1.24681.1.2.1.0


gdzie
-v2c to wersja SNMP
-c to community ustawione podczas konfiguracji SNMP
Zwrócona wartość:
Code:
SNMPv2-SMI::enterprises.24681.1.2.1.0 = STRING: "2.90 %"


Po „przekopiowaniu” tego otrzymujemy:
Code:
snmpget -v 2c -c public 192.168.1.113 .1.3.6.1.4.1.24681.1.2.1.0 | cut -d " " -f4,5 -| tr -d '"'


Zwrócona wartość:
Code:
2.80 %


Stąd tylko jeden krok do skryptu…

Ad 3.
Code:
Najprostszy skrypt w bashu wyglądałby właśnie tak jak wyżej, ale warto się trochę pomęczyć i stworzyć coś bardziej użytecznego, co będziemy mogli wykorzystywać w wielu innych sytuacjach. Poniżej przedstawiam skrypt do monitoringu zużycia cpu napisany w perlu. Język dostępny na wszystkie platformy, a co za tym idzie przenośny. Zamieszczony skrypt, ze względu na fakt iż użyte zostały funkcje, jest fundamentem na którym można budować nowe zapytania do bazy MIB.
#!/usr/bin/perl
use Net::SNMP;
use Data::Dumper;
use Getopt::Long;
use warnings;
use strict;
#===========================DEKLARACJA ZMIENNYCH=========================
my $PORT = 161;
my $DEFAULT_SNMP_VERSION = "2c";
my $COMMUNITY ="op5emcacommunity";
my $TIMEOUT = 5;
my ($session, $error) =undef;
#================================DEKLARACJA OPCJI PROGRAMU=================
my (
        $opt_host,
        $opt_port,
        $opt_community,
        $opt_warning,
        $opt_critical,
        $opt_timeout,
        $opt_snmp_version,
        $opt_cpu,
     ) = undef;
 
sub check_options(){
        Getopt::Long::Configure("bundling");
        GetOptions(
                'H:s' => \$opt_host, 'host:s' => \$opt_host,
                'P:i' => \$opt_port, 'port:i' => \$opt_port, #default 161
                'v:s' => \$opt_snmp_version, 'version:s' => \$opt_snmp_version, #default 2c
                'v:s' => \$opt_snmp_version, 'version:s' => \$opt_snmp_version, #default 2c
                'C:s' => \$opt_community, 'community:s' => \$opt_community,
                't:i' => \$opt_timeout, 'timeout:i' => \$opt_timeout,
                'c:i' => \$opt_critical, 'critical:i' => \$opt_critical,
                'w:i' => \$opt_warning, 'warning:i' => \$opt_warning,
                'checkcpu' => \$opt_cpu,
        );
        if(!defined($opt_port)){$opt_port = $PORT;}
        if(!defined($opt_timeout)) {$opt_timeout = $TIMEOUT; }
        if(!defined($opt_snmp_version)) {$opt_snmp_version = $DEFAULT_SNMP_VERSION; }
        if(!defined($opt_host) || !defined($opt_community)) {print_usage(); exit 0;}
}
#========================================MAIN=====================================
check_options();
($session, $error) = Net::SNMP->session(
                      -hostname  => $opt_host,
                      -version   => $opt_snmp_version,
                      -community => $opt_community,
                      -port      => $opt_port,
                      -timeout   => $opt_timeout
                     );
if (!$session) {
   printf("ERROR opening session: %s.\n", $error);
   exit 3;
}
 if(defined($opt_cpu)){
        if(!defined($opt_critical) || !defined($opt_warning)){
                print "Option --checkcpu requires -w and -c\n";
                exit 3;
        } else {
                my $cpu = getData(".1.3.6.1.4.1.24681.1.2.1.0");
                my @temp = split(" ",$cpu);
                $cpu = $temp[0];
                my $wynik = checkStatus($cpu);
                if($wynik == 2){
                                print "CRITICAL :  CPU usage ".$cpu."%\n";
                                exit $wynik;
                                }
                elsif ($wynik == 1){
                                print "WARNING : CPU usage ".$cpu."%\n";
                                 exit $wynik;
                                }
                 else {
                                print "OK : CPU usage ".$cpu."%\n";
                                exit $wynik;
                        }
                }
}
 
if($session) {$session->close};
 
#======================FUNKCJE====================================
sub getData{
                        my      ($Data) = @_;
                        my      $result = $session->get_request($Data)->{$Data};
                                if(!defined($result)) {
                                        printf "ERROR: %s on Host: %s\n", $session->error, $session->hostname;
                                        exit 3;
                                }
                                else {
                                        return $result;
                                }
                }
sub checkStatus{
        my ($ile) = @_;
        my $wynik = ($ile > $opt_critical)?2:($ile >$opt_warning)?1:0  ;
        return $wynik;
}
sub print_usage(){
        print "Usage: $0  -H <host> -C <snmp_community> [-p <port>] -w <warn level> -c <crit level>  [-t <timeout>]  <--checkcpu>\n";
        }


Myślę, że wiele nie trzeba wyjaśniać. Cała idea polega na tym, że pobieramy z bazy MIB urządzenia interesującą nas wartość, parsujemy, a następnie sprawdzamy rezultat.

Ad.4. Podpięcie pod op5 Monitor
Po skopiowaniu naszego skryptu w odpowiednie miejsce przechodzimy do aplikacji op5 Monitor wybierając zakładkę Configure. Następnie przechodzimy do Commands

[Image: op51.png]

W polu command_line wpisujemy ścieżkę do skryptu wraz z odpowiednimi parametrami. NazwaSkryptu.pl powinna oczywiście zostać zastąpiona nazwą naszego skryptu.
Code:
/opt/plugins/custom/nazwaSkryptu.pl -H $HOSTADDRESS$ -C $ARG1$ --checkcpu  -w $ARG2$  -c $ARG3$


[Image: op52.png]

Zakończywszy dodawanie możemy przejść do tworzenia nowego hosta oraz skonfigurowania polecenia. W polu check_command_args wpisujemy kolejno community, warning level oraz critical level wszystko przedzielone wykrzyknikiem. Testujemy i w razie pozytywnego rezultatu zapisujemy przyciskiem submit.

[Image: op53.png]

W tym momencie mamy już monitorowane użycie CPU naszego urządzenia. Oczywiście nic nie stoi na przeszkodzie, aby monitorować kolejne znalezione w bazie MIB wartości. Monitorując nasze urządzenie sprawdzamy stan 20 usług.

[Image: op54.png]

W swoim wpisie przedstawiłem jak się zabrać za pisanie wtyczek do monitorowania urządzeń. Jeżeli oprzemy się tylko na bazie MIB danego urządzenia skazani jesteśmy tylko na takie wartości, jakie przewidział i chciał udostępnić ogółowi producent. Lecz któż nam zabroni wykonywać polecenia w systemie, a wynik przekazywać do op5 Monitor. Sky’s the limit. To już jednak temat na osobny wpis.
Reply


Forum Jump:

User Panel Messages