mercredi 9 mars 2011

Patch du jour : NRPE et les sorties longues

NRPE est vraiment un compagnon inséparable de nagios : lancer des plugins à distance sur un serveur et récupérer leurs résultats au travers d'une simple commande check_nrpe.

Pour l'illustrer, lançons un démon NRPE avec le fichier de configuration suivant :


log_facility=daemon
pid_file=./nrpe.pid
server_port=5666
server_address=127.0.0.1
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=127.0.0.1
dont_blame_nrpe=0
debug=0
command_timeout=60
connection_timeout=300

command[short_output]=/bin/cat /tmp/test
command[long_output]=/bin/cat /etc/screenrc


Nous y avons défini deux commandes (short_output et long_output) et nous l'avons fait écouter sur l'adresse localhost. Lançons maintenant notre process :


# ./nrpe -c ./nrpe.cfg -d
# ps -ef | grep nrpe
nagios 11411 1 0 22:39 ? 00:00:00 ./nrpe -c ./nrpe.cfg -d
root 11417 6370 0 22:39 pts/4 00:00:00 grep --color=auto nrpe


Essayons maintenant de récupérer le résultat d'une de nos commandes :


$ ./check_nrpe -H localhost -c short_output
Retour NRPE|Short_output=1


Tout semble fonctionner au mieux mais malheureusement dans le cas d'une sortie trop grande, tout ce qui dépasse 1024 ieme octet est ignoré :


$ ./check_nrpe -H localhost -c long_ouput | wc
34 160 1024


En creusant un peu, cette limitation vient de la définition d'une constante C dans le fichier include/common.h :

#define MAX_PACKETBUFFER_LENGTH 1024


Ici, la solution qui vient immédiatement à l'esprit est de simplement changer cette valeur et relancer la compilation. Une fois la recompilation terminée, nous obtenons un binaire check_nrpe et un binaire nrpe.

En lançant notre nrpe patché, nous avons effectivement le résultat attendu. Petit soucis, si vous avez déjà des agents NRPE et que vous voulez lancer votre commande check_nrpe sur un ancien serveur, vous obtiendrez une belle erreur vous indiquant un soucis de communication :


$ ./check_nrpe -H localhost -c short_output
CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.


Si vous êtes comme moi avec environ 300 agents NRPE déjà existant, vous aurez quelques hésitations à les redéployer tous. Heureusement, tonvoon a écrit un patch assez astucieux à ce sujet il y a déjà quelques temps. Le principe est d'utiliser le champ packet_type pour indiquer un nouveau type RESPONSE_PACKET_WITH_MORE en plus des types RESPONSE_PACKET et QUERY_PACKET. Lorsque le plugin check_nrpe détecte ce type de paquet, au lieu de terminer la communication, le client récupère les packets suivants pour les concaténer jusqu'au maximum de 16ko. Et cerise sur le gateau : le plugin check_nrpe reste compatible avec les anciens clients NRPE !

Vous pouvez donc mettre votre plugin check_nrpe à jour et faire la mise à jour au fil de l'eau pour vos agents NRPE voir - si vous êtes vraiment un gros feignant - ne le faire que là où vous en avez besoin.

Pour appliquer le patch, récupérer une copie de NRPE en version 2.12, patcher là avec le fichier suivant puis lancer le classique configure ; make ; make install. Vous obtiendrez alors vos deux binaires à utiliser.