======Nagios======
Nagios est un programme de supervision libre composé d'un scheduler (nagios-core), de greffons (nagios-plugins) et d'une interface web de management (inclue dans nagios-core). Il est couramment utilisé pour faire des tests de PING sur des équipements, ou tester le bon fonctionnement de services (HTTP, SMTP).
======Généralités======
Le principe de base est simple : on configure différents plugins pour qu'ils interrogent certains équipements ; et ces plugins sont ordonnancés par le moteur Nagios. Comme tous les processus, les plugins retournent :
* un code d'erreur qui code l'état du check
* une ligne de résultat affichée sur la sortie standard (qu'on appelle données de performance, que l'on peut récupérer pour traitement ; par exemple les RTT des PING pour faire des courbes RRD).
Les codes d'erreurs sont standardisés 0 (OK), 1 ou 2 pour les host ; et 0 (OK), 1 (WARNING), 2 (CRITICAL) ou 3 (UNKNOWN) pour les services. N'importe quel script qui respecte ces retours est compatible avec Nagios ; c'est cette interopérabilité qui a fait son succès.
======Installation======
=====sous Ubuntu (avec apt)=====
Installation classique sous Ubuntu avec résolution automatique des dépendances :
aptitude install nagios3
Puis il faut créer un utilisateur et lui attribuer un mot de passe (si ce n'est pas déjà fait lors de l'installation) pour l'accès à l'interface web :
htpasswd -c /etc/nagios3/htpasswd.users nagiosadmin
New password:
Re-type new password:
Adding password for user nagiosadmin
Tout est automatique c'est bien pour voir ce que ça donne. Mais si on veut :
* maitriser le logiciel
* profiter de la dernière version
* utiliser l'installation de base pour simplifier l'installation de nouveaux plugins ou addons
... alors il faut le compiler à partir des sources.
=====sous Ubuntu 9.10 (OLD)=====
Sous Ubuntu (9.10) il y a(vait) 2 problèmes avec l'installation par défaut :
* problème avec le plugin **check_ssh** : en fait il n'y a pas de serveur SSH installé sous Ubuntu par défaut. Pour l'installer il faut installer le paquet **openssh-server**.
* problème de droit d'accès avec le plugin **check_disk** : ''DISK CRITIQUE - /home//.gvfs is not accessible: Permission non accordée''
Pour ignorer le fichier qui pose ce problème de droit d'accès, il faut éditer la configuration du plugin check_disk et ajouter à la fin de la ligne : '' -A -i .gvfs''
sudo vi /etc/nagios-plugins/config/disk.cfg
# 'check_all_disks' command definition
define command{
command_name check_all_disks
#ancienne ligne
#command_line /usr/lib/nagios/plugins/check_disk -w '$ARG1$' -c '$ARG2$' -e
#nouvelle ligne
command_line /usr/lib/nagios/plugins/check_disk -w '$ARG1$' -c '$ARG2$' -e -A -i .gvfs
}
Puis il faut recharger la conf dans Nagios :
sudo service nagios3 stop
* Stopping nagios3 monitoring daemon nagios3
sudo service nagios3 start [ OK ]
* Starting nagios3 monitoring daemon nagios3
kill: 1: No such process [ OK ]
//source : https://help.ubuntu.com/community/Nagios3#Post%20Install%20Tasks //
=====Installation via les sources=====
//sous Redhat 5.4 EL//
====Prérequis====
* Il faut disposer d'un serveur web (Apache2 par exemple) avec PHP (5 par exemple), la librairie GD et des outils de compilation (gcc & co) :
yum install httpd
yum install gd gd-devel
yum install gcc glibc glibc-common
Vérifier que le serveur web se lance bien au démarrage classique :
chkconfig --list | grep httpd
Si le service n'est pas listé, l'ajouter à la liste :
chkconfig --add httpd
chkconfig --list | grep httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
S'il n'est pas chargé au démarrage, l'y ajouter (runlevels de 2 à 5 par défaut) :
chkconfig httpd on
chkconfig --list | grep httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
* création des utilisateurs et groupes qui seront utilisés par Nagios
groupadd nagios
groupadd nagcmd
useradd -g nagios -G nagcmd -c "Nagios Admin" nagios
====Nagios core====
La dernière version de nagios "gratuit" (renommée [[http://www.nagios.org/download/core/thanks/|nagios core]], en opposition avec [[http://www.nagios.com/products/nagiosxi/try|nagios XI]] qui est la version "pro" et payante) en date à l'heure actuelle (15/04/2010) est la 3.2.1. Pour information, le terme [[http://www.nagios.com/products/nagiososs|Nagios OSS]] désigne les composant libres et gratuits nagios core, nagios-plugins et nagios addons.
* téléchargement + décompression
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.1.tar.gz
tar -zxf nagios-3.2.1.tar.gz
cd nagios-3.2.1
* configurer les options de compilation :
./configure --enable-event-broker --enable-embedded-perl --with-command-group=nagcmd
* L'option ''--enable-event-broker'' n'est pas utile si on utilise juste Nagios et ses plugins de base ; en revanche si on veut utiliser l'addon NDOutils (par exemple) il faut l'activer.
* ''--enable-embedded-perl'' permet de pouvoir utiliser le moteur d'exécution de perl intégré à nagios (je paraphrase ^^). Il permet d'optimiser l'exécution des plugins perl donc il est conseillé.
* ''--with-command-group=nagcmd'' permet de spécifier le groupe de l'utilisateur (par défaut nagios) qui lancera les //command-group//.
* lancer la compilation
make all
* installation : ceci se fait en root
Ceci va copier les fichiers aux bons endroits :
* make install : installe les binaires, CGI et fichiers HTML
* make install-init : installe le script de démarrage dans /etc/rc.d/init.d
* make install-commandmode : configuration du répertoire et du pipe pour les commandes externes (/usr/local/nagios/var/rw/nagios.cmd)
* make install-config : installe les modèles de configuration par défaut dans /usr/local/nagios/etc
* make install-webconf : installation du fichier de configuration d'Apache pour Nagios. Ce dernier sera accessible sur http://127.0.0.1/nagios/
make install
make install-init
make install-commandmode
make install-config
make install-webconf
* limitation de l'accès à Nagios : protection par authentification
On utilise un //htaccess// pour demander un login/mot de passe afin d'obtenir l'accès à l'interface web de Nagios.
Attention, pour l'instant le mot de passe transite en clair (HTTP oblige) entre votre machine et le serveur Nagios. Pour une vraie sécurité, il est conseillé de passer en SSL (HTTPS).
On ajoute l'utilisateur nagiosadmin au fichier htpasswd.users qui contient les couples login/mot de passe hashé. Puis on donne l'accès au fichier à l'utilisateur apache, sur lequel doit tourner le service httpd.
htpasswd /usr/local/nagios/etc/htpasswd.users nagiosadmin
chown nagios:nagcmd /usr/local/nagios/etc/htpasswd.users
usermod -a -G nagios,nagcmd apache
* lancement de Nagios au démarrage du système
Configuration pour que Nagios se lance automatiquement au démarrage du système :
chkconfig --add nagios
chkconfig nagios on
* redémarrage du serveur web pour qu'il prenne en compte sa nouvelle configuration
service httpd restart
Avant d'avoir un Nagios qui fonctionne correctement, il reste 2 étapes :
* installer les plugins "de base" (nagios-plugins)
* lancer le service nagios
====Nagios-plugins====
Ce pack contient tous les plugins de base de Nagios (d'autres pourront être ajoutés plus tard).
Les plugins dont le support n'est pas installé ne seront pas compilés ; par exemple il faut installer net-snmp et net-snmp-utils pour que le plugin check_snmp soit compilé
Pour compilation du module check_snmp :
yum install net-snmp net-snmp-utils
//il me semble que seul ces paquets sont nécessaires ; sinon, installer aussi net-snmp-devel net-snmp-libs net-snmp-perl//
* téléchargement et décompression
wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.14.tar.gz
tar zxf nagios-plugins-1.4.14.tar.gz
cd nagios-plugins-1.4.14
* configuration des options de compilation
./configure --with-command-group=nagcmd --enable-perl-modules
Les options suivent la logique de compilation de Nagios.
* compilation
make
* installation
make install
* vérification de la configuration de Nagios
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
* enfin, on lance Nagios
service nagios start
======Configuration======
Les fichiers principaux se trouvent dans ''/etc/nagios'' (ou ''/etc/nagios3/'' pour les Debian/Ubuntu).
=====Contacts et groupes de contacts=====
On renseigne les personnes de contact (qui seront notifiées lors d'un problème) dans le fichier ''/etc/nagios3/conf.d/contacts_nagios2.cfg''. Exemple de déclaration :
define contact{
contact_name root
alias Root
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-service-by-email
host_notification_commands notify-host-by-email
email root@localhost
}
On voit, dans l'ordre, le nom d'utilisateur, le nom complet, les périodes de notifications pour les "service" et les "host", les options de notification, et les moyens de notification. Chaque valeur est un objet défini dans la configuration de Nagios (on retrouve par exemple les périodes de temps), alors que les options de notifications définissent le degré d'alerte.
Pour les services (service_notification_options) :
* **w (Warning)** : avertissement
* **u (Unknown)** : inconnu
* **c (Critical)** : critique
* **r (Recovery)** : retour à l'état normal (up)
Pour les machines (host_notification_options) :
* **d (Down)** : machine éteinte
* **u (Unreachable)** : machine injoignable
* **r (Recovery)** : retour à l'état normal (up)
On définit dans ce même fichier les groupes de contact :
define contactgroup{
contactgroup_name admins
alias Nagios Administrators
members root
}
=====Droits des contacts=====
Pour attribuer des droits à un utilisateur, il faut éditer le fichier ''/etc/nagios3/cgi.cfg'' et ajouter les noms d'utilisateurs après les directives idoines, séparés par des virgules ; par exemple :
authorized_for_system_information=nagiosadmin,toto
=====Périodes de temps=====
On peut consulter ou définir des périodes de temps dans le fichier ''/etc/nagios3/conf.d/timeperiods_nagios2.cfg''. Voici un exemple de déclaration :
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
}
=====Déclaration d'un host=====
Ça se passe dans le fichier **/etc/nagios3/conf.d/localhost_nagios2.cfg** :
define host{
use generic-host
host_name routeur1
alias Routeur passerelle R1
address 192.168.0.254
check_command check-host-alive
}
Cet host utilise le template generic-host qui définit tous les paramètres nécessaires par défaut. On peut surcharger l'objet càd redéfinir les paramètres du template en modifiant leurs valeurs.
=====Création de hostgroup=====
On doit mettre chaque host dans un hostgroup, défini dans le fichier **/etc/nagios3/conf.d/hostgroups_nagios2.cfg** :
define hostgroup {
hostgroup_name routeurs
alias Debian GNU/Linux Servers
members routeur1
contact_groups admins-routeur
}
=====Création d'un service=====
Ils sont déclarés dans le fichier **/etc/nagios3/conf.d/service_nagios2.cfg**
define service {
hostgroup_name ping-servers
service_description PING
check_command check_ping!100.0,20%!500.0,60%
use generic-service
notification_interval 0 ; set > 0 if you want to be renotified
}
Ce service utilise le greffon **check_ping** ; en fonction du retour de ce dernier, on passe à différents niveau d'alerte :
* un temps de réponse > 100 ms ou 20% de perte et on passe à l'état WARNING
* un temps de réponse > 500 ms ou 60% de perte et on passe à l'état CRITICAL
L'intervalle de notification (**notification_interval**) indique si l'alerte doit être répétée si le problème perdure.
D'autres arguments sont intéressants à utiliser :
* ''normal_check_interval 5'' définit l'intervalle de check du service, en minutes
* ''max_check_attempts 3'' définit le seuil au delà duquel le service passe en **HARD state**
* ''retry_check_interval 1'' si le statut du service est nOK, on passe en **SOFT state** et on reteste le service toutes les X minutes
=====Vérifications=====
Pour vérifier la validité de la configuration de Nagios sans relancer le démon :
nagios3 -v /etc/nagios3/nagios.cfg
//(très utile quand on travaille sur de la prod !)//
======Installation de Nagvis======
Nagvis est un addon pour Nagios qui permet d'afficher ses état sur un carte interactive.
Il nécessite [[http://docs.nagvis.org/1.4/en_US/system_requirements.html|beaucoup de prérequis]], qui ont eux-même des prérequis. Cette partie traite de l'installation à partir des sources de Nagvis, NDOutils et Graphviz.
=====MySQL=====
MySQL est un prérequis de notre installation de NDOUtils.
# Installation du serveur, du client des librairies de développement.
yum install mysql-server mysql-devel
# Lancement du service
service mysqld start
# Assistant de configuration (mot de passe root, etc)
/usr/bin/mysql_secure_installation
# Lancement automatique du serveur MySQL au démarrage
chkconfig mysqld on
chkconfig --list | grep sql
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
=====NDOUtils=====
//installation depuis les sources : [[http://www.nagios.org/download/addons/|ndoutils-1.4b9.tar.gz]]//
NDOUtils est un addon qui récupère les états, la configuration, etc... de Nagios pour les enregistrer dans une base (MySQL dans notre cas).
wget http://prdownloads.sourceforge.net/sourceforge/nagios/ndoutils-1.4b9.tar.gz
tar zxf ndoutils-1.4b9.tar.gz
cd ndoutils-1.4b9
./configure --disable-pgsql
make
Configuration de la base de donnée :
Se connecter avec
mysql -u root -p
# créer l'utilisateur MySQL "ndouser" et la base "ndoutils"
mysqladmin -u root -p create ndoutils
mysql -u root -p mysql
mysql> GRANT ALL ON ndoutils.* TO ndouser@localhost IDENTIFIED BY 'ndopassword';
mysql> FLUSH PRIVILEGES;
Création de la structure de la base avec le script fourni :
cd db/
./installdb -u ndouser -p ndopassword -h localhost -d ndoutils
DBD::mysql::db do failed: Table 'ndoutils.nagios_dbversion' doesn't exist at ./installdb line 51.
** Creating tables for version 1.4b9
Using mysql.sql for installation...
** Updating table nagios_dbversion
Done!
J'obtiens un message d'erreur qui n'empêche pas la terre de tourner...
Installation du module :
# binaires
cp src/ndomod-3x.o /usr/local/nagios/bin/ndomod.o
cp src/ndo2db-3x /usr/local/nagios/bin/ndo2db
chown nagios:nagios /usr/local/nagios/bin/ndo*
chmod 774 /usr/local/nagios/bin/ndo*
# fichiers de config
cp config/ndomod.cfg-sample /usr/local/nagios/etc/ndomod.cfg
cp config/ndo2db.cfg-sample /usr/local/nagios/etc/ndo2db.cfg
chown nagios:nagios /usr/local/nagios/etc/ndo*
chmod 660 /usr/local/nagios/etc/ndo*
# paramétrage du fichier de config
vi /usr/local/nagios/etc/ndo2db.cfg
db_name=ndoutils
db_prefix=nagios_
db_user=ndouser
db_pass=ndopassword
# ajout du broker dans le fichier de conf de nagios :
vi /usr/local/nagios/etc/nagios.cfg
event_broker_options=-1
broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg
# création du script de démarrage
cp vi /etc/rc.d/init.d/ndoutils
cp daemon-init /etc/init.d/ndo2db
chmod 755 /etc/init.d/ndo2db
chkconfig --add ndo2db
# attention le démon ndo2db doit être démarré avant nagios (modifier sa priorité le cas échéant)
# exemple pour le runlevel 3 : j'ai du passer la priorité de ndo2db à 98
/etc/rc3.d/S98ndo2db -> ../init.d/ndo2db
/etc/rc3.d/S99nagios -> ../init.d/nagios
# lancer le service NDOUtils et redémarrer nagios
service ndo2db start
service nagios restart
# vérification de bon fonctionnement : les logs de Nagios
tail -f /usr/local/nagios/var/nagios.log
=====Graphviz=====
[[http://www.graphviz.org|Graphviz]] est un outil de génération de graphiques. Il existe un paquet pour Redhat dont l'installation est décrite ici : http://www.graphviz.org/Download_linux_rhel.php
# ajout du repository yum
wget http://www.graphviz.org/graphviz-rhel.repo
mv graphviz-rhel.repo /etc/yum.repos.d/
# vérification de bonne pirse en compte par yum
yum list available 'graphviz*'
Loaded plugins: rhnplugin
Available Packages
graphviz.i386 2.26.3-1.el5 graphviz-stable
graphviz-devel.i386 2.26.3-1.el5 graphviz-stable
graphviz-doc.i386 2.26.3-1.el5 graphviz-stable
graphviz-gd.i386 2.26.3-1.el5 graphviz-stable
graphviz-graphs.i386 2.26.3-1.el5 graphviz-stable
graphviz-guile.i386 2.26.3-1.el5 graphviz-stable
graphviz-java.i386 2.26.3-1.el5 graphviz-stable
graphviz-perl.i386 2.26.3-1.el5 graphviz-stable
graphviz-php.i386 2.16-1.el5 graphviz-stable
graphviz-python.i386 2.26.3-1.el5 graphviz-stable
graphviz-ruby.i386 2.26.3-1.el5 graphviz-stable
graphviz-tcl.i386 2.26.3-1.el5 graphviz-stable
# Installation des paquets idoines
yum install graphviz.i386 graphviz-gd.i386 graphviz-perl.i386 graphviz-doc.i386 graphviz-graphs.i386
# oui, il y a pas mal de dépendances :
====================================================================================================
Package Arch Version Repository Size
====================================================================================================
Installing:
graphviz i386 2.26.3-1.el5 graphviz-stable 1.5 M
graphviz-doc i386 2.26.3-1.el5 graphviz-stable 2.4 M
graphviz-gd i386 2.26.3-1.el5 graphviz-stable 117 k
graphviz-graphs i386 2.26.3-1.el5 graphviz-stable 4.3 M
graphviz-perl i386 2.26.3-1.el5 graphviz-stable 54 k
Installing for dependencies:
alsa-lib i386 1.0.17-1.el5 bt-rhel-i386-server-5 411 k
audiofile i386 1:0.2.6-5 bt-rhel-i386-server-5 107 k
avahi-glib i386 0.6.16-7.el5 bt-rhel-i386-server-5 15 k
chkfontpath i386 1.10.1-1.1 bt-rhel-i386-server-5 15 k
esound i386 1:0.2.36-3 bt-rhel-i386-server-5 130 k
freeglut i386 2.4.0-7.1.el5 bt-rhel-i386-server-5 142 k
gnome-keyring i386 0.6.0-1.fc6 bt-rhel-i386-server-5 170 k
gnome-mime-data i386 2.4.2-3.1 bt-rhel-i386-server-5 691 k
gnome-mount i386 0.5-3.el5 bt-rhel-i386-server-5 70 k
gnome-vfs2 i386 2.16.2-6.el5 bt-rhel-i386-server-5 1.2 M
gtkglext-libs i386 1.2.0-6.el5 graphviz-stable 149 k
gts i386 0.7.6-11.el5 graphviz-stable 202 k
libFS i386 1.0.0-3.1 bt-rhel-i386-server-5 30 k
libXaw i386 1.0.2-8.1 bt-rhel-i386-server-5 325 k
libXfont i386 1.2.2-1.0.3.el5_1 bt-rhel-i386-server-5 241 k
libXmu i386 1.0.2-5 bt-rhel-i386-server-5 63 k
libart_lgpl i386 2.3.17-4 bt-rhel-i386-server-5 76 k
libbonobo i386 2.16.0-1.fc6 bt-rhel-i386-server-5 501 k
libbonoboui i386 2.16.0-1.fc6 bt-rhel-i386-server-5 390 k
libcroco i386 0.6.1-2.1 bt-rhel-i386-server-5 127 k
libfontenc i386 1.0.2-2.2.el5 bt-rhel-i386-server-5 19 k
libglade2 i386 2.6.0-2 bt-rhel-i386-server-5 96 k
libgnome i386 2.16.0-6.el5 bt-rhel-i386-server-5 859 k
libgnomecanvas i386 2.14.0-4.1 bt-rhel-i386-server-5 222 k
libgnomeui i386 2.16.0-5.el5 bt-rhel-i386-server-5 977 k
libgsf i386 1.14.1-6.1 bt-rhel-i386-server-5 116 k
librsvg2 i386 2.16.1-1.el5 bt-rhel-i386-server-5 179 k
libxslt i386 1.1.17-2.el5_2.2 bt-rhel-i386-server-5 485 k
mesa-libGLU i386 6.5.1-7.8.el5 bt-rhel-i386-server-5 225 k
netpbm i386 10.35.58-8.el5 bt-rhel-i386-server-5 834 k
shared-mime-info i386 0.19-5.el5 bt-rhel-i386-server-5 148 k
ttmkfdir i386 3.0.9-23.el5 bt-rhel-i386-server-5 46 k
urw-fonts noarch 2.3-6.1.1 bt-rhel-i386-server-5 4.5 M
xorg-x11-font-utils i386 1:7.1-2 bt-rhel-i386-server-5 75 k
xorg-x11-xfs i386 1:1.0.2-4 bt-rhel-i386-server-5 68 k
Transaction Summary
====================================================================================================
=====Nagvis=====
Nagvis est un scripts PHP qui récupère les états Nagios pour générer une carte interactive.
Paquets à installer :
yum install php-gd php-mbstring php-xml php-mysql
Redémarrage du serveur HTTP pour prise en compte des paquets PHP
service httpd restart
wget http://downloads.sourceforge.net/project/nagvis/NagVis%201.4%20%28stable%29/nagvis-1.4.7.tar.gz
tar zxf nagvis-1.4.7.tar.gz
cd nagvis-1.4.7
# lancer l'assistant installeur
./install.sh
[..]
+------------------------------------------------------------------------------+
| Summary |
+------------------------------------------------------------------------------+
| NagVis home will be: /usr/local/nagios/share/nagvis |
| Owner of NagVis files will be: apache |
| Group of NagVis files will be: apache |
| Path to Apache config dir is: /etc/httpd/conf.d |
| |
| Installation mode: install |
| |
| Do you really want to continue? [y]:
+------------------------------------------------------------------------------+
| Starting installation |
+------------------------------------------------------------------------------+
| Creating directory /usr/local/nagios/share/nagvis... done |
| Copying files to /usr/local/nagios/share/nagvis... done |
| Creating main configuration file... done |
| |
| |
| |
+--- Setting permissions... ---------------------------------------------------+
| /usr/local/nagios/share/nagvis/etc/nagvis.ini.php-sample done |
| /usr/local/nagios/share/nagvis/etc/maps done |
| /usr/local/nagios/share/nagvis/nagvis/images/maps done |
| |
+------------------------------------------------------------------------------+
| Installation complete |
| |
| You can safely remove this source directory. |
| |
| What to do next? |
| - Read the documentation |
| - Maybe you want to edit the main configuration file? |
| Its location is: /usr/local/nagios/share/nagvis/etc/nagvis.ini.php |
| - Configure NagVis via browser |
| |
+------------------------------------------------------------------------------+
# Prise en compte de la base SQL
vi /usr/local/nagios/share/nagvis/etc/nagvis.ini.php
dbname="ndoutils"
dbuser="ndouser"
dbpass="ndopassword"
Les images dans ''/usr/local/nagios/share/nagvis/nagvis/images/maps/''
====Exemple de configuration====
===Map===
FIXME : template, service, line, etc...
Prendre garde de bien laisser un espace entre le ''define service|host'' et le "{"
Pour désactiver l'authentification d'Apache et donner un accès "guest" à une carte nagvis, modifier le fichier ''/etc/httpd/conf.d/nagios.conf'' :
# desactiver l'authentification
Satisfy Any
Allow from all
# forcer un nom d'utilisateur pour leurrer nagvis
SetEnv REMOTE_USER guest
Pour simplifier l'URL l'accès à la map (http://serveur/carte_pb), on utilise le **mod_rewrite** d'Apache (toujours dans nagios.conf):
RewriteEngine On
RewriteBase /carte_pb
RewriteRule .* /nagios/nagvis/nagvis/index.php?map=carte_pb
======Installation de l'add-on NRPE======
[[http://fr.wikipedia.org/wiki/NRPE|NRPE]] (Nagios Remote Plugin Executor) est un add-on permettant de lancer des plugins à distance sur une autre machine. C'est aussi le nom du protocole applicatif utilisé pour dialoguer entre le serveur Nagios et la machine distante qui exécute le plugin. Il faut donc installer NRPE sur le serveur Nagios mais aussi sur chaque machine distante. [[http://www.nagios.org/download/addons|NRPE est téléchargeable sur le site de Nagios]] car il fait partie intégrante du projet.
Son fonctionnement est simple : le serveur distant fait tourner le démon NRPE qui écoute sur le port tcp/5666 (par défaut). Le serveur nagios émet une requête vers ce serveur distant grâce au plugin **check_nrpe** ; il lui demande d'exécuter un plugin (que le serveur distant a d'installer en local, d'où la nécessité d'installer nagios-plugins sur le serveur distant). Le résultat de l'exécution du plugin sur le serveur distant est renvoyé au serveur nagios pour traitement.
=====Sur le serveur Nagios=====
====Prérequis====
NRPE utilise par défaut SSL pour échanger les données ; pour le compiler on doit installer le support SSL :
yum install openssl openssl-devel
====Compilation et installation====
L'installation est classique : téléchargement des sources, décompression, configuration du make, compilation, installation :
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.12.tar.gz
tar zxf nrpe-2.12.tar.gz
cd nrpe-2.12
./configure
make all
make install
Normalement on obtient le nouveau plugin : **check_nrpe**
ll /usr/local/nagios/libexec | grep nrpe
-rwxrwxr-x 1 nagios nagios 58237 May 18 10:45 check_nrpe
====Vérification====
Le protocole NRPE utilise par défaut le port tcp/5666 qu'il faudra donc ouvrir sur les serveurs et les éventuels pare-feux intermédiaires.
serveur nagios, port tcp>1023 -----> serveur distant, port tcp/5666
=====Sur le serveur distant=====
(Pour les prérequis, voir partie précédente : //sur le serveur nagios//)
Si l'utilisateur et le groupe "nagios" n'existent pas déjà, il faut les créer :
groupadd nagios
useradd -g nagios nagios
====Installation des nagios-plugins====
Installer les nagios-plugins qui seront lancés sur le serveur distant (cf partie plus haut).
====Compilation et installation====
Même chose que sur le serveur nagios :
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.12.tar.gz
tar zxf nrpe-2.12.tar.gz
cd nrpe-2.12
./configure
make all
make install
====Configuration====
Comme pour le serveur nagios, on s'inspire du fichier d'exemple (mais ici on créer le répertoire "etc" car il n'existe pas encore normalement) :
mkdir /usr/local/nagios/etc
cp sample-config/nrpe.cfg /usr/local/nagios/etc/
Configuration du contrôle d'accès : ajouter l'adresse IP du serveur nagios (192.168.90.110)
vi nrpe.cfg
allowed_hosts=127.0.0.1,192.168.90.110
On remarque au passage que le fichier contient certains services pré-configurés :
# The following examples use hardcoded command arguments...
command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
command[check_hda1]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda1
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200
Ajout au démarrage de la machine :
cp init-script /etc/init.d/nrpe
chmod 755 /etc/init.d/nrpe
chkconfig --add nrpe
Pour désactiver le SSL, modifier la ligne suivante en rajoutant l'option ''-n'' :
echo -n "Starting nrpe: "
daemon $NrpeBin -c $NrpeCfg -d -n
Lancement du démon :
/etc/init.d/nrpe start
Pour information, le démon se lance ainsi : ''/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d -n''
Explication des paramètres :
* -c
* -d : lancer en temps que démon autonome (n'utilise pas inetd)
* -n : ne pas utiliser la couche SSL
=====Configuration=====
Pour vérifier la connectivité NRPE entre les 2 serveurs, lancer sur le serveur nagios :
/usr/local/nagios/libexec/check_nrpe -n -H
NRPE v2.12
La syntaxe pour appeler un plugin est la même, en ajoutant **-c **.
Bien ; maintenant il faut créer le service associé ! Je vous laisse placer les lignes suivantes dans les fichiers de conf correspondants à votre installation (command.cfg, services.cfg et hosts.cfg par exemple)
# -n = pas de SSL (le demon doit etre lance avec la meme option
# -H = adresse IP du serveur distant
# -c = nom du plugin distant a appeler ; il est passe en argument par l'objet service
define command{
command_name check_nrpe_no_ssl
command_line $USER1$/check_nrpe -n -H $HOSTADDRESS$ -c $ARG1$
}
# check_users sera passe en argument a l'objet "command"
# (check_nrpe_no_ssl declare ci-dessus), en tant que $ARG1$
define service{
use generic-service
service_description ping_google
host_name serveur_distant
check_command check_nrpe_no_ssl!check_users
}
# on declare ce service sur l'objet serveur distant
# son adresse sera envoyee automatiquement via la variable $HOSTADDRESS$
define host{
use linux-server
host_name serveur_distant
alias serveur_distant
address 192.168.90.111
}
======Ajout de plugins======
Les plugins sont des programmes/scripts qui étendent les fonctionnalités de Nagios.
=====Check_multi=====
[[http://my-plugin.de/wiki/projects/check_multi/start|Check_multi]] est un plugin Nagios qui permet de créer des services dont l’état dépend de plusieurs paramètres. Il utilise pour cela une syntaxe particulière et des expressions logiques.
Par exemple, si on veut tester l'accessibilité d'un site web redondé sur 2 machines, Nagios ne permet que de tester l'accès de l'un puis de l'autre. Mais pas du service réparti sur les 2 machines. check_multi permet de combler ce manque et de créer un service dont l'état dépendra de 2 autres services : l'état HTTP des 2 serveurs.
====Compilation====
Il est conseillé (par la doc officielle) de changer les buffers MAX_PLUGIN_OUTPUT_LENGTH et MAX_INPUT_BUFFER ; ceci dit je n'en ai pas vu l'utilité __pour l'instant__
Dans le modop suivant j'utilise la version 0.20, mais je vous recommande de récupérer la dernière en date (en ce moment : la 0.23).
wget http://my-plugin.de/check_multi/check_multi-0.20.current.tgz
tar zxf check_multi-0.20.current.tgz
cd check_multi-0.20
./configure
-------------------------------------------------------------------
--- check_multi configure summary (SVN : 272 $)
-------------------------------------------------------------------
Release date : 2009-10-15 08:22:59 +0200 (Thu, 15 Oct 2009) $
Author : flackem $
Configure args : 'help' 'build_alias=help' 'host_alias=help' 'target_alias=help'
--- Directories
-------------------------------------------------------------------
Install ${prefix} /usr/local/nagios
Exec ${exec_prefix} ${prefix}
Libexec directory ${exec_prefix}/libexec
CGI directory (sbin) ${exec_prefix}/sbin
HTML directory (dataroot) ${prefix}/share
Contrib directory
Temporary directory /tmp/check_multi
Temp dir permissions 01777
--- System options
-------------------------------------------------------------------
Parent timeout (BIG T) 60
Child timeout (small t) 10
Nagios user/group nagios,nagios
Nagios name nagios
RC if no checks defined 3
default file extension cmd
ignore missing cmd file? 0
Client perl path /usr/bin/perl
--- Output options
-------------------------------------------------------------------
Name / Label ''
Report option default 13
HTML target frame _self
Child checks indented? 1
Ascii indentation char ' '
Collapse tree? 1
Collapse plus style style='color:#4444FF;line-height:0.1em;font-size:1.5em;cursor:crosshair'
Extinfo in status.cgi? 0
Verbosity level default 0
PNP chart with mouseover 0
--- Links
-------------------------------------------------------------------
action URL ''
notes URL ''
documentation URL ''
--- Advanced Options
-------------------------------------------------------------------
cmdfile update interval 86400
illegal chars in cmdfile \r
check_multi persistent? 0
*** Next step: type 'make all'. ***
make all
make test
[..]
not ok 2 - output correct
# Failed test 'output correct'
# in check_multi.t at line 44.
# 'OK - 1 plugins checked, 1 ok [please don't run plugins as root!]
# [ 1] procs PROCS OK: 107 processes|check_multi::check_multi::plugins=1 time=0.070733 '
# doesn't match '/^OK - 1 plugins checked, 1 ok\n\[ 1\] procs PROCS OK: \d+ processes|check_multi::check_multi::plugins=1 time=\d+$/'
[..]
# Looks like you failed 11 tests of 22.
make[1]: *** [test] Error 11
make[1]: Leaving directory `/produits/sources/check_multi-0.20/plugins/t'
make: *** [test] Error 2
Le ''make test'' produit des erreurs que je n'ai pas encore résolues. Mais j'ai la moyenne ;)
Comme j'utilise Nagios, il faut aussi passer la commande suivante :
make test-statusdat
cd ./plugins/t && make -e test-statusdat
/usr/bin/perl check_multi_statusdat.t
1..6
ok 1 - check_multi skips unknown service in status.dat - RC3 - passed
ok 2 - output correct - passed
ok 3 - check_multi finds numerous services in status.dat - RC3 - passed
ok 4 - services output correct - passed
ok 5 - check_multi finds numerous hosts in status.dat - RC1 - passed
ok 6 - hosts output correct - passed
Le plugin fonctionne tout de même, alors on poursuit.
====Installation====
make install
make install-config
Le plugin s'installe dans le répertoire ''/usr/local/nagios/check_multi''.
====Configuration====
Le concept est le suivant : on créer un fichier **.cmd** correspondant, suivant la syntaxe particulière de check_multi, qui va décrire :
* les état nagios à récupérer (directive **statusdat**) ou les commandes à lancer (directive **command**)
* l'état de la sortie qui découle de ces checks (directive **state**)
Ce fichier sera appelé par un service déclaré dans Nagios, sous la forme : ''check_multi -f /usr/local/nagios/etc/check_multi/test.cmd''.
===Création de http.cmd===
Les états de Nagios sont récupérés via le fichier ''/var/status.dat'' ; donc et doivent exister dans Nagios.
Pour coder le tableau de décision de l'exemple :
* tant qu'un des 2 serveurs est OK, le service est OK
* si les 2 serveurs sont CRITICAL le service est CRITICAL
* si les 2 serveurs sont WARNING ou pire (un WARNING et un CRITICAL) le service est WARNING
| | ^ serveur 1 ^^^
| | ^ OK ^ warning ^ critical |
^ serveur 2 ^ OK | OK | OK | OK |
^ ::: ^ warning | OK | warning | warning |
^ ::: ^ critical | OK | warning | critical |
Les états peuvent être écris en toute lettre ou avec leur code retour Nagios (OK=0 ; WARNING=1 ; CRITICAL=2 ; UNKNOWN=3 et plus).
# format : statusdat [ ] = :
# ou est un identifiant local
# : déterminent l'objet service et l'objet host a evaluer
statusdat [ serveur1 ] = www-princi:check-http
statusdat [ serveur2 ] = www-secour:check-http
# format : state [ ] =
# 2 possibilités pour coder le retour en fonction de ces états :
# - en testant chaque retour de statusdat/command independamment
# - en utilisant la directive COUNT pour compter le nombre d'états
state [ OK ] = ( serveur1_www-princi_check-http == OK || serveur2_www-secour_check-http == OK )
state [ WARNING ] = ( COUNT(WARNING) == 2 || ( COUNT(CRITICAL) == 1 && COUNT(WARNING) == 1 ) )
state [ CRITICAL ] = COUNT(CRITICAL) == 2
On peut utiliser des commandes : par exemple on peut re-checker l'état HTTP des serveurs plutôt que d'utiliser les résultats de Nagios (pas vraiment d'intérêt dans notre cas) ; dans ce cas on récupère le résultat de la commande ainsi : ''$$''
# format : command [ ] =
command [ serveur1 ] = check_http -H www-princi
command [ serveur2 ] = check_http -H www-secour
# on récupère l'etat des commandes avec $$
state [ OK ] = ( $serveur1$ == OK || $serveur2$ == OK )
state [ WARNING ] = ( COUNT(WARNING) == 2 || ( COUNT(CRITICAL) == 1 && COUNT(WARNING) == 1 ) )
state [ CRITICAL ] = COUNT(CRITICAL) == 2
* Une commande n'est pas nécessairement un plugin Nagios ; on peut utiliser n'importe quelle expression perl, des commande externes, etc.
* on peut utiliser les macros Nagios avec les commandes ($HOSTNAME$, $HOSTADDRESS$, etc)
===Création du service Nagios===
Dans la conf de Nagios :
define command{
command_name cm_http
command_line $USER1$/check_multi -f /usr/local/nagios/etc/check_multi/http.cmd
}
define service{
use generic-service
host_name localhost
service_description Site web alive
check_command cm_http
}
Il faut ensuite re démarrer Nagios pour prendre en compte ces 2 nouveau objets.
Pour aller plus loin je vous recommande fortement le wiki officiel : http://my-plugin.de/wiki/projects/check_multi/configuration/file
====Passage de paramètres====
* on ne peut passer de paramètres qu'avec les commandes
Exemple : déclaration dans nagios
define command{
command_name cm_http
command_line $USER1$/check_multi -f /usr/local/nagios/etc/check_multi/http.cmd -c $ARG1
}
define service{
use generic-service
host_name localhost
service_description Site web alive
check_command cm_http!www
}
http.cmd
# $ARG1$ = www
command [ serveur1 ] = check_http -H $ARG1$-princi
command [ serveur2 ] = check_http -H $ARG1$-secour
# on récupère l'etat des commandes avec $$
state [ OK ] = ( $serveur1$ == OK || $serveur2$ == OK )
state [ WARNING ] = ( COUNT(WARNING) == 2 || ( COUNT(CRITICAL) == 1 && COUNT(WARNING) == 1 ) )
state [ CRITICAL ] = COUNT(CRITICAL) == 2
======Installation de PNP4Nagios======
[[http://docs.pnp4nagios.org/fr/pnp-0.6/start|PNP4Nagios]] est une extension permettant de récupérer les perfdata (données de performance) pour en faire des graphes RRD.
Les perfdata sont les données qui suivent le retour d'une commande de check ; par exemple un check_host_alive retourne :
PING OK - Paquets perdus = 0%, RTA = 22.87 ms
rta=22.872999ms;5000.000000;5000.000000;0.000000 pl=0%;100;100;0
Je vais décrire ici l'installation sous Debian 7 (Nagios 3.4.1).
* Installation du paquet
aptitude install pnp4nagios
# avec, au passage :
0 paquets mis à jour, 100 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 32,2 Mo d'archives. Après dépaquetage, 89,8 Mo seront utilisés.
Les paquets suivants ont des dépendances non satisfaites :
libgd2-xpm : Est en conflit avec: libgd2 qui est un paquet virtuel
Est en conflit avec: libgd2-noxpm mais 2.0.36~rc1~dfsg-6.1 est installé.
libgd2-noxpm : Est en conflit avec: libgd2 qui est un paquet virtuel
Est en conflit avec: libgd2-xpm mais 2.0.36~rc1~dfsg-6.1 doit être installé.
Les actions suivantes permettront de résoudre ces dépendances :
Supprimer les paquets suivants :
1) libgd2-noxpm
Accepter cette solution ? [Y/n/q/?] y
* Choisir le mode de fonctionnement de pnp4nagios (cf http://docs.pnp4nagios.org/fr/pnp-0.6/modes). Dans mon cas ça sera le **mode synchronisé** car c'est ce qui est conseillé pour les petites installations (< 1000 services).
Note : ce mode semble buggué sur Debian 9 / Nagios 4.3.4 / PNP 0.6.26, utiliser plutôt d'autres modes (bulk par exemple)
* Configurer Nagios pour qu'il fasse appel à PNP4Nagios :
vi /etc/nagios3/nagios.cfg
# activer le traitement des perfdata
process_performance_data=1
# décommenter les lignes suivantes
host_perfdata_command=process-host-perfdata
service_perfdata_command=process-service-perfdata
Préciser les commandes de perfdata (adaptez les chemins à vos environnements !) : pour notre installation il faut remplacer les ''command_line'' générée par défaut par le paquet Debian :
vi /etc/nagios3/commands.cfg
define command {
command_name process-service-perfdata
command_line /usr/bin/perl /usr/lib/pnp4nagios/libexec/process_perfdata.pl
}
define command {
command_name process-host-perfdata
command_line /usr/bin/perl /usr/lib/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}
* Relancer Nagios, patienter 5 min, et jeter un œil ici : http://localhost/pnp4nagios
* Pour avoir des liens cliquables directement dans l'interface de Nagios, avec un aperçu au passage de la souris :
* Donner accès à Nagios au fichier .ssi en créant un lien symbolique :
ln -s /usr/share/doc/pnp4nagios/examples/ssi/status-header.ssi /usr/share/nagios3/htdocs/ssi/
# ou, avec un Nagios/PNP récemment compilée :
cp /home/dude/src/pnp4nagios-0.6.26/contrib/ssi/status-header.ssi /usr/local/pnp4nagios/share/
ln -s /usr/local/pnp4nagios/share/status-header.ssi /usr/local/nagios/share/ssi/
* Créer les templates suivants (dans, par exemple, /etc/nagios3/conf.d/templates.cfg) :
define host {
name host-pnp
action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
register 0
}
define service {
name srv-pnp
action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
register 0
}
Si comme moi vous le voulez pour tous (hosts et services), vous pouvez surcharger directement les templates //generic// de vos hosts / services en ajoutant :
vi conf.d/generic-host_nagios2.cfg
use host-pnp
vi conf.d/generic-service_nagios2.cfg
use srv-pnp
* Pour que les graphes s'affichent dans la page courante plutôt que dans une nouvelle page :
vi cgi.cfg
action_url_target=_self
Enfin, relancer nagios :
service nagios3 restart
# OU
systemctl restart nagios
* Si on obtient des erreurs de fonctionnement ou si les graphiques ne sont pas générés, il existe un script de diagnostique qu'on peut télécharger et lancer (en root et avec les bons chemins d'installation en paramètre) :
wget http://verify.pnp4nagios.org/verify_pnp_config
perl verify_pnp_config --mode=sync --config=/etc/nagios3/nagios.cfg --pnpcfg=/etc/pnp4nagios/
=====Certains plugins ne marchent pas !=====
Effectivement certains plugins ne fonctionnent pas avec PNP4Nagios car ils ne génèrent pas de perfdata. Pour rappel, les perfdatas sont affichés par le plugin juste après le status, séparé par un ''|'' ; par exemple avec un ''check_ping'' :
check_ping -H 127.0.0.1 -w30,50% -c 50,60%
PING OK - Paquets perdus = 0%, RTA = 0.07 ms|rta=0.074000ms;30.000000;50.000000;0.000000 pl=0%;50;60;0
* Status = ''PING OK - Paquets perdus = 0%, RTA = 0.07 ms''
* Perfdata = ''rta=0.074000ms;30.000000;50.000000;0.000000 pl=0%;50;60;0''
C'est notamment le cas du service "Total processes", qui utilise le plugin ''check_procs'' :
/usr/lib/nagios/plugins/check_procs-pnp.sh -a ssh
PROCS OK: 3 processus avec args 'ssh'
C'est dommage parce qu'il fait le taff mais sa sortie est juste mal formattée, il ne lui manque que : ''| procs=3'' !
Pour corriger cela, on va utiliser le [[http://docs.pnp4nagios.org/pnp-0.6/wrapper|wrapper du site de pnp4nagios]] (c'est un script qui reformate la sortie de check_procs) :
#!/bin/bash
# ersatz de cmde pour checker le nb de processes et afficher les perfdata
LINE=`/usr/lib/nagios/plugins/check_procs $*`
RC=$?
COUNT=`echo $LINE | awk '{print $3}'`
PROCS=`expr $COUNT - 1`
LINE=`echo $LINE | sed "s/: $COUNT /: $PROCS /"`
echo $LINE \| procs=$PROCS
exit $RC
on notera que j'ai adapté le chemin du script check_procs puisque sous Debian ils sont dans ''/usr/lib/nagios/plugins/''
On dépose donc ces lignes dans un nouveau fichier, par exemple ''/usr/lib/nagios/plugins/check_procs-pnp.sh'', puis on le rend exécutable :
chmod 755 /usr/lib/nagios/plugins/check_procs-pnp.sh
Puis, on définit une nouvelle commande dans ''command.cfg'' :
# contournement de check_procs pour avoir des perfdatas
# cf http://docs.pnp4nagios.org/pnp-0.6/wrapper
define command{
command_name check_procs-pnp
command_line /usr/lib/nagios/plugins/check_procs-pnp.sh -w '$ARG1$' -c '$ARG2$'
}
Enfin, on remplace le service dans ''services.cfg'' :
define service{
use srv-pnp
host_name localhost
service_description Total Processes
#check_command check_procs!250!400
check_command check_procs-pnp!250!400
(Et on relance Nagios après avoir vérifier les éventuelles erreurs avec ''nagios3 -v nagios.cfg'' !)
=====Créer ses templates PNP=====
Un template (au sens PNP4nagios du terme) est un modèle de graphique adapté aux valeurs des données de performance. Il est intéressant d'adapter le type de graphique en fonction des données monitorées ; par exemple, pour le débit in/out d'une interface réseau, on préfèrera afficher les 2 valeurs sur le même graphique avec la courbe "in" vers le bas et la courbe "out" vers le haut, alors qu'avec le "load" on voudra superposer les 3 données correspondant à la charge 15min, 5min et 1min.
On peut choisir les couleurs, le type de graphique (courbe, aire, ligne), sa hauteur, la plage de données utilisée (1h, 12h, 1 semaine), etc... ça peut devenir des trucs très sympa :
{{ :informatique:logiciels:template_pnp4nagios.png?direct |}}
Pour chaque service disposant de perfdata et sur lequel PNP4nagios est activé, le plugin va rechercher un template éponyme du nom de sa commande (''command_name'' dans la définition de la commande), avec l'extension ".php", dans les répertoires suivants (et dans cet ordre) :
# avec le paquet pnp4nagios sous debian 7 :
/usr/share/pnp4nagios/html/templates.dist/
/etc/pnp4nagios/templates/
/etc/pnp4nagios/templates.d/
# avec une installation à partir des sources, ils seront plutôt ici :
/usr/local/pnp4nagios/share/templates/
Par exemple pour un service "check-syno-4disks-temp" appelant la commande la commande "check_syno_4disks_temp" (''check_command check_syno_4disks_temp!public''), il recherchera le template **check_syno_4disks_temp.php**. S'il ne le trouve pas il appliquera le template ''default.php'' qui trace une courbe par valeur. Il va ensuite créer un fichier XML qui contiendra les perfdata, dans le même répertoire que la base RRD : ''/var/lib/pnp4nagios/perfdata/'' (ou ''/usr/local/pnp4nagios/var/perfdata/'' si pnp4nagios a été installé à partir les sources).
====Exemple 1 : trafic in/out====
Voici un exemple de "chaîne" host - service - template PNP pour superviser et grapher le traffic d'une interface réseau sur un NAS synology :
* création des objets dans Nagios :
vi /etc/nagios3/conf.d/syno.cfg
# déclaration du NAS, on utilise bien le template nagios "host-pnp" pour récupérer les perfdata
define host{
use host-pnp
host_name ds415
address 192.168.1.1
hostgroups nas_syno
}
# dans le service on ne précise que le nom de communauté, le reste est donc en dur dans la déclaration de la commande
# le service est appliqué au host grâce au groupe "nas_syno"
define service{
use srv-pnp
hostgroup_name nas_syno
service_description traffic eth0
check_command check_syno_traf-eth0!public
}
# trafic reseau
# -o est suivi par les 2 OIDs correspondant au trafic in et out de l'interface que l'on veut superviser
# -l permet d'afficher une légende
# -u permet de préciser l'unité
# -P précise la version de SNMP
# -C spécifie la communauté SNMP
# --rate induqe qu'il s'agit d'un compteur qui nécessite donc un calcul \
# par rapport à la précédente valeur (voir plus bas pour l'explication)
define command{
command_name check_syno_traf-eth0
command_line $USER1$/check_snmp -H '$HOSTADDRESS$' -P 2c -C '$ARG1$' -l eth0_in,eth0_out \
-u bytes,bytes --rate -o .1.3.6.1.2.1.31.1.1.1.6.3,.1.3.6.1.2.1.31.1.1.1.10.3
}
NB : le plugin **check_snmp** avec l'option ''--rate'' a besoin d'accéder a un répertoire dans lequel il enregistre les compteurs n-1 pour calculer le débit réseau : ce répertoir varie selon le mode d'installation et les distributions :
* sous Debian j'ai eu ''/usr/var/105/check_snmp'' (il faut le trouver !) ;
* sous centOS c'est ''/var/check_snmp'' ;
* ça peut aussi être ''/usr/local/nagios/var/check_snmp''
Pour ne pas avoir d'erreur de permission (Cannot create temporary filename) il faut penser à donner à Nagios les permissions en écriture sur ce répertoire ; par ex pour Debian :
chmod 755 /usr/var && mkdir /usr/var/105/check_snmp && chown -R nagios /usr/var/105/check_snmp
* On créer ensuite le template, qui permet d'afficher le trafic //in// en surface (verte) et le trafic //out// en ligne bleue.
vi /usr/local/pnp4nagios/share/templates/check_syno_traf-eth0.php
MACRO['TIMET'] != ""){
$def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" ";
}
?>
Résultat :
{{ :informatique:logiciels:trafic_internet.png?direct |}}
Le même, un peu plus perfectionné :
MACRO['TIMET'] != ""){
$def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" ";
}
?>
====Exemple 2 : courbe CPU====
Autre exemple pour grapher l'utilisation CPU d'un fortinet v4 en gradiant.
Conf nagios, en vrac :
# paramètres de check_snmp :
# -P2c pour préciser le version de SNMP (2c)
# -t5 pour préciser le timeout (en secondes) de la commande
# -l pour préciser l'étiquette du résultat (elle sera utilisée par le graphe)
# et les classiques mandataires : -C et -o
define command{
command_name check_snmp_forti_cpu_v4
command_line /usr/lib64/nagios/plugins/check_snmp -H '$HOSTADDRESS$' -P2c -t5 -l "percent_CPU" -C '$ARG1$' -o .1.3.6.1.4.1.12356.101.4.1.3.0
}
# le service est rattaché au groupe fortigate_v4
define service {
name check-snmp-forti-cpu-v4
hostgroup_name fortigate_v4
use generic-service-no-notif
service_description CPU usage
check_command check_snmp_forti_cpu_v4!public
}
On réutilise le template par défaut :
DS as $KEY=>$VAL) {
$maximum = "";
$minimum = "";
$critical = "";
$crit_min = "";
$crit_max = "";
$warning = "";
$warn_max = "";
$warn_min = "";
$vlabel = "";
$lower = "";
$upper = "";
if ($VAL['WARN'] != "") {
$warning = $VAL['WARN'];
}
if ($VAL['WARN_MAX'] != "") {
$warn_max = $VAL['WARN_MAX'];
}
if ($VAL['WARN_MIN'] != "") {
$warn_min = $VAL['WARN_MIN'];
}
if ($VAL['CRIT'] != "") {
$critical = $VAL['CRIT'];
}
if ($VAL['CRIT_MAX'] != "") {
$crit_max = $VAL['CRIT_MAX'];
}
if ($VAL['CRIT_MIN'] != "") {
$crit_min = $VAL['CRIT_MIN'];
}
if ($VAL['MIN'] != "") {
$lower = " --lower=" . $VAL['MIN'];
$minimum = $VAL['MIN'];
}
if ($VAL['MAX'] != "") {
$maximum = $VAL['MAX'];
}
if ($VAL['UNIT'] == "%%") {
$vlabel = "%";
$upper = " --upper=101 ";
$lower = " --lower=0 ";
}
else {
$vlabel = $VAL['UNIT'];
}
$opt[$KEY] = '--vertical-label "' . $vlabel . '" --title "' . $this->MACRO['DISP_HOSTNAME'] . ' / ' . $this->MACRO['DISP_SERVICEDESC'] . '"' . $upper . $lower;
$ds_name[$KEY] = $VAL['LABEL'];
$def[$KEY] = rrd::def ("var1", $VAL['RRDFILE'], $VAL['DS'], "AVERAGE");
$def[$KEY] .= rrd::gradient("var1", $GRAD_INF, $GRAD_SUP, rrd::cut($VAL['NAME'],16), 20);
$def[$KEY] .= rrd::line1 ("var1", $_LINE );
$def[$KEY] .= rrd::gprint ("var1", array("LAST","MAX","AVERAGE"), "%3.4lf %S".$VAL['UNIT']);
if ($warning != "") {
$def[$KEY] .= rrd::hrule($warning, $_WARNRULE, "Warning $warning \\n");
}
if ($warn_min != "") {
$def[$KEY] .= rrd::hrule($warn_min, $_WARNRULE, "Warning (min) $warn_min \\n");
}
if ($warn_max != "") {
$def[$KEY] .= rrd::hrule($warn_max, $_WARNRULE, "Warning (max) $warn_max \\n");
}
if ($critical != "") {
$def[$KEY] .= rrd::hrule($critical, $_CRITRULE, "Critical $critical \\n");
}
if ($crit_min != "") {
$def[$KEY] .= rrd::hrule($crit_min, $_CRITRULE, "Critical (min) $crit_min \\n");
}
if ($crit_max != "") {
$def[$KEY] .= rrd::hrule($crit_max, $_CRITRULE, "Critical (max) $crit_max \\n");
}
$def[$KEY] .= rrd::comment("Command\: " . $VAL['TEMPLATE'] . "\\r");
}
?>
Résultat :
{{ :informatique:logiciels:cpu_forti.png?direct |}}
====Exemple 3 : graphique adaptatif====
Ce template va détecter automatiquement le nombre d'enregistrement dans la base RRD et s'adapter pour tracer le bon nombre de courbe (inconnue à l'avance).
DS as $CHAMP_RRD=>$VAL) {
if ($CPT == "1") {
$def[1] = rrd::def("var".$CPT,$VAL['RRDFILE'],$VAL['DS'],"AVERAGE");
}
else {
$def[1] .= rrd::def("var".$CPT,$VAL['RRDFILE'],$VAL['DS'],"AVERAGE");
}
$def[1] .= "LINE1:var".$CPT.$TAB_COLORS[$CHAMP_RRD].":\"".sprintf("%-15s",$VAL['NAME'])." \" " ;
$def[1] .= rrd::gprint('var'.$CPT,array("LAST","AVERAGE","MAX"),"%3.2lf %s$unit");
$CPT++;
}
if($this->MACRO['TIMET'] != ""){
$def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" ";
}
?>
======Tips======
=====Activer les commandes externes=====
Pour utiliser certaines fonctionnalités, comme relancer un check (Re-schedule the next check of this service) ou acquitter une alarme, on va avoir besoin d'activer les commandes externes. Si on ne le fait pas, on se fait insulter de la sorte : ''Error: Could not stat() command file '/var/lib/nagios3/rw/nagios.cmd'!''.
Pour cela :
# arrêter Apache et Nagios :
service apache2 stop
service nagios3 stop
# activer les commandes externes dans la configuration de Nagios :
vi nagios.cfg
check_external_commands=1
command_check_interval=15s # pas obligatoire mais il sera plus réactif
# ajouter l'utilisateur www-data dans le groupe nagios :
vi /etc/group
nagios:x:111:www-data
# le paquet Debian a des problemes de droits sur certains répertoire, il faut les corriger :
# - ajouter l'exécution à "other" sur le répertoire /var/lib/nagios3
dpkg-statoverride --update --add nagios nagios 751 /var/lib/nagios3
# - ajouter le sticky bit au répertoire parent du pipe des commandes externes
dpkg-statoverride --update --add nagios www-data 2710 /var/lib/nagios3/rw
# relancer Apache et Nagios :
service apache2 start
service nagios3 start
=====Crash de la machine=====
Lors d'un crash de la machine, malgré que le service nagios se soit relancé correctement, la partie ndo2db/ndoutils ne se relançait plus ; au premier abord le problème semble situé au niveau de nd2db :
/etc/init.d/ndo2db start
Starting ndo2db:Could not bind socket: Address already in use
done.
.. solutionné en supprimant la socket :
rm -f /usr/local/nagios/var/ndo.sock
/etc/init.d/ndo2db start
Starting ndo2db: done.
Le second problème venait de la base mySQL corrompue ; la solution a été de réparer la partie de la base qui remontait en erreur :
myisamchk --fast /var/lib/mysql/ndoutils/nagios_servicechecks.MYI
Warning: option 'key_buffer_size': unsigned value 18446744073709551615 adjusted to 4294963200
Warning: option 'read_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
Warning: option 'write_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
Warning: option 'sort_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
Checking MyISAM file: /var/lib/mysql/ndoutils/nagios_servicechecks.MYI
Data records: 714030 Deleted blocks: 271061
myisamchk: warning: Table is marked as crashed
myisamchk: warning: 2 clients are using or haven't closed the table properly
- check file-size
- check record delete-chain
myisamchk: error: Record at pos: 207467116 is not remove-marked
myisamchk: error: record delete-link-chain corrupted
MyISAM-table '/var/lib/mysql/ndoutils/nagios_servicechecks.MYI' is corrupted
Fix it using switch "-r" or "-o"
You have new mail in /var/spool/mail/root
myisamchk --recover /var/lib/mysql/ndoutils/nagios_servicechecks.MYI
Warning: option 'key_buffer_size': unsigned value 18446744073709551615 adjusted to 4294963200
Warning: option 'read_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
Warning: option 'write_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
Warning: option 'sort_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
- recovering (with sort) MyISAM-table '/var/lib/mysql/ndoutils/nagios_servicechecks.MYI'
Data records: 714030
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
Data records: 714032
myisamchk --fast /var/lib/mysql/ndoutils/nagios_servicechecks.MYI
Warning: option 'key_buffer_size': unsigned value 18446744073709551615 adjusted to 4294963200
Warning: option 'read_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
Warning: option 'write_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
Warning: option 'sort_buffer_size': unsigned value 18446744073709551615 adjusted to 4294967295
MyISAM file: /var/lib/mysql/ndoutils/nagios_servicechecks.MYI is already checked
service nagios start
Running configuration check...done.
Starting nagios: done.
=====Upgrade de Wheezy vers Jessie=====
Depuis quelques jours (fin avril 2015) Debian 8 stable est release. Je me suis donc mis à la page et j'ai eu la stupeur de voir que mon nagios3 avait été à moitié dézingué, et que le pnp4nagios avait même disparu des paquets (à priori il n'existe plus qu'en version unstable) !
Voici le mode pompier pour restaurer nos courbes :
// prérequis
aptitude install rrdtool librrds-perl php5-gd
wget https://sourceforge.net/projects/pnp4nagios/files/latest
# dans mon cas c'est la version pnp4nagios-0.6.25.tar.gz
tar -zxvf pnp4nagios-0.6.25.tar.gz
cd pnp4nagios-0.6.25
./configure
[..]
*** Configuration summary for pnp4nagios-0.6.25 03-01-2015 ***
General Options:
------------------------- -------------------
Nagios user/group: nagios nagios
Install directory: /usr/local/pnp4nagios
HTML Dir: /usr/local/pnp4nagios/share
Config Dir: /usr/local/pnp4nagios/etc
Location of rrdtool binary: /usr/bin/rrdtool Version 1.4.8
RRDs Perl Modules: FOUND (Version 1.4008)
RRD Files stored in: /usr/local/pnp4nagios/var/perfdata
process_perfdata.pl Logfile: /usr/local/pnp4nagios/var/perfdata.log
Perfdata files (NPCD) stored in: /usr/local/pnp4nagios/var/spool
Web Interface Options:
------------------------- -------------------
HTML URL: http://localhost/pnp4nagios
Apache Config File: /etc/apache2/conf.d/pnp4nagios.conf
Review the options above for accuracy. If they look okay,
type 'make all' to compile.
make all
cd ./src && make
make[1]: Entering directory '/home/dude/src/pnp4nagios-0.6.25/src'
gcc -g -O2 -DHAVE_CONFIG_H -DNSCORE -c -o utils.o utils.c
gcc -g -O2 -DHAVE_CONFIG_H -DNSCORE -c -o config.o config.c
gcc -g -O2 -DHAVE_CONFIG_H -DNSCORE -c -o logging.o logging.c
gcc -g -O2 -DHAVE_CONFIG_H -DNSCORE -o npcd npcd.c utils.o config.o logging.o -lpthread
gcc -fPIC -g -O2 -DHAVE_CONFIG_H -DNSCORE -o npcdmod.o npcdmod.c -shared -fPIC
make[1]: Leaving directory '/home/dude/src/pnp4nagios-0.6.25/src'
cd ./share && make
make[1]: Entering directory '/home/dude/src/pnp4nagios-0.6.25/share'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/dude/src/pnp4nagios-0.6.25/share'
cd ./scripts && make
make[1]: Entering directory '/home/dude/src/pnp4nagios-0.6.25/scripts'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/dude/src/pnp4nagios-0.6.25/scripts'
chmod a+r ./contrib/ssi/status-header.ssi
*** Compile finished ***
make install
- This installs the main program and HTML files
make fullinstall
- This installs the main program, runlevel scripts, config and HTML files
Enjoy.
# on va faire simple :
make fullinstall
[..]
Seulement voilà il faut le réintégrer au bousin, donc corriger quelques trucs :
* le fichier de conf d'apache est déposé dans $APACHEDIR$/conf.d ; or maintenant on utilise le système des ''*-available'' / ''*-enabled'' , à savoir on dépose le fichier de conf dans ''$APACHEDIR$/conf-available'' et on l'active avec un lien symbolique dans ''$APACHEDIR$/conf-enable'' ; donc :
mv /etc/apache2/conf-d/pnp4nagios.conf /etc/apache2/conf-available/pnp4nagios.conf
ln -s /etc/apache2/conf-available/pnp4nagios.conf /etc/apache2/conf-enabled/pnp4nagios.conf
NB : on aurait pu utiliser les commandes toutes faites d'Apache, à savoir ''a2enconf pnp4nagios'', mais maintenant c'est trop tard ! :)
* dans ce même fichier, le chemin du fichier de mots de passe (htpasswd) n'est pas correct, il faut le corriger :
vi /etc/apache2/conf-available/pnp4nagios.conf
#AuthUserFile /usr/local/nagios/etc/htpasswd.users
AuthUserFile /etc/nagios3/htpasswd.users
* dans le cadre de l'install à partir des sources, les chemins à renseigner dans la conf de nagios ont changés, notamment dans le fichier ''commands.cfg'' pour les commandes **process-host-perfdata** et **process-service-perfdata** :
vi /etc/nagios3/commands.cfg
define command{
command_name process-host-perfdata
#command_line /usr/bin/perl /usr/lib/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
command_line /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}
define command{
command_name process-service-perfdata
#command_line /usr/bin/perl /usr/lib/pnp4nagios/libexec/process_perfdata.pl
command_line /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
}
* du au changement de path, le chemin des templates à été modifié et pnp ne retrouve plus ces petits ; il faut donc déplacer les templates persos de l'ancien répertoire vers le nouveau :
mv /etc/pnp4nagios/templates/* /usr/local/pnp4nagios/share/templates/
* pour une raison qui m'est inconnue, le plugin **check_snmp** (quand utilisé avec l'option ''--rate'') enregistre ses états non plus dans ''/usr/var/check_snmp'' mais dans ''/usr/var/105/check_snmp'' ! Une réminiscence d'IA caractérielle, une portion de code spontané ? En tout cas on va lui créer son répertoire car il n'a pas les droits pour le faire seul :
mkdir /usr/var/105
chown nagios /usr/var/105
* quand on passe la souris sur les icônes, les courbes ne s'affichent plus ! Et pour cause, le lien symbolique du template ''/usr/share/nagios3/htdocs/ssi/status-header.ssi'' est ballant (sisi : "cp: pas d'écriture à travers le lien symbolique ballant « /usr/share/nagios3/htdocs/ssi/status-header.ssi »"). Bref il ne pointe vers rien ; on le remplace donc par la nouvelle version. Je ne la trouve pas dans les fichiers installés par la fullinstall, mais dans les sources :
updatedb
locate status-header.ssi
/home/dude/src/pnp4nagios-0.6.25/contrib/ssi/status-header.ssi
/home/dude/src/pnp4nagios-0.6.25/contrib/ssi/status-header.ssi.in
/usr/share/nagios3/htdocs/ssi/status-header.ssi
// on copie donc status-header.ssi à la place du symlink "ballant" :
rm /usr/share/nagios3/htdocs/ssi/status-header.ssi
cp /home/dude/src/pnp4nagios-0.6.25/contrib/ssi/status-header.ssi /usr/share/nagios3/htdocs/ssi/
chmod o+r /usr/share/nagios3/htdocs/ssi/status-header.ssi
* TODO : la prochaine fois, ne pas oublier de restaurer les bases RRD pour ne pas perdre tout l'historique de supervision :( A recopier ici : ''/usr/local/pnp4nagios/var/perfdata'' (avec leur arborescence)
=====Horodatage illisibles des logs=====
Les logs Nagios sont par défaut verbeux mais l'horodatage est illisible (humainement j'entends). Voici une petite commande perl pour convertir en heure intelligible :
# les logs bruts
tail -3 /var/log/nagios/nagios.log
[1441261778] Auto-save of retention data completed successfully.
[1441265378] Auto-save of retention data completed successfully.
[1441268978] Auto-save of retention data completed successfully.
# après convertion
tail -3 /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu Sep 3 08:29:38 2015] Auto-save of retention data completed successfully.
[Thu Sep 3 09:29:38 2015] Auto-save of retention data completed successfully.
[Thu Sep 3 10:29:38 2015] Auto-save of retention data completed successfully.
=====Contrôler Nagios en CLI=====
Grâce au commandes externes, on peut envoyer des ordres à Nagios via la ligne de commande, ce qui va plus vite que l'interface web dès qu'on donne beaucoup d'ordres :) Pour cela il suffit d'utiliser l'API/la syntaxe documentée ici : [[https://assets.nagios.com/downloads/nagioscore/docs/externalcmds/|Nagios Core External Commands]].
Exemples de scripts inspirés de ceux de la doc :
* ''nagios_downtime-host-and-childs.sh'' : permet de planifier un DOWNTIME à partir de maintenant pour un ou des hosts et tous ces childs.
#!/bin/bash
# This is a sample shell script showing how you can submit the SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME command
# to Nagios. Adjust variables to fit your environment as necessary.
[ -z "$3" ] && { echo "Syntaxe: ${O##*/} { etc..}"; exit 1; }
now=`date +%s`
commandfile='/var/nagios/rw/nagios.cmd'
end=`expr $now + $1`
comment="$2"
shift 2
while [ -n "$1" ]; do
/usr/bin/printf "[%lu] SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;$3;$now;$end;1;0;7200;toto;$comment\n" $now > $commandfile
shift
done
* permet de planifier un downtime pour un host et ses childs à un date donnée
function usage {
echo "Usage: ${O##*/} (format: \"%Y-%m-%d %H:%M:%S\")> \"\""
echo " format dates: \"%Y-%m-%d %H:%M:%S\""
echo " ex: nagios_downtime_w_childs.sh switch1 \"2021-01-15 07:18:00\" \"2021-01-15 07:48:00\" \"test downtime 30min\""
exit 1
}
[ -z "$4" ] && usage
now=$(date +%s)
commandfile='/var/nagios/rw/nagios.cmd'
# affectation et contrôle des inputs
naghost=$1
debut=$(date -d "$2" +%s 2>/dev/null)
[ -z "$debut" ] && { echo "Date début $2 invalide !"; usage; }
#[[ "$3" =~ ^[0-9]*$ ]] && fin=`expr $debut + $3` || { echo "ERR: Durée $3 invalide !"; usage; }
fin=$(date -d "$3" +%s 2>/dev/null)
[ -z "$fin" ] && { echo "Date fin $3 invalide !"; usage; }
comment="$4"
/usr/bin/printf "[%lu] SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;$naghost;$debut;$fin;1;0;7200;toto;$comment\n" $now > $commandfile
=====Annuler des actions en masse=====
//Préalable : il faut avoir activer les commandes externes (ce qui est bien souvent le cas...)//
Pour annuler en masse certaines actions, on peut interagir avec le fichier de pipe nommé **nagios.cmd** (situé dans **/var/spool/nagios/cmd/** ; sinon voir le paramètre ''command_file'' dans **/etc/nagios/nagios.cfg**).
Exemple pour supprimer des DOWNTIME planifiés pour un équipement et tous ses fils (soit une centaine de DOWNTIME) :
* on pourrait les supprimer un par un / clic par clic dans le menu "Downtime" ou ils sont listés, mais ça serait fastidieux ; au lieu de cela, repérer juste le premier et le dernier "Downtime ID" (1050 et 1150 dans mon cas)
* puis se connecter en SSH sur le serveur et lancer la commande :
for i in `seq 1050 1150`; do
printf "[%lu] DEL_HOST_DOWNTIME;$i\n" `date +%s` > /var/nagios/rw/nagios.cmd
done
Cela a pour effet d'envoyer des commandes qui seront lues par nagios ; l'effet n'est pas immédiat cela peut prendre quelques secondes/minutes.
======Liens======
* http://doc.ubuntu-fr.org/nagios