[Debian Wheezy] Surveille ta mailq!

Voici comment superviser simplement la mailq de votre serveur SMTP (Postix par exemple).

Installer le serveur snmp :

apt-get install snmpd

Rajouter dans /etc/snmp/snmpd.conf (w.x.y.z est l’IP du serveur de supervision) les 2 lignes suivantes :

rocommunity public w.x.y.z
extend mailqstats /etc/snmp/mailqstats.sh

Vous pouvez changer le community « public » pour un tout autre nom…

Créer le fichier /etc/snmp/mailqstats.sh affichant le nombre de courriel de la mailq :

#!/bin/bash
mailq | tail -n 1 | awk '{if (NF > 4) {print $5} else {print 0}}'

Permettre l’exécution du fichier :

chmod +x /etc/snmp/mailqstats.sh

Dans /etc/hosts.allow, rajouter une autorisation d’accès pour votre serveur de supervision :

snmpd: w.x.y.z

Depuis votre serveur de supervision, lancer un snmpget :

snmpget -v2c -c public gretchen 1.3.6.1.4.1.8072.1.3.2.4.1.2.10.109.97.105.108.113.115.116.97.116.115.1
iso.3.6.1.4.1.8072.1.3.2.4.1.2.10.109.97.105.108.113.115.116.97.116.115.1 = STRING: "104"

On a 104 mail dans la mailq!

Utiliser centreon pour superviser et grapher automatiquement cette mailq avec le service générique check_centreon_snmp_value!

Plugin Nagios pour vérifier la charge CPU

Ce plugin est écrit en Perl et utilise la commande sar. Cette commande donne le pourcentage moyen d’idle des 10 dernières minutes.

Problèmes :
– Il est inutile de faire des vérifications (check) avec un intervalle inférieur à 10 minutes…
– Entre minuit et 0h10 la commande sar n’affiche pas de moyenne -> on utilise la comme top qui donne une valeur quasi-instantamnée (moyenne sur un court intervalle)

check_cpu.pl :


#!/usr/bin/perl
# check_cpu.pl [warn] [critical]
sub print_help ();
sub print_usage ();
$PROG = "check_cpu";
if  ( @ARGV[0] eq "" || @ARGV[1] eq "" )
{
    print_usage ();
    exit 0;
}
$idle = `sar | /usr/bin/tail -n 2 | /usr/bin/head -n 1 | /bin/sed 's/  */ /g' | cut -d' ' -f7 | /bin/sed 's/,/./g'`;
if ($idle eq "n")
{
# entre 0h00 et 0h10 la commande 'sar' n'est pas a jour...
$idle = `top -b -n 1 | grep "Cpu(s)" | cut -d' ' -f11 | sed s/%//g`;
}
$warning = @ARGV[0];
$critical = @ARGV[1];
$STATE_CRITICAL = 2;
$STATE_OK = 0;
$STATE_WARNING = 1;
$cpu = 100-$idle;

if ( $cpu >= $critical ){
        printf "Charge CPU CRITICAL - use : %g%",$cpu;
        printf " idle : %g%n",$idle;
        exit $STATE_CRITICAL
        ;;
}

if ( $cpu >= $warning ){
        printf "Charge CPU WARNING - use : %g%",$cpu;
        printf " idle : %g%n",$idle;
        exit $STATE_WARNING
        ;;
}else{
        printf "Charge CPU OK - use : %g%",$cpu;
        printf " idle : %g%n",$idle;
        exit $STATE_OK
        ;;
}

sub print_help ()

{
        print($PROG,': 1.0');
}

sub print_usage ()

{
print_help();
printf "nnUsage : check_cpu.pl [warn] [critical]n";
}

Authentification LDAP pour l’interface Web de Nagios

L’idée est d’avoir un .htaccess permettant l’authentification avec LDAP afin d’accéder à l’interface web de Nagios (version 2.0).

Extrait de mon httpd.conf (apache version 2.2) :


ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"


   Options ExecCGI
   AllowOverride All
   Order allow,deny
   Allow from all


Alias /nagios "/usr/local/nagios/share"


   Options None
   AllowOverride All
   Order allow,deny
   Allow from all


Création du .htaccess dans /usr/local/nagios/share et dans /usr/local/nagios/sbin :


AuthName "Controle d'acces"
AuthType Basic
AuthBasicProvider ldap
AuthBasicAuthoritative On
AuthzGroupFileAuthoritative On
AuthLDAPCompareDNOnServer on
AuthLDAPURL ldap://annuaire.mon-domaine.fr/ou=people,dc=mon-domaine,dc=fr?uid?sub?(objectClass=posixAccount)
require ldap-filter |(uid=utilisateur1)(uid=utilisateur2)(uid=utilisateur3)

