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

Configurer le plugin Java JRE pour firefox

Lien vers le fichier « auto-extractible » :
http://www.java.com/fr/download/manual.jsp

A modifier suivant les configurations :


# Installation de JRE :
su
chmod a+x jre-1_5_0_06-linux-i586.bin
./jre-1_5_0_06-linux-i586.bin
cp -R jre-1_5_0_06/ /usr/java/

# Configuration pour Firefox :
ln -s /usr/java/jre-1_5_0_06/plugin/i386/ns7/libjavaplugin_oji.so /usr/lib/firefox-1.0.7/plugins/

# Suppression du fichier d'installation :
rm jre-1_5_0_06-linux-i586.bin

Remplacer un retour chariot par un espace

Après des essais avec sed et awks, je me suis aperçu que tr le faisait également très bien!

L’exemple suivant montre le remplacement d’un retour à la ligne par une virgule suivie d’un espace :


perceval:~# cat monfichier.txt
1
2
3
perceval:~# cat monfichier.txt | tr -s "n" ", "
1, 2, 3,

Insertion de code source dans un post WordPress

L’objectif est de pouvoir insérer du code source dans les posts de WordPress. L’idée est d’éviter les retours à la ligne automatique… en ajoutant une scrollbar.

Voici le code css associé à la balise pre que j’utilise dans mes posts WordPress :


pre {
	font-family: monaco, "Courier New", monospace;
	font-size: 1.1em;
	color: #666;
	width: 99%;
	padding-top:15px;
	padding-bottom:15px;
	padding-left:5px;
	padding-right:5px;
	overflow: scroll;
	border: 1px solid #ccc;
}

Ce qui permet d’avoir un affichage correcte sous IE (et c’est bien sûr parfaitement valide sous Firefox).

Bilan: En fait, pour avoir un rendu correct sous IE, je suis obligé d’avoir une scrollbar horizontale et verticale même si mon texte ne dépasse pas la largeur du cadre… merci IE! 🙁

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

Envoyer un mail en ligne de commande

Prérequis : Le service SMTP de la machine peut expédier des messages.

1) Envoyer un mail simple (sans pièce jointe) :


perceval:~# mail -s "Le sujet" login@mailhost < mon.fichier

2) Envoyer un mail avec une pièce jointe:


perceval:~# echo "contenu" | mutt -x -a mon.fichier -s "sujet" login@mailhost

Attribuer les droits root à un utilisateur

En temps que root, exécuter /usr/sbin/visudo afin d’éditer la liste des utilisateurs pouvant invoquer sudo.

Pour l’instant, la liste ne doit contenir qu’un item :


root ALL=(ALL) ALL

Pour que l’utilisateur arnaud ait un accès super-utilisateur modifier ainsi :


root ALL=(ALL) ALL
arnaud ALL =(ALL) ALL

Par exemple, pour que l’utilisateur arnaud ait un accès sur la machine journal avec les droits de l’utilisateur nagios :


arnaud journal=(nagios) ALL

La syntaxe est la suivante :


utilisateur machine=(utilisateur réel) commande

Pour éviter les longues listes on peut créer des alias :


User_Alias ADMINS=arnaud,john
Runas_Alias UTILISATEURS_SECU=nagios,monids
Host_Alias SERVEURS_SECU=nagios,monids
Cmnd_Alias BIN_SECU=/usr/local/nagios/bin/nagios,/usr/local/monids/bin/monids
ADMINS SERVEURS_SECU=(UTILISATEURS) BIN_SECU