Deblan blog

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
Étape 1 : configurer quelques variables
#!/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)"
Étape 2 : la création du contenu Html du mail :
(
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
Étape 3 : la création des pièces jointes
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--"
Étape 4 : l'envoie du mail
) | /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

Ajouter un commentaire

Vous pouvez utiliser du markdown.Afficher l'aide.