Je modifie le cgi.cfg de la sorte :


use_authentication=1
#default_user_name=nagios
authorized_for_system_information=utilisateur1,utilisateur2,utilisateur3
authorized_for_configuration_information=utilisateur1,utilisateur2,utilisateur3
authorized_for_all_services=utilisateur1,utilisateur2,utilisateur3
authorized_for_all_hosts=utilisateur1,utilisateur2,utilisateur3

#Autorisation de l'execution de commandes via l'interface de nagios
#authorized_for_system_commands=nagiosadmin,nagios
#authorized_for_all_service_commands=nagiosadmin
#authorized_for_all_host_commands=nagiosadmin

Générer automatiquement les fichiers de configuration de Nagios

Les fichiers de configurations de Nagios (version 2.0) sont assez fastidieux à remplir si l’on doit y ajouter fréquement des nouvelles machines. Voici deux scripts que j’utilise pour m’éviter la saisie à la main de toutes les nouvelles bornes wifi…

PS : Je répertorie ces bornes dans le fichier bornes.wifi suivant :


bornesA: maborneA1
bornesA: maborneA2
bornesA: maborneA3
bornesB: maborneB1
bornesC: maborneC1
...

Scripts config-hosts-wifi-nagios.pl pour la génération du fichier hosts.cfg :


#!/usr/bin/perl
# Ce script permet d'eviter la saisie fastidieuse du fichier de configuration nagios : hosts.cfg
#
# Il permet d'ajouter toutes les bornes wifi dans nagios
#
# Exemple d'emploi: ./config-hosts-wifi-nagios.pl > /usr/local/nagios/etc/hosts-wifi.cfg
# Dans nagios.cfg, il faut indiquer :
# cfg_file=/usr/local/nagios/etc/hosts-wifi.cfg
$f1 = "/home/wifi/bornes.wifi";
open (IN,$f1) || die "impossible d'ouvrir le fichier $f1 n";

while () {
        chop;
        $ligne=$_;
        ($site,$borne)= split(/ /,$ligne);
        $ip= `nslookup $borne | tail -n 2 | sed '/^[[:space:]]*$/d' | sed 's/Address: //g'`;
        print STDOUT  "

define host{
        use                     generic-host            ; Name of host template to use
        host_name               $borne
        alias                   $borne
        address                 $ip        check_command           check-host-alive
        max_check_attempts      10
        notification_interval   120
        notification_period     24x7
        notification_options    d,r
        contact_groups  admins
        }"
;
}

Exemple d’utilisation :


perceval:~# perl /usr/local/scripts/config-hosts-wifi-nagios.pl > /usr/local/nagios/etc/hosts-wifi.cfg

Scripts config-hostgroups-wifi-nagios.sh pour la génération du fichier hostgroups.cfg :


#!/bin/sh
# Ce script permet d'eviter la saisie fastidieuse du fichier de configuration nagios : hostgroups.cfg
#
# Il permet d'ajouter toutes les bornes wifi dans le hostgroup "wifi-ap"
#
# Exemple d'emploi: ./config-hostgroups-wifi-nagios.sh > /usr/local/nagios/etc/hostgroups-wifi.cfg
# Dans nagios.cfg, il faut indiquer :
# cfg_file=/usr/local/nagios/etc/hostgroups-wifi.cfg

fichier2conf=/home/wifi/bornes.wifi
ligne=`cat $fichier2conf | cut -d' ' -f2 | tr 'n' ','`;
echo "define hostgroup{"
echo "   hostgroup_name wifi-ap"
echo "   alias Points d'acces WIFI"
echo "   members $ligne"
echo "}"
echo

Exemple d’utilisation :


perceval:~# sh /usr/local/scripts/config-hostgroups-wifi-nagios.sh > /usr/local/nagios/etc/hostgroups-wifi.cfg

Avant de relancer Nagios, il faut s’assurer que les fichiers de configuration que l’on a générés aient été inlus dans le fichier de configuration général nagios.cfg :


cfg_file=/usr/local/nagios/etc/hosts-wifi.cfg
cfg_file=/usr/local/nagios/etc/hostgroups-wifi.cfg

Ultime vérification de la configuration de Nagios :


perceval:~# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cf

Si c’est OK, on peut relancer Nagios :


perceval:~# /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cf

Graphiques des températures avec RRDTool

Comment grapher les températures de Brest sans sonde?

En allant chercher les informations sur www.weather.com !

1. Installer RRDTool :


perceval:~# apt-get install rrdtool
perceval:~#

2. Créer le répertoire où sera placée la base de données Round Robin (ainsi que les graphiques) :


