nagios supervision debian nginx
For english readers, there is a more recent version of this article available in english. check it out: Nagios with Nginx on Fedora (or Amazon Linux AMI)
# aptitude install nagios3
Oui, alors, on va me dire que c'est un peu rude pour une introduction, met en fin de compte ça parle de soit-même !
Le répertoire /etc/nagios3/ contient les fichiers suivants:
ramiel:/etc/nagios3# ls -l total 76 -rw-r--r-- 1 root root 1905 oct. 23 13:38 apache2.conf -rw-r--r-- 1 root root 12218 oct. 23 13:39 cgi.cfg -rw-r--r-- 1 root root 2441 oct. 23 13:39 commands.cfg drwxr-xr-x 2 root root 4096 avril 1 11:09 conf.d -rw-r--r-- 1 root root 43769 oct. 23 13:39 nagios.cfg -rw-r----- 1 root nagios 1293 oct. 23 13:38 resource.cfg drwxr-xr-x 2 root root 4096 avril 1 11:10 stylesheets
Nagios stocke ses users dans un fichier htpasswd.users, on peux donc créer un nouvel utilisateur et lui associer un mot de passe via la commande htpasswd de Apache.
ramiel:/etc/nagios3# htpasswd -c htpasswd.users nagiosadmin New password: Re-type new password: Adding password for user nagiosadmin
Le fichier htpasswd.users contient alors la ligne suivante:
ramiel:/etc/nagios3# cat htpasswd.users nagiosadmin:5sadZeasd23adt
Nagios fournit une configuration pour Apache, mais pour Nginx, il faut la modifier quelque peux. Tout d'abord, les scripts CGI de Nagios étant écris en C, il nous faut installer un wrapper fastcgi pour exécuter ces derniers. Ce wrapper bindera un socket et Nginx enverra les requêtes vers le socket, et récupérera la réponse sous forme de code HTML pour la renvoyer au client.
Récupérons le code source.
ramiel:~# wget http://github.com/gnosek/fcgiwrap/tarball/master ramiel:~# tar -xzvf gnosek-fcgiwrap-ba8c8d9.tar.gz gnosek-fcgiwrap-ba8c8d9/ gnosek-fcgiwrap-ba8c8d9/.gitignore gnosek-fcgiwrap-ba8c8d9/Makefile.in gnosek-fcgiwrap-ba8c8d9/README.rst gnosek-fcgiwrap-ba8c8d9/configure.ac gnosek-fcgiwrap-ba8c8d9/fcgiwrap.c
Et on compile, la présence du package libfcgi-dev est nécessaire:
ramiel:~/gnosek-fcgiwrap-ba8c8d9# autoconf ramiel:~/gnosek-fcgiwrap-ba8c8d9# ./configure [...] ramiel:~/gnosek-fcgiwrap-ba8c8d9# make gcc -std=gnu99 -Wall -Wextra -Werror -pedantic -O2 -g3 fcgiwrap.c -o fcgiwrap -lfcgi
Ce qui nous donne le binaire fcgiwrap. On déplace ce binaire dans /usr/bin/ et on crée le script suivant dans /etc/init.d pour lancer fcgiwrap avec spawn-fcgi (paquet à installer).
#!/bin/bash COMMAND=/usr/bin/spawn-fcgi NAME=fcgiwrap ADDRESS=127.0.0.1 PORT=9001 USER=www-data GROUP=www-data PHPCGI=/usr/bin/fcgiwrap KILL=/bin/kill case "$1" in start) start-stop-daemon --start \ --exec $COMMAND -- -a $ADDRESS -p $PORT \ -u $USER -g $GROUP -f $PHPCGI -P /var/run/$NAME.pid|| true echo -n "$NAME started with pid " cat /var/run/$NAME.pid echo ;; stop) if [ -e /var/run/$NAME.pid ] then $KILL `cat /var/run/$NAME.pid` rm /var/run/$NAME.pid echo "$NAME stopped" else echo "$NAME is not running, no pid file in /var/run/" fi ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit $RETVAL
On lance ensuite ce script, qui va mettre fcgiwrap en écoute sur le port 9001.
ramiel:~/# /etc/init.d/spawnfcgiwrap start spawn-fcgi: child spawned successfully: PID: 6947 fcgiwrap started with pid 6947 ramiel:~/# netstat -taupen |grep LISTEN |grep 9001 tcp 0 0 127.0.0.1:9001 0.0.0.0:* LISTEN 0 873400 6947/fcgiwrap
On termine par un lien dans /etc/rc2.d pour le lancement au démarrage.
ramiel:~/# ln -s /etc/init.d/spawnfcgiwrap /etc/rc2.d/S19spawnfcgiwrap
Ceci étant fait, nous pouvons maintenant créer le virtual host de Nginx. Je ne rentre pas dans le détail ici, il faut surtout faire attention à la section cgi pour bien envoyer les requêtes vers fcgiwrap.
<note important>je n'ai pas cherché à comprendre comment été structurées les pages de Nagios 3, mais il semblerait que la ré-écriture d'URL soit indispensable. En attente de mieux, la page Nagios est accessible depuis la racine du serveur “/”… si vous avez mieux je suis preneur !</note>
ramiel:/etc/nginx/sites-available# grep -v "^$" ssl|grep -v "#" server { listen 443; server_name nagios.toto.com; ssl on; ssl_certificate /etc/nginx/certs/nagioscert.pem; ssl_certificate_key /etc/nginx/certs/nagioscert.key; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:+EXP; ssl_prefer_server_ciphers on; access_log /var/log/nginx/nagios-ssl.access.log; error_log /var/log/nginx/nagios-ssl.error.log; location / { root /usr/share/nagios3/htdocs; index index.html index.htm; rewrite ^/nagios3/(.*) /$1 break; auth_basic "Restricted"; auth_basic_user_file /etc/nagios3/htpasswd.users; } location /cgi-bin/nagios3/ { root /usr/lib/; include /etc/nginx/fastcgi_params; auth_basic "Restricted"; auth_basic_user_file /etc/nagios3/htpasswd.users; fastcgi_param AUTH_USER $remote_user; fastcgi_param REMOTE_USER $remote_user; if ($uri ~ "\.cgi$"){ fastcgi_pass 127.0.0.1:9001; } } }
On peut maintenant visiter la page d'accueil de nagios, après passage du login, et admirer la configuration par défaut. Cette dernière inclus automatiquement la machine locale et la passerelle réseau. On a donc deux machines déjà visualisables dans l'interface:
L'interface Web de Nagios ne permet pas de gérer la configuration. Pour cela, il faut se rendre dans /etc/nagios3/conf.d/ et modifier les templates existants.
Par exemple, le fichier localhost_nagios2.cfg contient la configuration du host local, on peut renomer ce fichier du nom du serveur local et modifier son contenu pour remplacer, dans mon cas, tous les “localhost” par des “ramiel”.
ramiel:/etc/nagios3/conf.d# mv localhost_nagios2.cfg ramiel.cfg ramiel:/etc/nagios3/conf.d# vim ramiel.cfg 1 # A simple configuration file for monitoring the local host 2 # This can serve as an example for configuring other servers; 3 # Custom services specific to this host are added here, but services 4 # defined in nagios2-common_services.cfg may also apply. 5 # 6 7 define host{ 8 use generic-host ; Name of host template to use 9 host_name ramiel 10 alias ramiel 11 address 127.0.0.1 12 } [...]
<note tip>Dans Vim, pour remplacer les occurences d'un mot par un autre, on peut utiliser la commande
:g/localhost/s//ramiel/g
(en mode commande).</note>
Ce fichier se base sur le template “generic-host” définit dans generic-host_nagios2.cfg. Le template détaille les méthodes utilisées sur ce type de host, et en particulier la méthode pour déterminer s'il est en vie. La méthode par défaut est le ping via la commande check-host-alive:
check_command check-host-alive
Ce qui signifie que pour savoir si les host de ce type sont vivant, on va les pinger non stop (toutes les minutes).
Dans le fichier hostgroups_nagios2.cfg se trouvent les groupes utilisés pour les tests. Notre “localhost” est présent dans tous les groupes, et l'on va le remplacer par “ramiel” afin de ne plus avoir de référence à localhost.
Puis on redémarre nagios, et de retour dans l'interface, localhost à bien été remplacé par ramiel.
Voyons maintenant comment ajouter un hôte supplémentaire à Nagios. Toutefois, cet hôte ne sera pas joignable par la méthode ping, on va donc créer un nouveau template, copie du template par défaut, ou la méthode check command est remplacée du ping à un check_http.
On crée ce template dans le fichier web-host.cfg:
ramiel:/etc/nagios3/conf.d# cat web-host.cfg # Web Host (alive is done by http) definition template - This is NOT a real host, just a template! define host{ name web-host ; The name of this host template notifications_enabled 1 ; Host notifications are enabled event_handler_enabled 1 ; Host event handler is enabled flap_detection_enabled 1 ; Flap detection is enabled failure_prediction_enabled 1 ; Failure prediction is enabled process_perf_data 1 ; Process performance data retain_status_information 1 ; Retain status information across program restarts retain_nonstatus_information 1 ; Retain non-status information across program restarts check_command check_http max_check_attempts 10 notification_interval 0 notification_period 24x7 notification_options d,u,r contact_groups admins register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! }
On va ensuite créer un fichier “ptichoun.cfg” dans le répertoire /etc/nagios3/conf.d/ et le remplir comme suis:
ramiel:/etc/nagios3/conf.d# vim ptichoun.cfg define host{ use web-host host_name ptichoun alias ptichoun address ptichoun.linuxwall.info }
Et l'on va mettre ce nouvel Host dans le groupe “http-servers” du fichier hostgroups_nagios2.cfg.
ramiel:/etc/nagios3/conf.d# vim hostgroups_nagios2.cfg [...] define hostgroup { hostgroup_name http-servers alias HTTP servers members ramiel, ptichoun }
Il faut ensuite redémarrer nagios pour prendre ce nouvel host en compte.
si vous voulez jeter un coup d'oeil aux commandes qui sont lancés, c'est dans le répertoire /etc/nagios-plugins/config qu'il faut aller. On y trouve, par exemple, le fichier http.cfg qui contient les commandes lancées pour les tests HTTP.
ramiel:/etc/nagios-plugins/config# head http.cfg # 'check_http' command definition define command{ command_name check_http command_line /usr/lib/nagios/plugins/check_http -H '$HOSTADDRESS$' -I '$HOSTADDRESS$' } # 'check_http_hostname' command definition define command{ command_name check_httpname command_line /usr/lib/nagios/plugins/check_http -H '$HOSTNAME$' -I '$HOSTADDRESS$'
on peut ainsi lancer les commandes de check manuellement:
ramiel:/etc/nagios-plugins/config# /usr/lib/nagios/plugins/check_http check_http: Impossible de dcomposer les arguments Utilisation: check_http -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>] [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-a auth] [-b proxy_auth] [-f <ok | warn | critcal | follow | sticky | stickyport>] [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>] [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>] [-A string] [-k string] [-S] [-C <age>] [-T <content-type>] [-j method] ramiel:/etc/nagios-plugins/config# /usr/lib/nagios/plugins/check_http -H ptichoun.linuxwall.info -I ptichoun.linuxwall.info HTTP OK: HTTP/1.1 200 OK - 56647 bytes in 0,737 second response time |time=0,736849s;;;0,000000 size=56647B;;;0
Admettons que nous souhaitons valider le fonctionnement d'un serveur DNS Bind. On peux, pour cela, créer une commande qui va lancer une requête DNS sur le serveur de destination.
Pour cela, il faut modifier le fichier de commandes DNS dans /etc/nagios-plugin/config/dns.cf. On va y ajouter une nouvelle commande “check_dns_srv” comme suis:
# vim /etc/nagios-plugins/config/dns.cfg [...] # 'check_dns_srv' command definition define command{ command_name check_dns_srv command_line /usr/lib/nagios/plugins/check_dns -H '$HOSTADDRESS$' -s '$HOSTADDRESS$' }
Puis, dans le host voulu, on va rajouter ce contrôle sous la forme d'un “service”:
ramiel:/etc/nagios3/conf.d# cat neuromatrice.cfg define host{ use ssh-host host_name maurice alias maurice address maurice.linuxwall.info } # Define a service to check the DNS Daemon define service{ use generic-service ; Name of service template to use host_name maurice service_description DNS Daemon check_command check_dns_srv }