Rapport journalier d'un serveur avec les graphs Munin
Quand on a quelques serveurs à surveiller, il est intéressant de pouvoir rendre plus rapide certaines tâches. Une de nos préoccupations était d'avoir un rapport journalier de l'état de chaque serveur. L'idée est de connaître des informations plus ou moins basiques sur nos système et de recevoir une partie des graphs générés par Munin.
Nos contraintes étaient de ne pas installer un énième service, d'avoir une complète compréhension de l'outil utilisé et de rendre le rendu customisable. Du coup, c'est à coup de sendmail et d'une bonne doc que ça s'est terminé.
Je vais donc partager avec vous un script assez simple qui enverra un mail avec les informations que vous désirez.
Pour l'exemple, j'ai décidé d'afficher :
- Le nom du serveur
- La date à laquelle le rapport est généré
- L'Uptime de la machine
- La sortie de ifconfig
- La sortie de df
- La sortie de mount
- Tous les graphs de Munin sauf ceux relatifs à la conso de bande passante des sites hébergés
#!/bin/sh
# destinataire du mail
TOADDR=moi@exemple.com
# le hostname de la machine
SERVER=$(/bin/hostname)
# la date courrante
DATE=$(date)
# la sortie de df avec des valeurs numériques lisibles
DF=$(df -h)
# l'uptime de la machine
UPTIME=$(uptime)
# les différents points de montage de la machine
MOUNT=$(mount)
# les infos sur les interfaces réseaux
IFCONFIG=$(/sbin/ifconfig)
# le sépérateur qui permettra d'envoyer en pièces jointes les graphs de Munin
BOUNDARY="-$(/bin/date | /usr/bin/md5sum | cut -d ' ' -f 1)"
(
cat << EOF
From: no-reply@$SERVER
To: $TOADDR
Subject: [$SERVER] Rapport journalier
Content-type: multipart/mixed;
boundary="$BOUNDARY"
--$BOUNDARY
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<style type="text/css">
body {
font-family:verdana;
width:700px;
}
ul {
padding:10px;
margin:0;
border:1px solid #CCC;
}
li {
padding:0;
margin:0 0 0 15px;
}
h2 {
border-bottom:1px solid #333;
background:#eee;
padding:5px;
}
</style>
<h1>Rapport journalier</h1>
<ul>
<li>Serveur : $SERVER</li>
<li>Date : $DATE</li>
<li>Uptime : $UPTIME</li>
</ul>
<h2>Reseau</h2>
<pre>$IFCONFIG</pre>
<h2>Point(s) de montage(s)</h2>
<pre>$MOUNT</pre>
<h2>Espace(s) disque(s)</h2>
<pre>$DF</pre>
</body>
</html>
EOF
echo
cd /var/cache/munin/www/localhost/localhost/
for i in *day.png; do
if [ "$(echo $i | cut -d _ -f 1)" != "apache" ]; then
echo "--$BOUNDARY"
echo "Content-type: image/png;"
echo " name=\"$i\""
echo "Content-Transfer-Encoding: base64"
echo "Content-ID: <$i>"
echo "Content-Disposition: attachement;"
echo " filename=\"$i\""
echo
/usr/bin/base64 /var/cache/munin/www/localhost/localhost/"$i"
fi
done
echo
echo "--$BOUNDARY--"
) | /usr/sbin/sendmail "$TOADDR"
Le script complet étant :
#!/bin/sh
# destinataire du mail
TOADDR=moi@exemple.com
# le hostname de la machine
SERVER=$(/bin/hostname)
# la date courrante
DATE=$(date)
# la sortie de df avec des valeurs numériques lisibles
DF=$(df -h)
# l'uptime de la machine
UPTIME=$(uptime)
# les différents points de montage de la machine
MOUNT=$(mount)
# les infos sur les interfaces réseaux
IFCONFIG=$(/sbin/ifconfig)
# le sépérateur qui permettra d'envoyer en pièces jointes les graphs de Munin
BOUNDARY="-$(/bin/date | /usr/bin/md5sum | cut -d ' ' -f 1)"
(
cat << EOF
From: no-reply@$SERVER
To: $TOADDR
Subject: [$SERVER] Rapport journalier
Content-type: multipart/mixed;
boundary="$BOUNDARY"
--$BOUNDARY
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<style type="text/css">
body {
font-family:verdana;
width:700px;
}
ul {
padding:10px;
margin:0;
border:1px solid #CCC;
}
li {
padding:0;
margin:0 0 0 15px;
}
h2 {
border-bottom:1px solid #333;
background:#eee;
padding:5px;
}
</style>
<h1>Rapport journalier</h1>
<ul>
<li>Serveur : $SERVER</li>
<li>Date : $DATE</li>
<li>Uptime : $UPTIME</li>
</ul>
<h2>Reseau</h2>
<pre>$IFCONFIG</pre>
<h2>Point(s) de montage(s)</h2>
<pre>$MOUNT</pre>
<h2>Espace(s) disque(s)</h2>
<pre>$DF</pre>
</body>
</html>
EOF
echo
cd /var/cache/munin/www/localhost/localhost/
for i in *day.png; do
if [ "$(echo $i | cut -d _ -f 1)" != "apache" ]; then
echo "--$BOUNDARY"
echo "Content-type: image/png;"
echo " name=\"$i\""
echo "Content-Transfer-Encoding: base64"
echo "Content-ID: <$i>"
echo "Content-Disposition: attachement;"
echo " filename=\"$i\""
echo
/usr/bin/base64 /var/cache/munin/www/localhost/localhost/"$i"
fi
done
echo
echo "--$BOUNDARY--"
) | /usr/sbin/sendmail "$TOADDR"
Bien sûr, il ne reste plus qu'à lancer le script régulièrement. Pour ce faire, on va simplement créer une tâche cron qui exécutera le script à minuit :
0 0 * * * /chemin/vers/le/script
![[TIP] Générateur SPF](https://www.deblan.io/media/cache/post_preview_filter/uploads/post/2007-2021/a8cbce0859e7181e02d0add48faf9059.jpeg)
[TIP] Générateur SPF
SPF est une des solutions techniques qui permet d'identifier un serveur comme légitime pour …

Alsa, Debian et le Dell XPS 15
Un bref article pour poser la configuration d'Alsa qui permet de gérer des sorties sons simu…

Debian + XPS 15 (9530)
Mon agence m'a acheté le dernier XPS 15 de Dell (9530). C'est une belle machine, autant à l'…