perceval:~# mkdir /home/temperatures
perceval:~# cd /home/temperatures

3. Créer la base de données :


perceval:~# /usr/bin/rrdtool create temperature.rrd --step 300 \
DS:temp:GAUGE:900:-50:100 \
RRA:LAST:0.5:1:288 \
RRA:AVERAGE:0.5:6:336 \
RRA:AVERAGE:0.5:12:8760 \
RRA:MAX:0.5:12:8760 \
RRA:MIN:0.5:12:8760

4. Ecrire le script /home/temperature/temperature.sh :


#!/bin/sh
logfile="/home/temperature/tempCourante";
rrdfile="/home/temperature/temperature.rrd";
htmldir="/home/temperature";
#
wget -nv -o /dev/null -O /dev/stdout http://fr.weather.com/weather/local/FRXX0019 | grep "ressentie" | cut -d"&" -f2 | sed 's/nbsp;//g' > $logfile
#
value=$(tail $logfile)
#
/usr/bin/rrdtool update $rrdfile N:$value
#
# Create 24hrs image
/usr/bin/rrdtool graph $htmldir/tempDaily.png --title="Variations sur 24hrs (moyenne sur 5 minutes)" \
        DEF:tempC=$rrdfile:temp:LAST -v"° Celsius" -aPNG -h250 -w700 \
        LINE2:tempC#DD0000:"Température" \
        CDEF:nodat=tempC,tempC,+,UN,INF,UNKN,IF \
	HRULE:0#0000DD \
        AREA:nodat#BBBBBB:"NoData"

# Create 7 days image
/usr/bin/rrdtool graph $htmldir/tempWeekly.png --title="Variations sur 7 jours (moyenne sur 1 hr)" \
	DEF:tempC=$rrdfile:temp:AVERAGE  -v"° Celsius" -aPNG -h150 -w700 -s-604800 \
        LINE2:tempC#DD0000:"Température" \
        CDEF:nodat=tempC,tempC,+,UN,INF,UNKN,IF \
	HRULE:0#0000DD \
        AREA:nodat#BBBBBB:"NoData"
#
# Create 28 days image
/usr/bin/rrdtool graph $htmldir/tempMonthly.png --title="Variations sur 28 jours" \
	-v"° Celsius" -aPNG -h150 -w700 -s-2419200 \
        DEF:tempC=$rrdfile:temp:AVERAGE \
        LINE2:tempC#DD0000:"Température" \
        CDEF:nodat=tempC,tempC,+,UN,INF,UNKN,IF \
	HRULE:0#0000DD \
        AREA:nodat#BBBBBB:"NoData"
#
# Create 60 days image
/usr/bin/rrdtool graph $htmldir/temp2Monthly.png --title="Variations sur 60 jours (-60j < 0)" \
        -v"° Celsius" -aPNG -h150 -w700 -l0 -u25 -s-5184000 \
        DEF:tempC=$rrdfile:temp:AVERAGE \
        LINE2:tempC#DD0000:"Température" \
        CDEF:nodatp=tempC,tempC,+,UN,INF,UNKN,IF \
        CDEF:nodatn=tempC,tempC,+,UN,NEGINF,UNKN,IF \
        HRULE:0#0000DD \
        AREA:nodatp#BBBBBB:"NoData" \
        AREA:nodatn#BBBBBB

# Create 2nd 60 days image
/usr/bin/rrdtool graph $htmldir/temp3Monthly.png --title="Variations sur 60 jours (-120j < -60j)" \
        -v"° Celsius" -aPNG -h150 -w700 -l0 -u25 -s-10368000 -e-5184000 \
        DEF:tempC=$rrdfile:temp:AVERAGE \
        LINE2:tempC#DD0000:"Température" \
        CDEF:nodatp=tempC,tempC,+,UN,INF,UNKN,IF \
        CDEF:nodatn=tempC,tempC,+,UN,NEGINF,UNKN,IF \
        HRULE:0#0000DD \
        AREA:nodatp#BBBBBB:"NoData" \
        AREA:nodatn#BBBBBB
#
#
# Create 3th 60 days image
/usr/bin/rrdtool graph $htmldir/temp4Monthly.png --title="Variations sur 60 jours (-180j < -120j)" \
        -v"° Celsius" -aPNG -h150 -w700 -l0 -u25 -s-15552000 -e-10368000 \
        DEF:tempC=$rrdfile:temp:AVERAGE \
        LINE2:tempC#DD0000:"Température" \
        CDEF:nodatp=tempC,tempC,+,UN,INF,UNKN,IF \
        CDEF:nodatn=tempC,tempC,+,UN,NEGINF,UNKN,IF \
        HRULE:0#0000DD \
        AREA:nodatp#BBBBBB:"NoData" \
        AREA:nodatn#BBBBBB
