Monitoring Serwerów - Forum o monitoringu infrastruktury IT
Kontrola PING przez SSH
#1
Z praktyki wiem, że czasami przychodzi nam monitorować sieć do której nie posiadamy bezpośredniego dostępu. Dziwnie to brzmi, ale zdarza się gdy na przykład mamy dostęp tylko do jednego hosta w sieci i inny ruch przychodzący z zewnątrz jest wycinany na firewallu. W takim przypadku można się posłużyć pewną sztuczką wykorzystującą stare, dobre ssh.
Aby tego dokonać należy się upewnić, że na urządzeniu do którego mamy dostęp uruchomiony jest serwer ssh. Polecenie sprawdzające, czy host w danej podsieci żyje i ma się dobrze jest następujące:
ssh IPserwera ping IPhosta

Wymiana kluczy publicznych ssh

Aby ping zadziałał należy zalogować się na serwer. Chcąc zautomatyzować to zadanie należy wymienić klucze z serwerem. W tym celu na stacji z której będziemy odpytywać hosty wykonujemy polecenie:
Code:
user@host:~> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
66:23:50:0e:76:c1:d0:c7:9e:5e:5a:65:78:20:5c:fb user@host.example.com
The key's randomart image is:
+--[ RSA 2048]----+
| o++X. |
| E= O |
| . O . |
| = + . |
| o + S |
| + + . |
| o |
| |
| |
+-----------------+


Klucz prywatny został zapisany w pliku /home/user/.ssh/id_rsa . Oczywiście tego pliku nie udostępniamy nikomu. Natomiast klucz publiczny znajdujący się w /home/user/.ssh/id_rsa.pub przesyłamy na zdalny serwer używając w tym celu polecenia:
Code:
user@localhost: ssh-copy-id -i ~/.ssh/id_rsa.pub user@serwerssh


Po tych zabiegach mamy dostęp do serwera bez konieczności wpisywania hasła.
Po wykonaniu polecenia
Code:
ssh user@192.168.1.1 ping 192.168.1.7 –c 4


otrzymujemy :
Code:
DD-WRT v24 std (c) 2008 m-NET GmbH
Release: 07/27/08 (SVN revision: 10011)
PING 192.168.1.7 (192.168.1.7): 56 data bytes
64 bytes from 192.168.1.7: seq=0 ttl=64 time=1.071 ms
64 bytes from 192.168.1.7: seq=1 ttl=64 time=0.981 ms
64 bytes from 192.168.1.7: seq=0 ttl=64 time=1.131 ms
64 bytes from 192.168.1.7: seq=1 ttl=64 time=0.962 ms
--- 192.168.1.7 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.939/1.001/1.131 ms


Problemem jest wyrzucana na konsolę „wizytówka” hosta przez który się łączymy:
Code:
DD-WRT v24 std (c) 2008 NewMedia-NET GmbH
Release: 07/27/08 (SVN revision: 10011)


Aby się tego pozbyć należy dodać do ssh opcję -q (quiet).
Nasze polecenie nabiera realnych kształtów jeszcze tylko dodamy opcję timeoutu, aby nie czekać zbyt długo na nawiązanie połączenia ssh i gotowe:
Code:
ssh -o ConnectTimeout=5 –q user@192.168.1.1 ping 192.168.1.7 –c 4


Powyższe polecenie to rdzeń naszego skryptu sprawdzającego dostępność hostów w sieci. Tak naprawdę cała reszta to parsowanie wyniku w celu porównania z wpisanymi przez nas progami.
Pora na skrypt tradycyjnie pisany w perlu, który jak wiadomo stworzony jest do parsowania:
Code:
#!/usr/bin/perl
use strict;
use utils qw (%ERRORS $TIMEOUT);
use Getopt::Long;
my ($opt_h, $opt_ssh, $opt_w, $opt_c, $opt_ile, $opt_host);
Getopt::Long::Configure("bundling");
my $result=GetOptions(
        "H=s" => \$opt_host, "HOST=s" => \$opt_host,
        "w=f" => \$opt_w, "warning=f" => \$opt_w,
        "c=f" => \$opt_c, "critical=f" => \$opt_c,
        "i=i" => \$opt_ile, "ile=i" => \$opt_ile,
        "s=s" => \$opt_ssh, "ssh_sever=s" => \$opt_ssh);
if(! $result) {
        exit $ERRORS{'UNKNOWN'};
}
if (!defined($opt_host) || !defined($opt_w) || !defined($opt_ile) || !defined($opt_c) || !defined($opt_ssh)){
        print_usage();
        exit $ERRORS{'OK'};
}
chomp($opt_ssh);
chomp($opt_c);
chomp($opt_w);
chomp($opt_ile);
chomp($opt_host);
my $line;
my $i;
my $ssh_server = 'root@'.$opt_ssh;
my $cmd="/usr/bin/asmonitor ssh -o ConnectTimeout=5  -q $ssh_server ping $opt_host -c $opt_ile";
my @return = `$cmd`;
        if(@return == undef){
        print "Connection failure\n";
        exit(2);
}
        for($i = 0;$i<=$#return;$i++){
                if($return[$i] =~ /packets transmitted/){
                        $line = $return[$i];
                }
        }
my @tempTab = split(",",$line);
        my @value  = split(" ",$tempTab[-1]);
        chop($value[0]);
        my $number = $value[0];
        my $output = ($number > $opt_c)?2:($number > $opt_w)?1:0;
                if($output == 2){
                                print "CRITICAL :".$line;
                                exit $output;
                                }
                elsif ($output == 1){
                                print "WARNING :".$line;
                                 exit $output;
                                }
                 else {
                                print "OK :".$line;
                                exit $output;
                        }
sub print_usage(){
        print "Usage: $0  -s <ssh server IP> -H <host> -i <how many pings> -w <warn level> -c <crit level> \n";
        }


Tak przygotowany skrypt wystarczy dodać do op5 Monitora. Dzięki podawanym argumentom uzyskujemy dość uniwersalny sposób na radzenie sobie z opisaną na wstępie sytuacją.
Po skopiowaniu naszego skryptu w odpowiednie miejsce przechodzimy do aplikacji op5 Monitor wybierając zakładkę Configure. Następnie przechodzimy do Commands:



W polu command_line wpisujemy ścieżkę do skryptu wraz z odpowiednimi parametrami.
Code:
/opt/plugins/custom/nazwa_skryptu -s $ARG1$ -H $HOSTADDRESS$  -i $ARG2$  -w $ARG3$  - c $ARG4$


Zmienna $ARG1$ odpowiada za adres serwera ssh, $HOSTADDRESS$ za adres IP hosta $ARG2$ za ilość wysłanych pingów $ARG3$ za próg ostrzeżenia. Ostatnia zmienna odpowiedzialna jest za critical level. Po dodaniu hostów naszym oczom ukazuje się taki oto widok:

[Image: sshping.png]
Reply


Forum Jump:

User Panel Messages