Monit
Monit est un service de monitoring qui vérifie que certaines conditions sont remplies (tel fichier a tel checksum, tels droits, tel service tourne, tel requete tcp/ip renvoie tel truc, etc) et lance des actions sinon (redémarrer, mail d'alerte).
Dans squeeze, c'est la 5.1 qui est dispo, mais elle marche pas dans un container openvz (pb de lecture des infos de ram, pas grave mais 2 lignes d'erreur par check), mais c'est assez simple de récupérer la 5.4 (un binaire et une page de man).
Syntaxe
On va se créer un fichier /etc/monit/serviceTruc par service à surveiller.
La syntaxe est assez simples, avec les deux seules entrées
set itemAConfigurer
check serviceASurveiller
Pour un process vaut mieux un pidfile, mais on peut préciser une regex, pour un fichier le chemin.
Ensuite, faut commencer avec les exemples fournis sur http://mmonit.com/wiki/Monit/ConfigurationExamples
La page de man est très complète.
On peut tester certaines choses gourmandes de temps en temps seulement (ou sauf sur certaines tranches horaires où c'est “normal” de sortir des clous), avec every
check process toto matching /usr/local/bin/toto # prend le 1er process qui satisfait la regex every 2 cycles ...
check process mysqld with pidfile /var/run/mysqld.pid not every "* 0-3 * * 0" # on vérifie pas entre minuit et trois heures du mat le dimanche
Il connait les protocoles : APACHE-STATUS DNS DWP FTP GPS HTTP IMAP CLAMAV LDAP2 LDAP3 LMTP MEMCACHE MYSQL NNTP NTP3 POP POSTFIX-POLICY RADIUS RDATE RSYNC SIP SMTP SSH TNS PGSQL, ce qui permet de faire par ex du
Ça permet de faire du
if failed host 192.168.1.100 port 8080 protocol http and request '/testing' hostheader 'example.com' with timeout 20 seconds for 2 cycles then alert
if failed port 80 protocol http
and request "/page.html" with checksum 8f7f419955cefa0b33a2ba316cba3659
then alert
if failed unixsocket /var/run/php5-fpm/mypool.socket ...
if failed (url http://myhost.tld/check and content == 'OK') then alert
En théorie on peut faire du
if failed host sqlhost port 3306 protocol mysql send "string de connexion + select" expect "résultat attendu" then alert
mais la chaîne de connexion est un peu compliquée à élaborer, autant avoir un script externe qui utilise le binaire mysql et filtre avec awk pour répondre OK (par exemple).
check program toto with path "/root/toto.sh" if status != 0 then alert
et dans toto.sh on met par ex (stderr sera dans le mail d'alerte)
# ... params # la requete doit renvoyer 1 nb=$(mysql $MYSQL_OPTS -e "$QUERY") if [ "$nb" != "1" ] then echo "Avec mysql $MYSQL_OPTS -e '$QUERY' >&2 echo "On a pas récupéré '1' mais $nb" >&2 exit 1 fi exit 0