#
# Create 1 year image
/usr/bin/rrdtool graph $htmldir/tempYearly.png --title="Variations sur une année" \
        -v"° Celsius" -aPNG -h150 -w700 -s-31449600 \
        DEF:tempMin=$rrdfile:temp:MIN \
        DEF:tempMax=$rrdfile:temp:MAX \
        AREA:tempMax#EEDDAA:"Variations journalières" \
        AREA:tempMin#FFFFFF \
        LINE1:tempMax#DD0000:"Max" \
        LINE1:tempMin#0000DD:"Min" \
        CDEF:nodatp=tempMax,tempMin,+,UN,INF,UNKN,IF \
        CDEF:nodatn=tempMax,tempMin,+,UN,NEGINF,UNKN,IF \
        HRULE:0#0000DD \
        AREA:nodatp#BBBBBB:"NoData" \
        AREA:nodatn#BBBBBB

date > $htmldir/dateCourante.txt
echo Température: $value ° Celsius > $htmldir/tempCourante.txt

Ce script récupère la température (extérieure) instantamnée pour la ville de BREST (29) par un wget sur le site www.weather.com.

5. Ajouter dans le crontab :


# Lancement tous les 5 minutes
#
*/5 * * * * /home/temperature/temperature.sh > /dev/null 2>&1

6. Créer une page HTML pour l’affichage des graphiques (il y en a 7).
7. Modifier la configuration d’Apache pour pouvoir accéder au répertoire /home/temperature depuis le serveur Web.

Ordre des graphiques avec Cacti

Il ne semble pas possible de gérer l’ordre des graphiques lors de leur affichage dans l’arbre des hosts. L’ordre, utilisé par Cacti (0.86h), est l’ordre alphabétique par nom de Template Graph. Si, par exmple, je veux que le graphique concernant la charge CPU d’une machine apparaîsse en premier dans les graphiques associés à cette machine… il faut que je m’arrange pour que le nom du Template Graph en question soit en tête de liste…alphabétiquement.

Pas très pratique…

L’ordre des Graph Trees n’est également pas modifiable : c’est aussi l’ordre alphabétique !

Quelques OIDs…

Superviser les machines avec SNMP…

Quelques oids :

Windows

Charge proc (proc1 – windows 2003) :
.1.3.6.1.2.1.25.3.3.1.2.1
Charge proc (proc2 – windows 2003) :
.1.3.6.1.2.1.25.3.3.1.2.2
Nombre de users sur IIS (windows 2003 srv) :
.1.3.6.1.4.1.311.1.7.3.1.13
Nombre d’users connectés (windows 2003 srv) :
.1.3.6.1.4.1.77.1.2.19.0
Charge processeur système (nt4 + snmp4NT) :
.1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.3.48.58.48
Charge processeur users (nt4 + snmp4nt) :
.1.3.6.1.4.1.311.1.1.3.1.1.2.1.4.3.48.58.48

Proliant (avec inside manager.windows 2003Srv & MIB HP)

Temperature CPU1 :
.1.3.6.1.4.1.232.6.2.6.8.1.4.0.1
Temperature CPU2 :
.1.3.6.1.4.1.232.6.2.6.8.1.4.0.2
Temperature IoBoard :
.1.3.6.1.4.1.232.6.2.6.8.1.4.0.3
Temperature alimentation :
.1.3.6.1.4.1.232.6.2.6.8.1.4.0.5

Linux (avec Net-SNMP)

Memoire disponible ram+swap :
.1.3.6.1.4.1.2021.4.11
Memoire disponible ram :
.1.3.6.1.4.1.2021.4.6.0
Pourcentage cpu système :
.1.3.6.1.4.1.2021.11.10
Pourcentage cpu user :
.1.3.6.1.4.1.2021.11.9
Partition / disque disponible :
.1.3.6.1.4.1.2021.9.1.7
Partition / pourcentage utilisé :
.1.3.6.1.4.1.2021.9.1.9
Charge système 5min :
.1.3.6.1.4.1.2021.10.1.3.2
Memoire disponible ram :
.1.3.6.1.4.1.2021.4.6.0
Uptime :
.1.3.6.1.2.1.1.3.0

Autres

Nombre connectés wifi :
.1.3.6.1.4.1.9.9.273.1.1.2.1.1.1
Taille du cache courant (squid) :
.1.3.6.1.4.1.3495.1.3.2.1.14
Nombre de clients connectés au cache :
.1.3.6.1.4.1.3495.1.3.2.1.15.0