Dopo aver cercato a lungo un OID SNMP che potesse restituirmi on-the-fly il numero di NAT translation attive sul mio router Cisco, sono arrivato alla conclusione che il modo più semplice per ricavare tale informazione consiste nel creare uno scrip bash + expect da dare in pasto a Nagios.
Per prima cosa, dunque, mi sono soffermato sulla creazione dello scrip expect, in modo da poter interrogare il router oggetto di monitoraggio, lanciando un comando specifico, che è il seguente:
Router# show ip nat statistics
Ed ecco lo scrip expect vero e proprio:
#!/usr/bin/expect set ip [lindex $argv 0] set password1 [lindex $argv 1] set password2 [lindex $argv 2] spawn ssh -l nightfly "$ip" expect "*?assword:*" send "$password1\r" expect ">" send "ena\r" expect "Password:" send "$password2\r" expect "#" send "show ip nat statistics\r" expect "#" send "exit\r" expect eof
Esso riceve come parametri l’IP del dispositivo, la password vty e la password ena.
Dopo averlo chiamato get_nat_num (ed averlo reso eseguibile con chmod +x get_nat_num), mi sono soffermato sulla creazione dello scrip bash, che è il seguente:
#!/bin/bash host=$1 password1=$2 password2=$3 warning=$4 critical=$5 usage="check_nat_translations <host> <password1> <password2> <warning> <critical>" if [ -n "$host" ]; then if [ -n "$password1" ];then if [ -n "$password2" ];then if [ -n "$warning" ];then if [ -n "critical" ];then if [ "$critical" -lt "$warning" ];then echo "UNKNOWN: critical has to be greater than warning" exit 3; else output=`/usr/lib64/nagios/plugins/get_nat_num $1 $2 $3 | grep "Total active translations" | awk '{print $4}'` fi if [ -n "$output" ];then if [ "$output" -ge "$critical" ];then echo "CRITICAL: total number of active NAT translations is $output | nat_translations=$output;$warning;$critical"; exit 2; elif [ "$output" -lt "$critical" -a "$output" -ge "$warning" ];then echo "WARNING: total number of active NAT translations is $output | nat_translations=$output;$warning;$critical"; exit 1; else echo "OK: total number of active NAT translations is $output | nat_translations=$output;$warning;$critical"; exit 0; fi else echo "UNKNOWN: output is null" exit 3; fi else echo "$usage" exit 3; fi else echo "$usage" exit 3; fi else echo "$usage" exit 3; fi else echo "$usage" exit 3; fi else echo "$usage" exit 3; fi
Esso accetta in ingresso 5 parametri: i primi 3 da passare allo scrip get_nat_num, gli ultimi 2 da utilizzare come soglie per Nagios (una warning ed una critical).
Rendiamo eseguibile anche questo scrip (chmod +x check_nat_translations) e soffermiamoci sulla configurazione di Nagios.
Come primo step occorre creare il comando che utilizza i plugin appena creati:
# 'check_nat_translations' command definition define command{ command_name check_nat_translations command_line $USER1$/check_nat_translations $HOSTADDRESS$ $ARG1$ $ARG2$ $ARG3$ $ARG4$ }
Successivamente è necessario creare un servizio (da inserire nel file di configurazione relativo ad un host determinato), che si avvalga del comando creato in precedenza:
define service{ use local-service ; Name of service template to use host_name cisco service_descripion NAT Translations Number check_command check_nat_translations!password1!password2!40000!50000 }
Salviamo la configurazione, riavviamo Nagios, ed il gioco è fatto.
Alla prossima.