Nagios
Prérequis
Tout d'abord, assurez-vous d'avoir installé le dépôt EPEL car la majeure partie de nos paquets viennent de cette source !
Installation
Nagios à besoin d'un serveur web pour fonctionner, ce qui nous donne :
yum -y install httpd nagios nagios-plugins-all
Avant d'aller plus loin, intéressons-nous au fonctionnement de Nagios.
Fonctionnement
Configuration
Plusieurs éléments de configuration sont présents dans Nagios:
timeperiods
Elles permettent de fixer les plages de notifications des contacts et de contrôle des hôtes et services.
contact
Ceux sont les personnes qu'ils faut alerter par la supervision
contactgroup
Ceux sont des groupes de plusieurs contact qui vont être alertées en même temps. Ceux sont souvent des personnes occupant le même poste (administrateur système, webmestre , responsable d'exploitation, etc...)
hosts
Ils représentent les machines physiques à superviser
hostgroup
Permettent de rassembler plusieurs host occupant le même rôle ou faisant tourner une même application.
services
Ceux sont les contrôles à effectuer sur un host (DNS, est-ce que le démon SSH tourne ?, % d'utilisation CPU, % d'utilisation mémoire, l’IO disque, ...)
servicegroup
Permet de rassembler des services pour les considerer comme un bloc comme c'est souvent le cas dans un cluster applicatif.
template
Ils permettent d'éviter les redondances au niveau des définitions d’hôtes et de services en regroupant des variables communes.
Notifications
- Au début le service est disponible, le voyant est au vert (état OK)
- Quand le service ne répond plus, Nagios le passe de l’état OK à Warning. Le service passe en état SOFT, c'est à dire que Nagios va déclencher le cycle de vérification de la fiabilité de l’incident (utilisation de retry_check et max_check_attemps)
- Au bout du cycle de vérification, Nagios passe le service en état HARD, c'est à dire que l’incident est certifié. Le cycle de notification va commencer (tous les notification_interval).
- Quand le service répond de nouveau, Nagios envoi une dernière notification pour signaler que le service est repassé à l'état OK.
Configuration
Commençons par observer le contenu du répertoire /etc/nagios/objects:
# ll /etc/nagios/objects total 48 -rw-rw-r--. 1 root root 7704 31 août 2013 commands.cfg -rw-rw-r--. 1 root root 2166 31 août 2013 contacts.cfg -rw-rw-r--. 1 root root 5403 31 août 2013 localhost.cfg -rw-rw-r--. 1 root root 3124 31 août 2013 printer.cfg -rw-rw-r--. 1 root root 3293 31 août 2013 switch.cfg -rw-rw-r--. 1 root root 11158 31 août 2013 templates.cfg -rw-rw-r--. 1 root root 3208 31 août 2013 timeperiods.cfg -rw-rw-r--. 1 root root 4019 31 août 2013 windows.cfg
Timeperiods.cfg
Dans ce fichier sont déclaré les périodes que nous allons pouvoir utiliser pour la vérification des hôtes ou des services. Ci-dessous un exemple :
define timeperiod{ timeperiod_name 24x7 alias 24 Hours A Day, 7 Days A Week sunday 00:00-24:00 monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 }
On voit qu'une période se définit comme suit :
- timeperiod_name : identifiant de la période, doit être unique dans toute la configuration de 'Nagios;
- alias : appellation longue, permettant de mieux identifier la période;
- monday 00:00-24:00, tuesday 00:00-24:00, ... : les jours de la semaine suivis de l'heure de début et de l'heure de fin.
Pas très compliqué de créer sa propre période. Imaginons que nous voulions une période qui correspond aux lundi matin entre 8h et 9h :
define timeperiod{ timeperiod_name week_start alias Lundi matin de 8h à 9h monday 08:00-09:00 }
contact.cfg
Dans ce fichier sont déclaré les contacts qui vont pouvoir être contactés quand un problème surviendra. Ci-dessous un exemple :
define contact{ contact_name nagiosadmin ; Short name of user use generic-contact ; Inherit default values from generic-contact template (defined above) alias Nagios Admin ; Full name of user email nagios@localhost ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ****** }
Si on regardes bien, ce contact utilise un template qui contient les lignes suivantes:
define contact{ name generic-contact ; The name of this contact template service_notification_period 24x7 ; service notifications can be sent anytime host_notification_period 24x7 ; host notifications can be sent anytime service_notification_options w,u,c,r,f,s ; send notifications for all service states, flapping events, and scheduled downtime events host_notification_options d,u,r,f,s ; send notifications for all host states, flapping events, and scheduled downtime events service_notification_commands notify-service-by-email ; send service notifications via email host_notification_commands notify-host-by-email ; send host notifications via email register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL CONTACT, JUST A TEMPLATE! }
Quelques précisions :
- les notification_options prennent les paramètres suivants :
- w: notification sur les états WARNING;
- u: notification sur les états UNKNOWN;
- c: notification sur les états CRITICAL;
- r: notification quand le service repasse à l'état OK (RECOVERY);
- f: notification quand il y a du flapping (quand le service démarre et s'arrête sans cesse);
- s: notification quand la période d'arrêt programmée (SCHEDULED DOWNTIME) est terminée;
- n: pas de notification (NONE).
- les notification_commands sont déclarée dans le fichier /etc/nagios/objects/commands.cfg:
# 'notify-host-by-email' command definition define command{ command_name notify-host-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n \nNotification Type: $NOTIFICATIONTYPE$ \nHost: $HOSTNAME$ \nState: $HOSTSTATE$ \nAddress: $HOSTADDRESS$ \nInfo: $HOSTOUTPUT$ \n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$ } # 'notify-service-by-email' command definition define command{ command_name notify-service-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n \nNotification Type: $NOTIFICATIONTYPE$ \n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$ \nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$ \n\nDate/Time: $LONGDATETIME$ \n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ }
Ces deux commandes envoie un mail (/bin/mail) au contact désigné.
commands.cfg
Vérifications locales
# 'check_local_disk' command definition define command{ command_name check_local_disk command_line $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ }
# 'check_local_load' command definition define command{ command_name check_local_load command_line $USER1$/check_load -w $ARG1$ -c $ARG2$ }
# 'check_local_procs' command definition define command{ command_name check_local_procs command_line $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$ }
# 'check_local_users' command definition define command{ command_name check_local_users command_line $USER1$/check_users -w $ARG1$ -c $ARG2$ }
# 'check_local_swap' command definition define command{ command_name check_local_swap command_line $USER1$/check_swap -w $ARG1$ -c $ARG2$ }
# 'check_local_mrtgtraf' command definition define command{ command_name check_local_mrtgtraf command_line $USER1$/check_mrtgtraf -F $ARG1$ -a $ARG2$ -w $ARG3$ -c $ARG4$ -e $ARG5$ }
=== Vérifications distantes === <pre> # 'check-host-alive' command definition define command{ command_name check-host-alive command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5 }
# 'check_ftp' command definition define command{ command_name check_ftp command_line $USER1$/check_ftp -H $HOSTADDRESS$ $ARG1$ }
# 'check_hpjd' command definition define command{ command_name check_hpjd command_line $USER1$/check_hpjd -H $HOSTADDRESS$ $ARG1$ }
# 'check_snmp' command definition define command{ command_name check_snmp command_line $USER1$/check_snmp -H $HOSTADDRESS$ $ARG1$ }
# 'check_http' command definition define command{ command_name check_http command_line $USER1$/check_http -I $HOSTADDRESS$ $ARG1$ }
# 'check_ssh' command definition define command{ command_name check_ssh command_line $USER1$/check_ssh $ARG1$ $HOSTADDRESS$ }
# 'check_dhcp' command definition define command{ command_name check_dhcp command_line $USER1$/check_dhcp $ARG1$ }
# 'check_ping' command definition define command{ command_name check_ping command_line $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5 }
# 'check_pop' command definition define command{ command_name check_pop command_line $USER1$/check_pop -H $HOSTADDRESS$ $ARG1$ }
# 'check_imap' command definition define command{ command_name check_imap command_line $USER1$/check_imap -H $HOSTADDRESS$ $ARG1$ }
# 'check_smtp' command definition define command{ command_name check_smtp command_line $USER1$/check_smtp -H $HOSTADDRESS$ $ARG1$ }
# 'check_tcp' command definition define command{ command_name check_tcp command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ $ARG2$ }
# 'check_udp' command definition define command{ command_name check_udp command_line $USER1$/check_udp -H $HOSTADDRESS$ -p $ARG1$ $ARG2$ }
# 'check_nt' command definition define command{ command_name check_nt command_line $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -v $ARG1$ $ARG2$ }