Installer Nagios 4

Laurent Archambault

Historique des versions
Version 1.030 sept 2013
Publication.
Version 1.220 oct 2013
Ajout des addons pour Netasq
Version 1.230 nov 2013
Ajout de PNP4nagios

Table of Contents

Contexte
1. Installer les dépendances.
La version 4.0.0 !
Les dépendances via une distribution Gnu/Linux-Debian/Ubuntu.
Téléchargement des composants Nagios.
Nagios-core
Les plugins
2. La compilation
Compilation de Nagios-Core
3. Nagios-plugins
Autres plugins
4. Configuration des fichiers nagios.cfg et cgi.cfg
nagios.cfg
cgi.cfg
5. Les autres fichiers de configuration
Les différents états
Les états pour les hôtes :
Les états pour les services :
Définitions des hôtes (hosts.cfg) :
Définitions de services (services.cfg) :
Définitions de services groupés (services-group.cfg) :
Définitions de contacts (contacts.cfg) :
Définition d'un contact de groupe (contactgroups.cfg) :
Définition d'un groupe d’hôtes (hostsgroup.cfg) :
Définition des périodes horaires (timeperiods.cfg):
Définition de commandes (commands.cfg) :
Définition de dépendance de service (dependancies.cfg) :
Définition d'escalade de service (escalations.cfg) :
Définition d'un groupe de services (servicegroups.cfg) :
Définition d'informations sur les hôtes (hostextinfo.cfg) :
Définition des templates (templates.cfg)
6. Compiler et installer NRPE
Son utilisation
Compilation
La configuration
Le fichier /etc/default/nagios-nrpe-server
Le fichier /etc/nagios/nrpe.cfg
Lancer NRPE
NRPE coté Nagios
7. NsClient
Téléchargement et installation
8. Le format graphique GD2
9. Nagios et Vmware (ESXi)
Les dépendances :
10. NagiosGraph
Récupération des sources
Installation
Configurer un service.
Vérification du bon fonctionnement.
Ajouter le menu Nagiosgraph dans l'interface
Le fichier map
Pourquoi est-ce compliqué ?
11. Supervision Netasq
check_vpn_netasq.pl
Son paramétrage
check_eth_netasq.pl
12. La notification avec Gmail
Via un plugin :
13. PNP4Nagios
Installation
Les dépendances
Les problèmes rencontrés.
Les templates
14. Conclusion.
A. Les liens utiles.
Glossary

Contexte

Ce document explique comment installer, configurer et exploiter Nagios 4.0, tout en constituant une solution technique et financière viable. De nos jours, le moindre réseau comprend une multitude d’éléments actifs, de machines et de services. Il est donc important de pouvoir connaître la disponibilité d'un service, d'une machine ou d'un réseau pour en informer rapidement les administrateurs. Nagios se distingue des autres logiciels de supervision souvent propriétaires et utilisant en masse SNMP, par son développement constant depuis 1999, par son coté Open source, par la présence de greffons installables sur les serveurs. La surveillance d'un ensemble de machines pourra s'effectuer par plusieurs niveaux, suivant les besoins :

Simple : PING sur une machine et un service avec notification et supervision par pages WEB.

Élaboré : Test du service et de la machine avec notification supplémentaire par courriel, PAGER, SMS...

Sophistiqué : Dans ce cas Nagios sera capable de relancer un service avec notification MAIL/PAGER/SMS...

Parmi les fonctionnalités basiques de Nagios voilà les possibilités :

Surveillance des services réseaux (SMTP, POP3, IMAP, HTTP(s), NNTP, PING, SSH, NTP, ORACLE, ...Etc..)

Surveillance des ressources des machines (hôtes) (charge processeur, utilisation des disques, etc.)

Système simple de plugins (ou greffons) permettant aux utilisateurs de développer facilement leurs propres vérifications de services personnalisés.

Parallélisation de la vérification des services et ou des machines.

Possibilité de définir la hiérarchie du réseau en utilisant des hôtes parents , ce qui permet la détection et la distinction entre les hôtes qui sont à l'arrêt et ceux qui sont injoignables.

Notifications des contacts quand un hôte ou un service a un problème, et est résolu (via mél, pager, ou par méthode définie par l'utilisateur)

Possibilité d'alertes sonores.

Possibilité de définir des gestionnaires d’événements qui s'exécutent pour des événements sur des hôtes ou des services, pour une résolution des problèmes directement sur la machine.

Rotation automatique des fichiers log.

Support pour l'implémentation de la surveillance des machines (hôtes) de manière redondante, et ou répartie.

Interface web pour voir l'état actuel du réseau, notification et historique des problèmes, fichiers log, etc avec authentification des utilisateurs.

Utilisation d'une base de données possible.

Nombreux plugins(greffons) disponibles.

Évolution permanente et encore bien d'autres possibilités.

Cet article va aborder l'installation, la configuration et l'exploitation de Nagios™ 3.99.96 ,autant parler de Nagios 4.0. Je ne peux classer cette version dans le domaine "stable", la version 4.0 en version finale arrive; d'où le choix de cette version. L'installation, la configuration et l'exploitation des greffons NRPE sera abordée, et au final comment superviser des équipements de type Netasq (U70)™ et divers équipements Vmware/ESXi/Vcenter 5.0™.

Pour avoir travaillé finement avec Nagios en version 2.0 (2004/2005) cette version apporte à mes yeux de grands changements, sans pour cela changer la philosophie Nagios. Et puis Nagios est pour moi par forcément l'outil le meilleur à configurer, mais il apporte par la suite beaucoup comme des graphiques sur l'état d'un service, d'un serveur. Ce système est suffisamment ouvert pour permettre pleins de choses, y compris se lancer soi-même si besoin. Et comme souvent le travail est récompensé !

Chapter 1. Installer les dépendances.

La version 4.0.0 !

Courant juillet 2013, j'ai commencé à rédiger ce document et le 20 septembre 2013 le version finale de Nagios est sortie. Ce chapitre à été ajouté pour la sortie de cette version à la vieille de publier ce document. Cette version apporte une page pour les diverses modifications entre la version 3 et 4. Les modifications portent surtout le moteur en lui-même, beaucoup d'optimisations et peut de modifications vis-à-vis des fichiers de configuration.

Après lecture des nouveautés, je suis heureux de constater que ce document ne doit pas être modifié, les définitions obsolètes font déjà l'objet de remarques.

Voici le lien de cette annonce : nagios-core-4-now-available.

Voici le lien sur les diverses modifications : whatsnew.html

Les dépendances via une distribution Gnu/Linux-Debian/Ubuntu.

Les composants qui suivent s'installent très simplement; ils sont indispensables. Ils sont tous disponibles sans modification. Cette liste n'est pas exhaustive car je me suis basé sur une distribution activée depuis longtemps, certains composants étaient déjà installés. Néanmoins voici une liste pour information :

apt-get install apache2 make php5-gd postfix fping snmp ntp smbclient nmap saidar traceroute \
php5-snmp curl gettext libperl-dev libgd2-xpm-dev libltdl3-dev build-essential rrdtool librrdbs-perl \
wget build-essential libgd2-xpm libapache2-mod-php5 libgetargs-long-perl libgd-tools libapache2-mod-gnutls \
libssl-dev mrtg libsnmp-perl libglib2.0-dev 

Rien de bien spécial à ce niveau, cette liste prend en compte des paquets pour l'extension par la suite de Nagios, comme SNMP, MRTG.

Téléchargement des composants Nagios.

Voici les procédures pour télécharger les éléments principaux pour une version de Nagios classique, il existe de nombreuses applications autour de lui (Nagvis, Nagiograph...). J'ai choisi volontairement d'utiliser une version basique, chaque chose en son temps.

Nagios-core

Il est nécessaire d'aller sur le site : Nagios-core, puis de télécharger la dernière version. A ce jour, la version disponible est la version 3.5, la version 4 est en béta1, à vous de choisir.

Selon votre version, il suffit tout simplement de décompresser les archives dans un répertoire dédié.

J'ai choisi la version via git-n3. A savoir que le mot nagios4 correspond à votre répertoire de destination, ce qui donne :

git clone git://git.code.sf.net/p/nagios/nagios nagios4
Cloning into 'nagios4'...
remote: Counting objects: 17407, done.
remote: Compressing objects: 100% (3275/3275), done.
remote: Total 17407 (delta 14090), reused 17407 (delta 14090)
Receiving objects: 100% (17407/17407), 9.68 MiB | 212 KiB/s, done.
Resolving deltas: 100% (14090/14090), done.

J'ai donc téléchargé la dernière version de nagios 3.X, ce qui donne à ce jour et dans mon cas la version 3.99.96. Mais pourquoi se compliquer la vie alors que la version 4.0.béta 1 est disponible plus facilement. Sans analyser fichier par fichier, il s'avère que la taille des sources de cette version est moindre que ma version téléchargée via Git. J'en conclue, peut-être facilement, qu'elle est plus complète.

[Warning] Warning
Avec la nouvelle version en 4.0.x, le dépot GIT semble ne plus être tenu à jour; il est toujours en version 3.96...

Les plugins

Les plugins sont indispensables, ils fournissent divers modules que Nagios utilisera pour tester ce que vous voulez, les exemples sont nombreux et multiples. Les domaines concernés sont très variés, ils concernent les services, les routeurs et switchs et même des sondes de température, le matériel comme Netapp, les bases de données ...etc.

Il existe un site dédié à tous ces modules, disponible ici : Nagios Exchange ou est listé 4007 plugins dans 429 catégories.

Le téléchargement

Il suffit de télécharger le fichier suivant : http://nagiosplug.sourceforge.net/snapshot/nagios-plugins-master.tar.gz, puis de le décompresser ou il faut.

Chapter 2. La compilation

La partie précédente est une formalité, nous attaquons l'une des étapes les plus importantes et qui parfois prend du temps. Comme déjà dit choisir une version en cours de développement n'est pas forcément fait pour aider. En ce qui concerne les plugins, comme il en existe dans divers langages, des problèmes de dépendance peuvent apparaître.

Compilation de Nagios-Core

Placez vous dans le répertoire nagios4, conformément au paragraphe git-n3. Voici les options possibles de compilation, toutes ne seront pas utilisées.

./configure --help
`configure' configures this package to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local/nagios]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, `make install' will install all the files in
`/usr/local/nagios/bin', `/usr/local/nagios/lib' etc.  You can specify
an installation prefix other than `/usr/local/nagios' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
--disable-statusmap=disables compilation of statusmap CGI
--disable-statuswrl=disables compilation of statuswrl (VRML) CGI
--enable-nanosleep enables use of nanosleep (instead of sleep) in event timing
--enable-event-broker enables integration of event broker routines
--enable-cygwin enables building under the CYGWIN environment
  --enable-libtap         Enable built-in libtap for unit-testing (default: no).

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-nagios-user=user sets user name to run nagios
  --with-nagios-group=grp sets group name to run nagios
  --with-command-user=user sets user name for command access
  --with-command-group=grp sets group name for command access
--with-mail=path_to_mail sets path to equivalent program to mail
--with-httpd-conf=path_to_conf sets path to Apache conf.d directory
--with-checkresult-dir=path sets path to check results spool directory
--with-temp-dir= path sets path to temp directory
--with-init-dir=path sets directory to place init script into
--with-lockfile=path sets path and file name for lock file
--with-gd-lib=DIR sets location of the gd library
--with-gd-inc=DIR sets location of the gd include files
--with-cgiurl=local-url sets URL for cgi programs (do not use a trailing slash)
--with-htmurl=local-url sets URL for public html

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -Llib dir if you have libraries in a
              nonstandard directory lib dir
  LIBS        libraries to pass to the linker, e.g. -l library
  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I include dir if
              you have headers in a nonstandard directory include dir
  CPP         C preprocessor

J'ai choisi une compilation presque par défaut, ce qui donne ceci pour mes paramètres :

make clean dep ; ./configure --with-nagios-group=nagios --with-command-group=nagcmd \ 
 --enable-embedded-perl --with-temp-dir=/tmp --with-init-dir=/etc/init.d \
 --with-cgiurl=/nagios3/cgi-bin --with-htmurl=/nagios3 --sysconfdir=/etc/nagios \ 
 --localstatedir=/var/nagios --with-checkresult-dir=/var/nagios --enable-event-broker--enable-nanosleep 
[Note]Note
Je ne peux que vous conseiller de mémoriser ces paramètres, ils pourront éventuellement servir ultérieurement, ou même pour une autre plate-forme. (config.log)

La commande make clean dep ; est optionnelle, mais indispensable si vous faites plusieurs essais de compilation. Le --enable-embedded-perl est activé et ne pose aucun problème. Néanmoins dans la version 4 de Nagios cette option sera supprimée. Il est inutile de créer au préalable l'utilisateur nagios et son groupe nagcmd, ils seront faits à la fin de compilation automatiquement.

Avant de tout lancer il est nécessaire de créer l'utilisateur nagios et ses groupes : voici comment faire. Ensuite il faut modifier le fichier /etc/passwd et modifier la valeur /bin/sh (ou autre) par cette valeur /bin/false.

# groupadd -g 1002 nagios
# groupadd -g 1003 nagcmd
# useradd -u 1001 -g nagios -G nagcmd -d /usr/local/nagios -c "Nagios Admin" nagios
*** Configuration summary for nagios 3.99.96 03-14-2013 ***:
        General Options:
        -------------------------
        Nagios executable:  nagios
        Nagios user/group:  nagios,nagios
        Command user/group:  nagios,nagcmd
        Event Broker:  yes
        Install ${prefix}:  /usr/local/nagios
        Install ${includedir}:  /usr/local/nagios/include/nagios
        Lock file:  ${prefix}/var/nagios.lock
        Check result directory:  ${prefix}/var/spool/checkresults
        Init directory:  /etc/init.d
        Apache conf.d directory:  /etc/apache2/conf.d
        Mail program:  /bin/mail
        Host OS:  linux-gnu
        
        Web Interface Options:
        ------------------------
        HTML URL:  http://localhost/nagios3/
        CGI URL:  http://localhost/nagios3/cgi-bin/
        Traceroute (used by WAP):  /usr/sbin/traceroute
                
        Review the options above for accuracy.  If they look okay,
        type 'make all' to compile the main program and CGIs.

Rien de bien spécial à ce niveau, il est tout de même intéressant de bien regarder chaque ligne car elles correspondent à un paramètre qui formera la structure de votre Nagios. A titre d'exemple, la ligne Check result directory: ${prefix}/var/spool/checkresults va se retrouver ici /usr/local/nagios/var/spool/checkresults. Ceci n'est pas très gênant, mais personnellement je préfère chercher directement dans le répertoire /var/spool/....

Une fois l'architecture définie, il est temps de faire chauffer les CPUs, via la commande make all :

make all ; 
*** Exfoliation theme installed ***
NOTE: Use 'make install-classicui' to revert to classic Nagios theme

make[1]: quittant le répertoire « /mnt/Divers@/Compilation/nagios3 »
make install-basic
make[1]: entrant dans le répertoire « /mnt/Divers@/Compilation/nagios3 »
/usr/bin/install -c -m 775 -o nagios -g nagios -d /usr/local/nagios/libexec
/usr/bin/install -c -m 775 -o nagios -g nagios -d /var
/usr/bin/install -c -m 775 -o nagios -g nagios -d /var/archives
/usr/bin/install -c -m 775 -o nagios -g nagios -d /var/spool/checkresults

*** Main program, CGIs and HTML files installed ***

You can continue with installing Nagios as follows (type 'make'
without any arguments for a list of all possible options):

  make install-init
     - This installs the init script in /etc/nagios3

  make install-commandmode
     - This installs and configures permissions on the
       directory for holding the external command file

  make install-config
     - This installs sample config files in /etc

Une fois cette commande réalisée, Nagios vous indique les étapes suivantes, il faut les faire :

make install && make install-init && make install-commandmode && make install-config && make install-webconf

Une fois toutes ces étapes réalisées avec succès, Nagios™ est presque installé, il est nécessaire de copier manuellement ceci et de donner les droits nécessaires:

[Warning]Warning
Pour une mise à jour de Nagios ou plutôt pour une évolution dans la même série, il suffit de refaire la compilation puis de lancer les scripts suivants : make all ; make install, et le tour est joué !
cp -R contrib/eventhandlers/ /usr/local/nagios/libexec/ ; chown -R nagios:nagcmd /usr/local/nagios/libexec/eventhandlers

Il est temps de tester tout çà, simplement en faisant cette commande :

/usr/local/nagios/bin/nagios -v /etc/nagios/nagios.cfg

Rien de bien spécial une fois de plus. Si une erreur est présente Nagios va l'afficher clairement. L'étape suivante est le lancement de Nagios en mode résident, via la commande :

/etc/init.d/nagios start
[Warning]Warning
Sauf que le fichier fournit dans les sources ne fonctionne pas sur une Debian/Ubuntu. Si nécessaire, le plus rapide est d'adapter un script existant pour votre situation.

Il faut créer le fichier /etc/default/nagios avec les valeurs suivantes :

# Activer Nagios au boot
ENABLED="yes"

# Fichier de conf Nagios :
NAGIOSCFG="/etc/nagios/nagios.cfg"

# localisation du fichier de conf des CGI-BIN :
CGICFG="/etc/nagios/cgi.cfg"

# Niveau "nice" :
NICENESS=5

# Si utilisation de "pam_tmpdir" il faut activer :
# TMPDIR="/tmp"

# Si utilisation de RAM DISK :
USE_RAMDISK="2048"

Pour le fichier /etc/init.d/nagios, voici ma version actuelle: elle comporte un bogue au niveau du stop. Je vais refaire ce script ultérieurement.

>#! /bin/sh
#		Written by Miquel van Smoorenburg miquels@cistron.nl
#		Modified for Debian GNU/Linux
#		by Ian Murdock imurdock@gnu.ai.mit.edu.
#               Clamav version by Magnus Ekdahl magnus@debian.org
#		Nagios version by Sean Finney seanius@debian.org and probably others
#		nagios2 version by Marc Haber mh+debian-packages@zugschlus.de
#		nagios3 version by Alexander Wirt formorer@debian.org

### BEGIN INIT INFO
# Provides:          nagios3
# Required-Start:    $local_fs $remote_fs $syslog $named $network $time
# Required-Stop:     $local_fs $remote_fs $syslog $named $network
# Should-Start:      
# Should-Stop:       
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: nagios host/service/network monitoring and management system
# Description:       nagios is a monitoring and management system for hosts, services and networks.
### END INIT INFO

set -e

. /lib/lsb/init-functions

DAEMON=/usr/local/nagios/bin/nagios
NAME="nagios"
DESC="nagios 3.99 monitoring daemon"
NAGIOSCFG="/etc/nagios/nagios.cfg"
CGICFG="/etc/nagios/cgi.cfg"
NICENESS=5

[ -x "$DAEMON" ] || exit 0
[ -r /etc/default/nagios ] && . /etc/default/nagios

# this is from madduck on IRC, 2006-07-06
# There should be a better possibility to give daemon error messages
# and/or to log things
log()
{
  case "$1" in
    [[:digit:]]*) success=$1; shift;;
    *) :;;
  esac
  log_action_begin_msg "$1"; shift
  log_action_end_msg ${success:-0} "$*"
}

check_started () {
	#nagios3-core can be installed without -cgi
	if [ -e $CGICFG ];
	then
		check_cmd=$(get_config nagios_check_command $CGICFG)
		if [ ! "$check_cmd" ]; then
			log 6 "unable to determine nagios_check_command from $CGICFG!" 
			return 6
		fi
	else 
		#use hardcoded default version
		check_cmd="/usr/lib/nagios/plugins/check_nagios /var/cache/nagios3/status.dat 5 '/usr/local/nagios/bin/nagios'"
	fi

  eval $check_cmd >/dev/null
		
  if [ -f "$THEPIDFILE" ]; then
    pid="$(cat $THEPIDFILE)"
    if [ "$pid" ] && kill -0 $pid >/dev/null 2>/dev/null; then
      return 0    # Is started
    fi
  fi
  return 1	# Isn't started
}

#
#	get_config()
#
#	grab a config option from nagios.cfg (or possibly another nagios config
#	file if specified).  everything after the '=' is echo'd out, making
#	this a nice generalized way to get requested settings.
#
get_config () {
  if [ "$2" ]; then
    set -- `grep ^$1 $2 | sed 's@=@ @'`
  else
    set -- `grep ^$1 $NAGIOSCFG | sed 's@=@ @'`
  fi
  shift
  echo $*
}

check_config () {
  if $DAEMON -v $NAGIOSCFG >/dev/null 2>&1 ; then
    # First get the user/group etc Nagios is running as
    nagios_user="$(get_config nagios_user)"
    nagios_group="$(get_config nagios_group)"
    log_file="$(get_config log_file)"
    log_dir="$(dirname $log_file)"

    return 0    # Config is ok
  else
    # config is not okay, so let's barf the error to the user
    $DAEMON -v $NAGIOSCFG
  fi
}

check_named_pipe () {
  nagiospipe="$(get_config command_file)"
  if [ -p "$nagiospipe" ]; then
    return 1   # a named pipe exists
  elif [ -e "$nagiospipe" ];then
    return 1
  else
    return 0   # no named pipe exists
  fi
}

if [ ! -f "$NAGIOSCFG" ]; then
  log_failure_msg "There is no configuration file for Nagios 3."
  exit 6
fi

THEPIDFILE=$(get_config "lock_file")
[ -n "$THEPIDFILE" ] || THEPIDFILE='/var/run/nagios.pid'

start () {

  if [ "$ENABLED" = "no"  ]; then
	  log_warning_msg "Not starting Nagios3 - set ENABLED to yes in /etc/default/nagios"
	  exit 0
  fi

  DIRECTORY=$(dirname $THEPIDFILE)
  [ ! -d $DIRECTORY ] && mkdir -p $DIRECTORY
  chown nagios:nagios $DIRECTORY

  if ! check_started; then
    if ! check_named_pipe; then
      log_action_msg "named pipe exists - removing"
      rm -f $nagiospipe
    fi
    if check_config; then
      start_daemon -n $NICENESS -p $THEPIDFILE $DAEMON -d $NAGIOSCFG
      ret=$?
    else
      log_failure_msg "errors in config!"
      log_end_msg 1
      exit 1
    fi
  else
    log_warning_msg "already running!"
  fi
  return $ret
}

stop () {
    killproc -p $THEPIDFILE
    ret=$?
    if [ `pidof nagios3 | wc -l ` -gt 0 ]; then
        echo -n "Waiting for $NAME daemon to die.."
        cnt=0
        while [ `pidof nagios3 | wc -l ` -gt 0 ]; do
            cnt=`expr "$cnt" + 1`
            if [ "$cnt" -gt 15 ]; then
                kill -9 `pidof nagios`
                break
            fi
            sleep 1
            echo -n "."
        done
    fi
    echo
    if ! check_named_pipe; then
      rm -f $nagiospipe
    fi
    if [ -n "$ret" ]; then
      return $ret
    else
      return $?
    fi
}

status()
{
  log_action_begin_msg "checking $DAEMON"
  if check_started; then
    log_action_end_msg 0 "running"
  else
    if [ -e "$THEPIDFILE" ]; then
      log_action_end_msg 1 "$DAEMON failed"
      exit 1
    else
      log_action_end_msg 1 "not running"
      exit 3
    fi
  fi
}

reload () {
  # Check first
  if check_config; then
    if check_started; then
      killproc -p $THEPIDFILE $DAEMON 1 
    else
      log_warning_msg "Not running."
    fi
  else
    log_failure_msg "errors in config!"
    log_end_msg 6
    exit 6
 fi
}

case "$1" in
  start)
    log_daemon_msg "Starting $DESC" "$NAME"
    start
    log_end_msg $?
    ;;
  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
    stop
    log_end_msg $?
  ;;
  restart)
    log_daemon_msg "Restarting $DESC" "$NAME"
    stop
    if [ -z "$?" -o "$?" = "0" ]; then
      start
    fi
    log_end_msg $?
  ;;
  reload|force-reload)
    log_daemon_msg "Reloading $DESC configuration files" "$NAME"
    reload
    log_end_msg $?
  ;;
  status)
    status
    ;;
  check)
    check
    ;;
  *)
    log_failure_msg "Usage: $0 {start|stop|restart|reload|force-reload|status}" >&2
    exit 1
  ;;
esac

exit 0

Il faut lancer le serveur HTTP (Apache2) désormais :

/etc/init.d/httpd start

Il faut établir un mot de passe pour le compte nagiosadmin, voici la procédure :

cd /etc/nagios ; htpasswd -c htpasswd.users nagiosadmin
New password: 
Re-type new password: 
Adding password for user nagiosadmin

Il est possible de rajouter et/ou modifier le mot de passe d'une ou plusieurs personnes via cette commande. Reportez vous à la commande htpasswd pour de plus amples renseignements. En fonction de la configuration de votre serveur Apache™, il est possible de voir plusieurs instances de Nagios.

[Warning]Warning
Pendant que nous sommes avec Apache, si jamais Nagios affiche des caractères mal encodés il faut activer ceci dans le fichier etc/apache2/conf.d/charset :
AddDefaultCharset UTF-8
Cette modification demande un reload pour Apache, et le tour est joué.

Cette commande vous facilitera la vie : ajout de l'utilisateur Apache dans le group nagios, ce qui donne : adduser www-data nagcmd.

Chapter 3. Nagios-plugins

Table of Contents

Autres plugins

Il faut se placer dans le répertoire des plugins récemment téléchargés; puis lancer la commande :

./configure --with-nagios-user=nagios --with-nagios-group=nagios

Depuis ce problème est peut-être corrigé. Si vous rencontrez une erreur fatale liée à ce fichier ./gl/stdio.ht, il faut faire ceci :

Éditez le fichier gl/stdio.ht ligne 456 remplacer gets par fgets, -_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");. Ensuite refaire le début de la compilation sans lancer avant un make clean dep

Une fois cette étape complète, il faut lancer la compilation proprement dite via make && make install

Tous les plugins sont installés dans ce répertoire : /usr/local/nagios/libexec

Autres plugins

Il en reste plein d'autres encore dans le répertoire des sources, dans le répertoire contrib. Libre à vous de les utiliser à condition de les copier dans /usr/local/nagios/libexec.

[Note]Note
Il existe un site dédié pour le développement ou pour régler un bogue avec un plugin. Donc il vaut mieux éviter de choisir l'un des plugins figurant sur ce site : https://github.com/nagios-plugins/nagios-plugins/issues

Chapter 4. Configuration des fichiers nagios.cfg et cgi.cfg

Table of Contents

nagios.cfg
cgi.cfg

nagios.cfg

Ce fichier doit être vérifié ligne par ligne, il mérite quelques modifications ou adaptations. Les données qui suivent proviennent de ma configuration, libre à vous de les modifier. Personnellement j'ai regroupé beaucoup de fichiers dans /var/nagios/: ceci pour éviter des problèmes de droits, mais surtout pour retrouver presque tout rapidement.

  • log_file=/var/log/nagios.log

  • object_cache_file=/var/nagios/objects.cache

  • precached_object_file=/var/nagios/objects.precache

  • status_file=/var/nagios/status.dat

  • command_file=/var/log/nagios/nagios.cmd

  • lock_file=/var/run/nagios.lock

  • temp_file=/tmp/nagios.tmp

  • temp_path=/tmp

  • state_retention_file=/var/nagios/retention.dat

  • use_timezone=Africa/Libreville

    Les paramètres possibles sont dans le répertoire /usr/share/zonefinfo/ (Etc/GMT+1 ou Europe/Paris...)

  • date_format=euro

  • admin_email=nagios@localhost

    Sera modifié/adapté par la suite...

Les paramètres suivants sont apparus avec la V 4; ils ne sont pas obligatoires car ils existent des valeurs par défaut.

# represente le nbr de daemon pour les requêtes HOST/SRV...par defaut=4, en fonction de l'importance de votre réseau.
check_workers=10
# fichier necessaire avec la V 4
query_socket=/var/nagios/rw/nagios.qh
# pour de grosses installation placer cette valeur à 0 permet de gagner de la place disque lors de la rotation des logs.
log_current_states=0

cgi.cfg

Ce fichier comprend les paramètres pour l'interface WEB.

Ce fichier est configuré avec une authentification obligatoire pour accéder à l'interface. Ceci permet de régler les accès en modifications, finement et ceux en lecture seules avec le caractère *.

  • nagios_check_command=/usr/local/nagios/libexec/check_nagios -F /var/cache/status.dat 5 '/usr/local/nagios/bin/nagios'

    Ligne que j'ai ajoutée : elle était absente (?) et pourtant obligatoire.

    [Warning]Warning
    Ne placer cette ligne qu'uniquement lors d'un problème. Lors d'une récente installation tout est passé sans problème. C'est l'avantage de se baser sur une version en développement...
  • authorized_for_system_information=*

  • authorized_for_configuration_information=*

  • authorized_for_system_commands=nagiosadmin

  • authorized_for_all_services=nagiosadmin

  • authorized_for_all_hosts=nagiosadmin

  • authorized_for_all_service_commands=nagiosadmin

  • authorized_for_all_host_commands=nagiosadmin

  • #authorized_for_read_only=*

    Cette ligne sera activée par la suite, une fois Nagios actif.
  • #statusmap_background_image=smbackground.gd2

    Comme pour la ligne précédente, elle sera modifiée ultérieurement. Voir aussi le chapitre sur le format gd2 pour de plus amples renseignements.

Maintenant que les 2 fichiers principaux sont configurés vous pouvez tester l'ensemble via cette commande :

/usr/local/nagios/bin/nagios -v /etc/nagios/nagios.cfg
Nagios Core 3.99.96
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 03-14-2013
License: GPL

Website: http://www.nagios.org
Reading configuration data...
   Read main config file okay...
   Read object config files okay...

Running pre-flight check on configuration data...

Checking services...
	Checked 8 services.
Checking hosts...
	Checked 1 hosts.
Checking host groups...
	Checked 1 host groups.
Checking service groups...
	Checked 0 service groups.
Checking contacts...
	Checked 1 contacts.
Checking contact groups...
	Checked 1 contact groups.
Checking commands...
	Checked 24 commands.
Checking time periods...
	Checked 5 time periods.
Checking for circular paths...
	Checked 1 hosts
	Checked 0 service dependencies
	Checked 0 host dependencies
	Checked 5 timeperiods
Checking global event handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...

Total Warnings: 0
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check

Chapter 5. Les autres fichiers de configuration

Ce chapitre va s’efforcer d'expliquer la configuration des divers matériels, services pour que Nagios soit en mesure de les superviser. Cette étape est relativement pénible car elle doit être faite manuellement. Il faut avoir en tête tous les types différents à superviser et les placer dans la mesure du possible dans des fichiers distincts, et non tous dans un même fichier.

Les différents états

Je présente les différents états que peuvent avoir un hôte ou service, il est important de les connaître avant de passer à la configuration. Ces paramètres sont présents un peu partout sous la forme d'une seule lettre.

Les états pour les hôtes :

  • d : Notification sur les hôtes en états DOWN

  • u : Notification sur les hôtes en états non joignables (UNREACHABLE)

  • r : Notification quand un hôte retourne à l'état normal (états UP)

  • f : Notification quand un hôte commence ou s'arrête d'osciller,

  • s : Notification quand un hôte ou service entre ou sort de période de maintenance planifiée.

  • n : None ou (null) aucune notification

Les états pour les services :

  • w : Notification sur états WARNING de service

  • u : Notification sur états UNKNOWN de service

  • c : Notification sur états CRITICAL de service

  • r : Notification sur états OK

  • f : Notification quand le service commence et s'arrête d'osciller.

  • n : (none) : Le contact ne recevra aucun type de notifications de services

Définitions des hôtes (hosts.cfg) :

Une définition d'hôte ou de machine s'applique à un serveur "physique/virtuel", une station de travail, un périphérique, ou un équipement présent sur votre réseau. Il est possible d'utiliser les templates pour la configuration de ce fichier

define host{
host_name	host_name
; C'est le nom court qui permet d'identifier l'hôte.
; Il est utilisé dans les groupes d'hôtes et les définitions de service pour faire référence à cet hôte particulier. 
; Les hôtes peuvent être associés à de multiples services (qui sont supervisés).
; Si elle est utilisée dans le bon contexte, la macro $HOSTNAME$ contient ce nom court.

alias	alias
; C'est un nom long ou une description de l'hôte permettant de l'identifier plus facilement. 
; Si elle est utilisée dans le bon contexte, la macro $HOSTALIAS$ contient cet alias/description.

display_name	display_name

address	address
; @IP ou FQDN

parents	host_names
; dépendance vis-à-vis d'un autre hôte

hostgroups	hostgroup_names
; à remplir

check_command	command_name
; C'est le nom court de la commande à utiliser pour déterminer si l'hôte est hors service ou non. 
; Typiquement, cette commande lance un "test (HTTP)" vers l'hôte pour voir si il est "vivant". 
; La commande doit retourner un état OK (0) sinon Nagios supposera que cet hôte est hors service. 
; Si vous laissez cet argument vide, l'hôte ne sera pas contrôlé -
; Nagios supposera que l'hôte est toujours en fonctionnement. 
; Ceci est utile pour superviser des imprimantes ou autres périphériques qui sont éteints fréquemment.

initial_state	[o,d,u]
; OK/ DOWN / UP  "d" est à mon sens une bonne valeur

max_check_attempts	1
; C'est le nombre de fois que Nagios relancera la commande de contrôle de 
; l’hôte si celle-ci retourne un état différent de OK. Positionner cette valeur à 1 fera
; que Nagios générera une alerte sans re-contrôler l'hôte.
; Note : si vous ne voulez pas contrôler l'état de l'hôte, 
; vous devez quand même mettre une valeur supérieure ou égale à 1. 
; Pour ne pas effectuer le contrôle de l'hôte, laissez simplement vide l'option "host_check_command".

check_interval	#
; interval de test si état = OK 

retry_interval	#
; interval de test si etat est NOK.

active_checks_enabled	[0/1]
; active les tests via Nagios

passive_checks_enabled	[0/1]
; active les tests indirects, style NRPE, nsclient...

check_period	timeperiod_name
; période de test, souvent "24x7"

obsess_over_host	[0/1]
; experimentale - a utiliser avec precaution - defaut à zéro

check_freshness	[0/1]
; a utiliser avec passive tests ! en général plus pour un service qu'un hote.
; A utiliser si vous utilisez un Nagios en redondant.

freshness_threshold	#
; a utiliser avec passifs test et en Nagios redondant
; elle indique en secondes l'âge maximum des résultats fournis pour ce service, sachant qu'il s'agit en général d'un système distribué

event_handler	command_name
; permet de lancer une commande après que le SVC soit passé en NOK, style un reboot du SVC, un autre test...

event_handler_enabled	[0/1]
; active ou pas le gestionnaire d’événement 

low_flap_threshold	#
; a utiliser si l'option "flap_detection_enabled" est active, à utiliser en particulier pour la mémoire, CPU.
; Donc plus pour un service qu'un hôte en général.

high_flap_threshold	#
; a utiliser si l'option "flap_detection_enabled" est active sinon Nagios supprime les notifications sauf 
; les valeures hautes et basses sont dépassées.

flap_detection_enabled	[0/1]
; active le mode "oscillation" de l'hôte, en général valable pour un service et non un hote.

flap_detection_options	[o,d,u]
; Ok / DOWN / UP

process_perf_data	[0/1]
; a utiliser pour faire des stats via MRTG ou autre...

retain_status_information	[0/1]
; conserve un état de l’hôte si Nagios est redémarré - par défaut = 1

retain_nonstatus_information	[0/1]
; conserve l'état ...si Nagios est redémarré par défaut = 1

contacts	contacts
; à remplir, si notification activée
contact_groups	contact_groups

notification_interval	#
; notification_interval	0
; C'est le nombre d'"unités de temps" à patienter avant de re-notifier un
; contact que l'hôte est toujours hors service ou inaccessible.
; Si vous n'avez pas modifié la valeur par défaut de la variable interval_length dans
; le fichier de configuration principal, qui est de 60, ce nombre exprime des minutes. 
; Si vous mettez cette valeur à 0, Nagios ne re-notifiera pas les contacts à propos des problèmes
; de cet hôte - une seule notification sera émise.

first_notification_delay	#
; quand sera transmise la 1ere notification en principe tout de suite donc à zéro ou sinon réglable : "0h 0m 0s"

notification_period	timeperiod_name
; notification_period	24x7
; C'est le nom court de la période durant laquelle les notifications d'événements 
; concernant cet hôte peuvent être émises vers les contacts. 
; Si un hôte est hors service, inaccessible, ou se rétablit en dehors
; de la période de notification, aucune notification ne sera envoyée.

notification_options	[d,u,r,f,s]
; Cette directive définit quand les notifications pour cet hôte doivent être envoyées. 
; Les options valides sont une combinaison d'une ou plusieurs des valeurs suivantes :
; d = envoi de la notification pour un état DOWN, 
; u = envoi de la notification pour un état UNREACHABLE , et 
; r = envoi de la notification pour le retour à la normale (état OK).
; f = mode "flap" 
; s = mode "stop" 
; Si vous spécifiez la valeur n (none), aucune notification ne sera envoyée.
; Exemple: avec les valeurs d,r dans ce champ, les notifications seront envoyées quand l'hôte
; sera DOWN et quand il sortira de cet état pour un état OK.  

notifications_enabled	[0/1]

stalking_options	[o,d,u];
; utilisé en général pour un service OK / DOWN / non joignable 
; permet de notifier en limitant si besoin les états
; si vous sélectionnez que U, uniquement les notifications UP seront envoyées
; (Cette option n'est pas encore documenté pour un hôte).
; par défaut = none ou rien(vide).

notes	note_string
; description possible

notes_url	url

action_url	url
; pour un site WEB, il est possible de placer son lien ici.

icon_image	image_file
icon_image_alt	alt_string
vrml_image	image_file

statusmap_image	image_file
; en prinicpe au format GD2.

2d_coords	x_coord,y_coord
3d_coords	x_coord,y_coord,z_coord
   	}

Définitions de services (services.cfg) :

La définition d'un service identifie un service tournant sur un hôte. Le terme "service" est très générique. Il peut s'appliquer à un service ( tel que POP, SMTP, HTTP, etc.) ou bien tout autre type de mesure associé à l'hôte (temps de réponse à un ping, nombre d'utilisateurs connectés, usage des disques). Les différents arguments sont expliqués ci-dessous. Ce fichier est également indispensable et primordial : c'est lui qui définit les tests à effectuer pour un service. Il ressemble au précédent fichier avec des options identiques mais applicables à un service. Il est conseillé de faire plusieurs fichiers services plutôt qu'un gros fichier inexploitable par la suite.

Il est conseillé de travailler avec les templates; expliqués par la suite.

define service{
host_name	host_name

hostgroup_name	hostgroup_name
service_description	service_description
display_name	display_name

servicegroups	servicegroup_names
; appartenance à un group de service

is_volatile	[0/1]
; En principe tous les services sont "non volatiles" (normaux). Donc valeur à zéro
; a utiliser dans des cas "rares" comme sur un test (portsentry), une alerte dans ou sur un fichier (log), une alarme...

check_command	command_name
; la commande à lancer pour les tests

initial_state	[o,w,u,c]
; OK/ WARNING / UNKNOWN joignable / CRITICAL
; peut utiliser

max_check_attempts	#
; C'est le nombre de fois que Nagios relancera la commande de contrôle du SVC 
; si celle-ci retourne un état différent de OK. Positionner cette valeur à 1 fera
; que Nagios générera une alerte sans re-contrôler.
; Note : si vous ne voulez pas contrôler l'état,vous devez quand même mettre une valeur supérieure ou égale à 1. 

check_interval	#
; interval de test si état = OK  - minutes

retry_interval	#
; interval de test si etat est NOK. minutes

active_checks_enabled	[0/1]
; test via Nagios

passive_checks_enabled	[0/1]
; test via NRPE, nsclient...

check_period	timeperiod_name
; période de test, souvent "24x7"

obsess_over_service	[0/1]
; experimentale - à utiliser avec précaution - défaut à zéro

check_freshness	[0/1]
; a utiliser avec passive tests ! en général plus pour un service qu'un hôte.
; à utiliser avec un nagios en redondant

freshness_threshold	#
; a utiliser avec passifs test !
; à utiliser avec un nagios en redondant

event_handler	command_name
; permet de lancer une commande supplémentaire une fois l'état est NOK

event_handler_enabled	[0/1]
; active le gestionnaire d’événement complémentaire ou pas, en général non

low_flap_threshold	#
; a utiliser si l'option "flap_detection_enabled" est active, à utiliser en particulier pour la mémoire, CPU.
; Donc plus pour un service qu'un hôte en général.

high_flap_threshold	#
; a utiliser si l'option "flap_detection_enabled" est active sinon Nagios supprime les notifications sauf 
; les valeures hautes et basses sont dépassées.

flap_detection_enabled	[0/1]
; active le mode "oscillation" de l'hôte, en général valable pour un service et non un hote.

flap_detection_options	[o,w,c,u]
; Ok / WARNING / CRITICAL / Non joignable

process_perf_data	[0/1]

retain_status_information	[0/1]
; conserve un état de l'hote si Nagios est redémarré - par défaut = 1

retain_nonstatus_information	[0/1]
; conserve l'état ...si Nagios est redémarré par défaut = 1

notification_interval	#
; tout de suite donc 0 
first_notification_delay	#

notification_period	timeperiod_name
; notification_period	24x7
; C'est le nom court de la période durant laquelle les notifications d'événements 
; concernant cet hôte peuvent être émises vers les contacts. 
; Si un hôte est hors service, inaccessible, ou se rétablit en dehors
; de la période de notification, aucune notification ne sera envoyée.

notification_options	[w,u,c,r,f,s]
; Cette directive définit quand les notifications pour cet hôte doivent être envoyées. 
; Les options valides sont une combinaison d'une ou plusieurs des valeurs suivantes :
; w = warning
; u = UP
; c = CRITICAL   
; r = envoi de la notification pour le retour à la normale (état OK RECOVERY).
; f = mode "flap" 
; s = mode "stop" 
; Si vous spécifiez la valeur n (none), aucune notification ne sera envoyée.  

notifications_enabled	[0/1]
stalking_options	[o,d,u];
; utilisé en général pour un service OK / DOWN / UP 
; permet de notifier en limitant si besoin les états
; si vous sélectionnez que U, uniquement les notifications UP seront envoyées
; (Cette option n'est pas encore documenté pour un hôte).
; par défaut = none ou rien(vide).

contacts	contacts
contact_groups	contact_groups

stalking_options	[o,w,u,c]
; utilisé en général pour un service OK / DOWN / UP 
; permet de notifier en limitant si besoin les états
; si vous sélectionnez que U, uniquement les notifications UP seront envoyées
; (Cette option n'est pas encore documenté pour un hôte).
; par défaut = none ou rien(vide).

notes	note_string
notes_url	url

action_url	url

icon_image	image_file
icon_image_alt	alt_string
   	}

Définitions de services groupés (services-group.cfg) :

Ce fichier permet de regrouper les mêmes services pour une simplification de la configuration. Depuis je ne sais pas combien temps, mais dans la définition du service existe également l'option servicegroups. Certes elle peut être utilisée ici. Personnellement je préfère configurer les groupements au travers d'un fichier dédié à cela.

La configuration est très simple ici; pas de templates possibles. Il suffit de placer l'identification du service au niveau de l'option members. Chaque valeur doit être séparée par une virgule.

define servicegroup{
servicegroup_name http-services
alias   WEB Services
members web1,web2,Server,web3
}

Il est possible d'ajouter la variable servicegroup_members pour inclure un groupe dans ce groupe. Il est possible de faire une note également.

Définitions de contacts (contacts.cfg) :

Une définition de contact s'applique à la personne physique, qui doit être contactée en cas de problèmes sur le réseau. Les différents arguments possibles sont expliqués ci-dessous

###############################################################################
# CONTACTS.CFG - SAMPLE CONTACT/CONTACTGROUP DEFINITIONS
#
# NOTES: This config file provides you with some example contact and contact
#        group definitions that you can reference in host and service
#        definitions.
#       
#        You don't need to keep these definitions in a separate file from your
#        other object definitions.  This has been done just to make things
#        easier to understand.
#
###############################################################################
# Il est possible de faire encore plus fin :
#define contact{
#contact_name                  mdupont
#alias                         Moi Dupont
#host_notifications_enabled    1
#service_notifications_enabled 1
#service_notification_period   24x7
#host_notification_period      24x7
#service_notification_options  w,u,c,r
#host_notification_options     d,u,r
#service_notification_commands notify-by-email
#host_notification_commands    host-notify-by-email
#email                         mdupont@domain.fr
#pager                         456-7890@pager.domain.fr
#address1                      mdupont@icq.com
#address2                      545-565-5775
#can_submit_commands           1
#}

# 06 adresses MAX à utiliser avec la vaviable $CONTAC-TADDRESSx$ ou "x" est le n°

###############################################################################
###############################################################################
#
# CONTACTS
#
###############################################################################
###############################################################################

define contact{
        use		          generic-contact		; Inherit default values from generic-contact template (defined above)
        contact_name    paul		          ; Short name of user
        alias           Paul Linux Admin	; Full name of user
        email           paul@localhost	; 
        }

Définition d'un contact de groupe (contactgroups.cfg) :

Cette définition permet de regrouper un ou plusieurs contacts pour émettre des notifications. Quand un hôte ou un service à un problème ou se rétablit, Nagios recherche les groupes de contacts à qui envoyer des notifications, et les notifie. Ceci peut sembler complexe, mais dans la plupart des cas, ce ne le sera pas. On obtient ainsi une meilleure souplesse dans la définition de qui est notifié vis-à-vis d'un problème. Les différents arguments d'une définition de groupe de contacts sont détaillés ci-dessous.

define contactgroup{
	contactgroup_name		linux-admins
	alias			   Linux Administrators
	members			jdoe,robert,paul
	}

Définition d'un groupe d’hôtes (hostsgroup.cfg) :

Cette définition permet de regrouper un ou plusieurs hôtes pour simplifier la gestion, et simplifie l'affichage dans Nagios. Chaque hôte que vous définissez doit être membre d'au moins un groupe d'hôtes, même si c'est le seul hôte du groupe. Un hôte peut faire partie de plusieurs groupes. Quand un hôte est hors service, inaccessible, ou se rétablit, Nagios recherche les groupes dont cet hôte fait partie, en extrait chaque groupe de contacts, et les notifie. On obtient ainsi une meilleure souplesse.

# A list of your Debian GNU/Linux servers
define hostgroup {
    hostgroup_name  	debian-servers
		alias           Debian GNU/Linux Servers
		members         localhost, serveur, vm-debian
}

Définition des périodes horaires (timeperiods.cfg):

Une période est une liste de tranches horaires pour les différents jours de la semaine, qui sont "valides" pour l'envoi des notifications et les contrôles de service. Ces tranches sont elles-mêmes composées d'autres tranches de temps, pour chaque jour de la semaine. On ne peut pas définir d'exception. Par contre on peut utiliser l'option use pour inclure une déclaration qui fera exception sur des dates ou des horaires.

define timeperiod{
	name			us-holidays
        timeperiod_name         us-holidays
        alias                   U.S. Holidays

        january 1               00:00-00:00     ; New Years
        monday -1 may           00:00-00:00     ; Memorial Day (last Monday in May)
        july 4                  00:00-00:00     ; Independence Day
        monday 1 september      00:00-00:00     ; Labor Day (first Monday in September)
        thursday 4 november     00:00-00:00     ; Thanksgiving (4th Thursday in November)
        december 25             00:00-00:00     ; Christmas
}

# This defines a modified "24x7" timeperiod that covers every day of the
# year, except for U.S. holidays (defined in the timeperiod above).
define timeperiod{
        timeperiod_name 24x7_sans_holidays
        alias           24x7 Sans Holidays

	use		us-holidays		; va inclure les journées fériées.

        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éfinition de commandes (commands.cfg) :

Les commandes qu'on peut définir sont les contrôles de service, les notifications de service, les gestionnaires d'événements de services, les contrôles d'hôtes, les notifications d'hôtes, et les gestionnaires d'événements d'hôtes. Les définitions de commandes peuvent contenir des macros, mais vous devez vous assurer de n'utiliser que des macros "valides" dans le contexte de la commande. Les différents arguments d'une définition de commande sont détaillés ci-dessous.

###############################################################################
# COMMANDS.CFG - SAMPLE COMMAND DEFINITIONS FOR NAGIOS 3.99.96
#
#
# NOTES: This config file provides you with some example command definitions
#        that you can reference in host, service, and contact definitions.
#       
#        You don't need to keep commands in a separate file from your other
#        object definitions.  This has been done just to make things easier to
#        understand.
#
###############################################################################
# These are some example notification commands.  They may or may not work on
# your system without modification.  As an example, some systems will require 
# you to use "/usr/bin/mailx" instead of "/usr/bin/mail" in the commands below.
################################################################################


# '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" | /usr/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" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
}

################################################################################
#
# SAMPLE HOST CHECK COMMANDS
#
################################################################################

# This command checks to see if a host is "alive" by pinging it
# The check must result in a 100% packet loss or 5 second (5000ms) round trip 
# average time to produce a critical error.
# Note: Five ICMP echo packets are sent (determined by the '-p 5' argument)

# '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_local_disk' command definition
define command{
        command_name    check_local_disk
        command_line    $USER1$/check_disk -W 85 -C 90 -p $ARG1$ -u GB
}

# '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_temp-CPU' command definition
# voir manuel a l'interieur du script !!!
define command{
	command_name	check_local_temp
	command_line	$USER1$/check_temp.pl -s temp1 -w 65 -c 75
}

# '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$
#	}

################################################################################
# NOTE:  The following 'check_...' commands are used to monitor services on
#        both local and remote hosts.
################################################################################

# 'check_ftp' command definition
define command{
        command_name    check_ftp
        command_line    $USER1$/check_ftp -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$
}


#./check_mem.sh - Les valeurs W + C sont inscrites dans le plugin !!!
define command{
	command_name	check_mem
	command_line	$USER1$/check_mem1.sh -w 85 -c 90
}

################################################################################
#
# SAMPLE PERFORMANCE DATA COMMANDS - 2 Lignes coupées volontairement pour ce document !
#
################################################################################

# 'process-host-perfdata' command definition
define command{
	command_name	process-host-perfdata
	command_line	/usr/bin/printf "%b" "$LASTHOSTCHECK$\t$HOSTNAME$\t$HOSTSTATE$\t$HOSTATTEMPT$\t$HOSTSTATETYPE$\t$HOSTEXECUTIONTIME$\
	t$HOSTOUTPUT$\t$HOSTPERFDATA$\n" >> /var/nagios/host-perfdata.out
}


# 'process-service-perfdata' command definition
define command{
	command_name	process-service-perfdata
	command_line	/usr/bin/printf "%b" "$LASTSERVICECHECK$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICESTATE$\t$SERVICEATTEMPT$\t$SERVICESTATETYPE$\
	t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$\n" >> /var/nagios/service-perfdata.out
}

# Pour nagiosgraph configuration

define command {
  command_name process-service-perfdata-for-nagiosgraph
  command_line /usr/local/nagiosgraph/bin/insert.pl
}

Définition de dépendance de service (dependancies.cfg) :

Les définitions de dépendance du service sont une fonctionnalité avancée de Nagios qui permet de supprimer des notifications et des contrôles actifs, à partir de l'état d'un ou plusieurs services. Elles sont optionnelles et sont principalement destinées aux utilisateurs avertis qui ont des configurations de supervisions complexes.

define servicedependency{
host_name                       WEB
service_description             Apache HTTP
dependent_host_name             localhost
dependent_service_description   Main Web Site
execution_failure_criteria      n
notification_failure_criteria   w,u,c
}

Définition d'escalade de service (escalations.cfg) :

Une définition d'escalade pour un service est complètement optionnelle, et est utilisée pour notifier un ou plusieurs contacts différents de la première notification ou plus.

define serviceescalation{
host_name                act-1
service_description      Mail problem
first_notification       4
last_notification        0
notification_interval    15
contact                  postmaster@domain.fr
;contact_groups          admins,themanagers (optionnelle)
;escalation_period       24x7 (optionnelle)
}

Définition d'un groupe de services (servicegroups.cfg) :

Un groupe de services permet de rassembler plusieurs services ensemble pour pouvoir apparaître dans les CGIs. Très pratique lors d'une multitude de services testés.

# *******************************************************************
#  servicegroups.cfg
#
# Pour prise en compte ne pas oublier dans nagios.cfg,
# la mise a jour/ajout de cfg_file=/etc/nagios/servicegroups.cfg
# *******************************************************************

# service group >>> PING
define servicegroup{
servicegroup_name	    PING
alias			            Tests PING
members			          serveur,dm,nt1,switch1
}

# service group >>> HTTP
define servicegroup{
servicegroup_name	   HTTP
alias			           Test serveur WWW
members			         serveur,HTTP,dm,HTTP
}

# service group >>> MEM
define servicegroup{
servicegroup_name	  MEMOIRE
alias			          Mémoire utilisé
members			        serveur,MEM
}

Définition d'informations sur les hôtes (hostextinfo.cfg) :

Ce fichier est obsolète avec la version 4.0.x ! (nouveau). Ses paramètres identiques sont à inclure désormais avec la définition de l'hôte (Cf chap.hosts).

Définition des templates (templates.cfg)

Les templates apportent une souplesse dans la configuration des paramètres pour les hôtes et les services. Il est nécessaire de créer d'abord votre modèle, exemple generic-contact puis de configurer avec précision tous les paramètres communs de vos hôtes. Les paramètres spécifiques pour chaque hôte seront définis lors des déclarations. Il va de soi que les fichiers de configuration sont plus compacts et plus faciles à comprendre en utilisant les templates.

L’utilisation est simple : d'abord il faut que votre modèle(template) soit conforme à vos réglages. Ensuite vous pouvez définir des paramètres particuliers au travers de cette configuration (exemple):

define host{
        name     linux-server       ; Le nom du template
        use      generic-host       ; Le nom d'un template qui sert également pour compléter les définitions.
        ...
    

###############################################################################
# TEMPLATES.CFG - SAMPLE OBJECT TEMPLATES
#
# NOTES: This config file provides you with some example object definition
#        templates that are refered by other host, service, contact, etc.
#        definitions in other config files.
#
#        You don't need to keep these definitions in a separate file from your
#        other object definitions.  This has been done just to make things
#        easier to understand.
#
###############################################################################
###############################################################################
#
# CONTACT TEMPLATES
#
###############################################################################
###############################################################################

# Generic contact definition template - This is NOT a real contact, just a template!

define contact{
        name                            generic-contact    ; The name of this contact template
        service_notification_period     24x7               ; Période de notification pour le service
        host_notification_period        24x7               ; Période de notification pour l'hôte
        service_notification_options    w,u,c,r,f,s        ; Prise en compte des statut pour les notifications (services)
        host_notification_options       d,u,r,f,s          ; Prise en compte des statut pour les notifications (hôtes)
        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!
        }

###############################################################################
###############################################################################
#
# HOST TEMPLATES
#
###############################################################################
###############################################################################

# Generic host definition template - This is NOT a real host, just a template!

define host{
        name                            generic-host    
        notifications_enabled           1       ; Host notifications are enabled
        event_handler_enabled           1       ; Host event handler is enabled
        flap_detection_enabled          1       ; Flap detection 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_period                    24x7    ; By default, Linux hosts are checked round the clock
                check_command           check-host-alive    ; la commande pour le test
                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!
        }

# Linux host definition template - This is NOT a real host, just a template!

define host{
        name                            linux-server       ; The name of this host template
        use                             generic-host       ; This template inherits other values from the generic-host template
        check_period                    24x7               ; By default, Linux hosts are checked round the clock
        check_interval                  5                  ; Actively check the host every 5 minutes
        retry_interval                  1                  ; Schedule host check retries at 1 minute intervals
        max_check_attempts              10                 ; Check each Linux host 10 times (max)
        check_command                   check-host-alive   ; Default command to check Linux hosts
        notification_period             24x7               ; 
        notification_interval           60                 ; Resend notifications / 60 mn
        notification_options            d,u,r              ; Only send notifications for specific host states
        contact_groups                  admins             ; Notifications get sent to the admins by default
        register                        0                  ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
}

# Define a template for switches that we can reuse
define host{
        name                            generic-switch    ; The name of this host template
        use                             generic-host      ; Inherit default values from the generic-host template
        check_period                    24x7              ; By default, switches are monitored round the clock
        check_interval                  5                 ; Switches are checked every 5 minutes
        retry_interval                  1                 ; Schedule host check retries at 1 minute intervals
        max_check_attempts              10                ; Check each host 10 times (max)
        check_command                   check-host-alive  ; Default command to check if routers are "alive"
        notification_period             24x7              ; Send notifications at any time
        notification_interval           30                ; Resend notifications every 30 minutes
        notification_options            d,r               ; Only send notifications for specific host states
        contact_groups                  admins            ; Notifications get sent to the admins by default
        register                        0                 ; DONT REGISTER THIS - ITS JUST A TEMPLATE
}

###############################################################################
###############################################################################
#
# SERVICE TEMPLATES
#
###############################################################################
###############################################################################

# Generic service definition template - This is NOT a real service, just a template!

# generic service template definition
define service{
        name                            generic-service ; The 'name' of this service template
        active_checks_enabled           1               ; Test actif (via Nagios)
        passive_checks_enabled          0               ; Test passif (via NRPE/nsclient...)
        parallelize_check               1               ; Active service checks should be parallelized (disabling this can lead to major performance problems)
        obsess_over_service             0               ; We should obsess over this service (if necessary)
        check_freshness                 0               ; A utiliser via des plugins externes (NSCDA)
        notifications_enabled           1               ; Les notifications sont actives
        event_handler_enabled           1               ; Le gestionnaire d’événement est il active
        flap_detection_enabled          1               ; "Flap" ou qui oscille
        process_perf_data               1               ; Data complémentaire (souvent utilise dans les graphes)
        retain_status_information       1               ; garde en rétention les données (re demarrage de Nagios)
        retain_nonstatus_information    1               ; Nagios peut garder en retention des variables de conf, si problème il faut placer cette valeur à zero
        notification_interval           0               ; Notifications sur changement de statut.
        is_volatile                     0               ;
        check_period                    24x7            ; période de tests/notification
        normal_check_interval           5               ; Toutes les 5 mn
        retry_check_interval            1               ; test /1 mn après changement d'etat  (voir avec "interval length")
        max_check_attempts              1               ; Nbr de fois que Nagios va tenter de contrôler l’hôte si l’état est NOK, suivi d'une notification. Vide=rien
        notification_period             24x7
        notification_options            w,u,c,r
        contact_groups                  admins
        register                        0               ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
}

# Local service definition template - This is NOT a real service, just a template!

define service{
        name                            local-service       ; The name of this service template
        use                             generic-service     ; Inherit default values from the generic-service definition
        max_check_attempts              4                   ; Re-check the service up to 4 times in order to determine its final (hard) state
        normal_check_interval           5                   ; Check the service every 5 minutes under normal conditions
        retry_check_interval            1                   ; Re-check the service every minute until a hard state can be determined
        register                        0                   ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
}

Chapter 6. Compiler et installer NRPE

Son utilisation

Son utilisation est simple : à savoir que ce serveur est destiné à Gnu/Linux. Il n'est pas possible d'interroger des services sur une machine distante sans un additif quelconque. Il existe pour Nagios une formule via SSH qui fonctionne, mais aussi via NRPE. C'est cette formule qui sera utilisée et expliquée. Le serveur Nagios demandera au serveur client de réaliser des commandes à sa place, et de lui retourner les résultats. Les commandes, vers le serveur NRPE, peuvent comporter des arguments. Les arguments peuvent être définis avec précision au niveau du client. C'est aussi cette solution que j'ai adoptée. Dans un premier temps, elle évite de surcharger Nagios par des paramètres spécifiques, alors qu'une commande générique suffit. Au niveau de la sécurité, le transfert de ces variables peut poser un problème, surtout si vous n'utilisez pas SSL (comme moi).

Au sujet de SSL, NRPE peut communiquer avec ce protocole pour sécuriser les connexions. Personnellement je n'ai pas opté pour cette solution.

Compilation

Pour télécharger : Sourceforge-NRPE.

Il faut se placer dans le répertoire puis lancer la compilation via cette commande :

./configure --prefix=/usr/local/nagios --localstatedir=/var/nagios --sysconfdir=/etc/nagios \
 --with-nrpe-user=nagios --with-nrpe-grp=nagioscmd --infodir=/usr/share/info --mandir=/usr/share/man \
 --with-ssl=/usr/bin/openssl --with-ssl-lib=/usr/lib/x86_64-linux-gnu

La dernière ligne est importante surtout si rencontrez l'erreur suivante :

checking for SSL libraries... configure: error: Cannot find ssl libraries

Tout est mentionné :

*** Generating DH Parameters for SSL/TLS ***
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
........................+.......+........+......+........+...+..........+......++*++*++*++*++*++*
checking for Kerberos include files... could not find include files
checking for perl... /usr/bin/perl
configure: creating ./config.status
config.status: creating Makefile
config.status: creating subst
config.status: creating src/Makefile
config.status: creating package/solaris/Makefile
config.status: creating init-script
config.status: creating init-script.debian
config.status: creating init-script.suse
config.status: creating nrpe.spec
config.status: creating sample-config/nrpe.cfg
config.status: creating sample-config/nrpe.xinetd
config.status: creating include/config.h
config.status: include/config.h is unchanged
configure: WARNING: unrecognized options: --with-nrpe-grp

*** Configuration summary for nrpe 2.14 12-21-2012 ***:

 General Options:
 -------------------------
 NRPE port:    5666
 NRPE user:    nagios
 NRPE group:   nagios
 Nagios user:  nagios
 Nagios group: nagios

Ensuite il faut lancer la commande make all && make install plugin && make install-daemon && make install-daemon-config && , cette étape est rapide. Après et manuellement il faut copier les exécutables qui se trouvent dans le répertoire src vers le répertoire suivant: (/usr/local/nagios/bin).

La configuration

J'avoue avoir passé un certain temps avant d'apercevoir mes états en OK. En se servant de mes fichiers cette étape est courte.

Le fichier /etc/default/nagios-nrpe-server

Ce fichier est facile à régler, il ne pose pas de problème.

# defaults file for nagios-nrpe-server
# (this file is a /bin/sh compatible fragment)

# DAEMON_OPTS 
#       -n = sans SSL
DAEMON_OPTS="-n"

NICENESS=5

# INETD is if you want to run the server via inetd (default=0, run as daemon)
INETD=0

Le fichier /etc/nagios/nrpe.cfg

Ce fichier a été l'un de mes problèmes. Avec une Debian en version 7, la commande sudo n'est plus incluse par défaut. Le fichier /etc/sudousers est donc également absent; en conséquence il ne faut pas activer la ligne # command_prefix=/usr/bin/sudo , au risque de voir le message Unable to read output. Le cas échéant il suffit d'abord de tester sans la commande sudo puis adapter ou pas.

Rien de bien spécial dans ce fichier, il est important de tester les commandes avant de les placer définitivement. Au moindre problème, il faut passer en mode débogage et rechercher l'erreur. NRPE utilise le fichier/etc/hosts.allow, il est donc recommandé d'y placer l'adresse IP du serveur Nagios.

NRPE écrit toutes ses historiques dans le fichier /var/log/syslog, pour mémoire.

#############################################################################
# Sample NRPE Config File 
# Written by: Ethan Galstad (nagios@nagios.org)
# 
# Last Modified: 11-23-2007
#
# NOTES:
# This is a sample configuration file for the NRPE daemon.  It needs to be
# located on the remote host that is running the NRPE daemon, not the host
# from which the check_nrpe client is being executed.
#############################################################################

# LOG FACILITY
log_facility=daemon

# PID FILE
pid_file=/run/nagios/nrpe.pid

# PORT NUMBER vérifier/modifier le fichier /etc/services si besoin
server_port=5666

# SERVER ADDRESS
# Adresse  IP du serveur, chaque client de Nagios est serveur NRPE, c'est l'@IP d'écoute donc pas "127.0.0.1"

server_address=192.168.1.4

# NRPE USER
nrpe_user=nagios
nrpe_group=nagios

# NOTE: c'est l'@IP de nagios, pour plusieurs IP il faut placer une virgule
# possible 192.168.1.0/24
allowed_hosts=192.168.1.2
 
# COMMAND ARGUMENT PROCESSING
# Values: 0=SANS prise en compte de paramètre, 1= AVEC prise en compte

dont_blame_nrpe=0

# COMMAND PREFIX SUDO
#
# nagios          ALL=(ALL) NOPASSWD: /usr/lib/nagios/plugins/
#
# command_prefix=/usr/bin/sudo 

# DEBUGGING OPTION
# Values: 0=debugging off, 1=debugging on

debug=0

# COMMAND TIMEOUT
# This specifies the maximum number of seconds that the NRPE daemon will
# allow plugins to finish executing before killing them off.
command_timeout=60

# CONNECTION TIMEOUT
connection_timeout=300

# WEEK RANDOM SEED OPTION
# This directive allows you to use SSL even if your system does not have
# a /dev/random or /dev/urandom (on purpose or because the necessary patches
# were not applied). The random number generator will be seeded from a file
# which is either a file pointed to by the environment valiable $RANDFILE
# or $HOME/.rnd. If neither exists, the pseudo random number generator will
# be initialized and a warning will be issued.
# Values: 0=only seed from /dev/[u]random, 1=also seed from weak randomness

#allow_weak_random_seed=1

# INCLUDE CONFIG FILE
# This directive allows you to include definitions from an external config file.

#include=somefile.cfg

# INCLUDE CONFIG DIRECTORY
# This directive allows you to include definitions from config files (with a
# .cfg extension) in one or more directories (with recursion).

#include_dir=somedirectory
#include_dir=someotherdirectory

# COMMAND DEFINITIONS
#
# Voici des exemples, ne pas hésiter à tester sur la machine pour les réglages...

command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10
command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
command[check_disk]=/usr/lib/nagios/plugins/check_disk -u GB -c 10% -p / -p /var -p /home
# command[check_var]=/usr/lib/nagios/plugins/check_disk -w GB -c 10% -p /var
command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200 
command[check_http]=/usr/lib/nagios/plugins/check_http_status -w 1 -c 2 -H 127.0.0.1

# The following examples allow user-supplied arguments and can
# only be used if the NRPE daemon was compiled with support for 
# command arguments *AND* the dont_blame_nrpe directive in this
# config file is set to '1'.  This poses a potential security risk, so
# make sure you read the SECURITY file before doing this.

#command[check_users]=/usr/lib/nagios/plugins/check_users -w $ARG1$ -c $ARG2$
#command[check_load]=/usr/lib/nagios/plugins/check_load -w $ARG1$ -c $ARG2$
#command[check_disk]=/usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
#command[check_procs]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$

#
# local configuration:
#	if you'd prefer, you can instead place directives here

#include=/etc/nagios/nrpe_local.cfg

# 
# you can place your config snipplets into nrpe.d/
# only snipplets ending in .cfg will get included

#include_dir=/etc/nagios/nrpe.d/

Lancer NRPE

En regardant de prés l'exécutable NRPE, pour inhiber le protocole SSL il faut utiliser le paramètre -n, et non --no-ssl.

NRPE - Nagios Remote Plugin Executor
Copyright (c) 1999-2008 Ethan Galstad (nagios@nagios.org)
Version: 2.14
Last Modified: 12-21-2012
License: GPL v2 with exemptions (-l for more info)
SSL/TLS Available: Anonymous DH Mode, OpenSSL 0.9.6 or higher required

***************************************************************
** POSSIBLE SECURITY RISK - TCP WRAPPERS ARE NOT AVAILABLE!  **
**      Read the NRPE SECURITY file for more information     **
***************************************************************

Usage: nrpe [-n] -c config_file mode
Options:
 -n            = Do not use SSL
   config_file = Name of config file to use
   mode        = One of the following operating modes:
   -i          =    Run as a service under inetd or xinetd
   -d          =    Run as a standalone daemon
   -d -s       =    Run as a subsystem under AIX

NRPE coté Nagios

C'est bien le coté le plus simple ! Il faut installer les plugins spéciaux nrpeet c'est tout. Ceci peut-être fait via la commande apt-get install nagios-nrpe-plugin. Celui ci installe juste un script supplémentaire qui servira par la suite check_nrpe, et divers fichiers.

Parmi les fichiers installés il existe de quoi prendre en compte la commande check_nrpe par le fichier classique command.cfg. Voici ce qu'il faut ajouter :

###############################################################################
#     N R P E
# nrpe sans ssl
define command{
        command_name check_nrpe
        command_line $USER1$/check_nrpe -n -H $HOSTADDRESS$ -c $ARG1$
}
################################################################################

Il reste à placer les commandes au niveau des services, ce qui donne en exemple :

################### N R P E #######################
define service{
       use                          generic-service
       host_name                    vm-debian
       service_description          HDD libre
       check_command                check_nrpe!check_disk
       contact_groups               admins
}

define service{
       use                          generic-service
       host_name                    vm-debian
       service_description          Charge
       check_command                check_nrpe!check_load
       contact_groups               admins
}

Donc rien de très compliqué, les commandes sont simples car je ne passe aucun argument: c'est le client qui fait tout. On relance Nagios. Maintenant je peux superviser toutes les machines Gnu/Linux. Il est temps de passer à du similaire mais pour Windows.

Chapter 7. NsClient

Téléchargement et installation

Après plusieurs recherches, il existe un site dédié à ce projet: http://nsclient.org/nscp/. Le site est bien fait il est possible de trouver la dernière version, et de la documentation.

Pour télécharger il faut choisir parmi les versions disponibles ici : http://nsclient.org/nscp/downloads. Vous avez le choix entre les formats .msi et .zip en version 32 ou 64 bits. Une fois sur l'hôte windows, il faut installer ce package. J'ai personnellement choisi une installation via un fichier en .msi, cette étape est propre et ne pose aucun problème. Un menu est créé pour la gestion de Nsclient.

Il faut vérifier que le service NSClient++ (Win32) démarre automatiquement. Il est aussi possible d'utiliser les menus. Ensuite à vous de régler le fichier nsclient.ini afin d'éviter qu'il charge tout inutilement. Je n'ai rien fait d'autre, les 3 tests que je fais sur la mémoire, la charge CPU et l'état des disques durs fonctionnent. Néanmoins les retours d'informations sont à mes yeux légers. J'aurais aimé plus d'informations.

Mon choix s'est donc porté sur le système NRPE que j'utilise déjà pour autre chose. Il est simple à configurer. Il correspond bien à mes demandes.

Vis-à-vis des plateformes Microsoft, je pense qu'il est possible de faire mieux.

Voici mon fichier d'initialisation :

# If you want to fill this file with all avalible options run the following command:
#   nscp settings --generate --add-defaults --load-all
# If you want to activate a module and bring in all its options use:
#   nscp settings --activate-module <MODULE NAME> --add-defaults
# For details run: nscp settings --help
# fichier : nsclient.ini

; Undocumented section
[/modules]

; CheckDisk - CheckDisk can check various file and disk related things. The current version has commands to check Size of hard drives and directories.
CheckDisk = 1

; Event log Checker. - Check for errors and warnings in the event log. This is only supported through NRPE so if you plan to use only NSClient this wont help you at all.
CheckEventLog = 1

; Check External Scripts - A simple wrapper to run external scripts and batch files.
CheckExternalScripts = 1

; Helper function - Various helper function to extend other checks. This is also only supported through NRPE.
CheckHelpers = 1

; Check NSCP - Checkes the state of the agent
CheckNSCP = 0

; CheckSystem - Various system related checks, such as CPU load, process state, service state memory usage and PDH counters.
CheckSystem = 1

; CheckWMI - CheckWMI can check various file and disk related things. The current version has commands to check Size of hard drives and directories.
CheckWMI = 1

; NRPE server - A simple server that listens for incoming NRPE connection and handles them.
NRPEServer = 1

; NSClient server - A simple server that listens for incoming NSClient (check_nt) connection and handles them. 
; Although NRPE is the preferred method NSClient is fully supported and can be used for simplicity or for compatibility.
NSClientServer = 0

; Undocumented section
[/settings/default]

; ALLOWED HOSTS - A comaseparated list of allowed hosts. You can use netmasks (/ syntax) or * to create ranges.
allowed hosts = 192.168.1.2

; PASSWORD - Password used to authenticate againast server
password = mypass

; A list of aliases available. An alias is an internal command that has been "wrapped" (to add arguments). 
; Be careful so you don't create loops (ie check_loop=check_a, check_a=check_loop)
[/settings/external scripts/alias]

; alias_cpu - Alias for alias_cpu. To configure this item add a section called: /settings/external scripts/alias/alias_cpu
alias_cpu = checkCPU warn=80 crit=90 time=5m time=1m time=30s

; alias_cpu_ex - Alias for alias_cpu_ex. To configure this item add a section called: /settings/external scripts/alias/alias_cpu_ex
;alias_cpu_ex = checkCPU warn=$ARG1$ crit=$ARG2$ time=5m time=1m time=30s

; alias_disk - Alias for alias_disk. To configure this item add a section called: /settings/external scripts/alias/alias_disk
alias_disk = CheckDriveSize MinWarn=10% MinCrit=5% CheckAll FilterType=FIXED

; alias_disk_loose - Alias for alias_disk_loose. To configure this item add a section called: /settings/external scripts/alias/alias_disk_loose
;alias_disk_loose = CheckDriveSize MinWarn=10% MinCrit=5% CheckAll FilterType=FIXED ignore-unreadable

; alias_event_log - Alias for alias_event_log. To configure this item add a section called: /settings/external scripts/alias/alias_event_log
; alias_event_log = CheckEventLog file=application file=system MaxWarn=1 MaxCrit=1 "filter=generated gt -2d AND 
; severity NOT IN ('success', 'informational') AND source != 'SideBySide'" truncate=800 unique descriptions "syntax=%severity%: %source%: %message% (%count%)"

; alias_file_age - Alias for alias_file_age. To configure this item add a section called: /settings/external scripts/alias/alias_file_age
;alias_file_age = checkFile2 filter=out "file=$ARG1$" filter-written=>1d MaxWarn=1 MaxCrit=1 "syntax=%filename% %write%"

; alias_file_size - Alias for alias_file_size. To configure this item add a section called: /settings/external scripts/alias/alias_file_size
;alias_file_size = CheckFiles "filter=size > $ARG2$" "path=$ARG1$" MaxWarn=1 MaxCrit=1 "syntax=%filename% %size%" max-dir-depth=10

; alias_mem - Alias for alias_mem. To configure this item add a section called: /settings/external scripts/alias/alias_mem
alias_mem = checkMem MaxWarn=80% MaxCrit=90% ShowAll=long type=physical type=virtual type=paged type=page

; alias_process - Alias for alias_process. To configure this item add a section called: /settings/external scripts/alias/alias_process
alias_process = checkProcState "$ARG1$=started"

; alias_process_count - Alias for alias_process_count. To configure this item add a section called: /settings/external scripts/alias/alias_process_count
alias_process_count = checkProcState MaxWarnCount=$ARG2$ MaxCritCount=$ARG3$ "$ARG1$=started"

; alias_process_hung - Alias for alias_process_hung. To configure this item add a section called: /settings/external scripts/alias/alias_process_hung
;alias_process_hung = checkProcState MaxWarnCount=1 MaxCritCount=1 "$ARG1$=hung"

; alias_process_stopped - Alias for alias_process_stopped. To configure this item add a section called: /settings/external scripts/alias/alias_process_stopped
;alias_process_stopped = checkProcState "$ARG1$=stopped"

; alias_sched_all - Alias for alias_sched_all. To configure this item add a section called: /settings/external scripts/alias/alias_sched_all
;alias_sched_all = CheckTaskSched "filter=exit_code ne 0" "syntax=%title%: %exit_code%" warn=>0

; alias_sched_long - Alias for alias_sched_long. To configure this item add a section called: /settings/external scripts/alias/alias_sched_long
;alias_sched_long = CheckTaskSched "filter=status = 'running' AND most_recent_run_time <-$ARG1$" "syntax=%title% (%most_recent_run_time%)" warn=>0

; alias_sched_task - Alias for alias_sched_task. To configure this item add a section called: /settings/external scripts/alias/alias_sched_task
;alias_sched_task = CheckTaskSched "filter=title eq '$ARG1$' AND exit_code ne 0" "syntax=%title% (%most_recent_run_time%)" warn=>0

; alias_service - Alias for alias_service. To configure this item add a section called: /settings/external scripts/alias/alias_service
alias_service = checkServiceState CheckAll

; alias_service_ex - Alias for alias_service_ex. To configure this item add a section called: /settings/external scripts/alias/alias_service_ex
alias_service_ex = checkServiceState CheckAll "exclude=Net Driver HPZ12" "exclude=Pml Driver HPZ12" exclude=stisvc

; alias_up - Alias for alias_up. To configure this item add a section called: /settings/external scripts/alias/alias_up
alias_up = checkUpTime MinWarn=1d MinWarn=1h

; alias_updates - Alias for alias_updates. To configure this item add a section called: /settings/external scripts/alias/alias_updates
alias_updates = check_updates -warning 0 -critical 0

; alias_volumes - Alias for alias_volumes. To configure this item add a section called: /settings/external scripts/alias/alias_volumes
alias_volumes = CheckDriveSize MinWarn=10% MinCrit=5% CheckAll=volumes FilterType=FIXED

; alias_volumes_loose - Alias for alias_volumes_loose. To configure this item add a section called: /settings/external scripts/alias/alias_volumes_loose
alias_volumes_loose = CheckDriveSize MinWarn=10% MinCrit=5% CheckAll=volumes FilterType=FIXED ignore-unreadable 

; default - Alias for default. To configure this item add a section called: /settings/external scripts/alias/default
default = 

Et voici le retour des tests du coté de Nagios :

 OK CPU Load ok. 
 OK: All drives within bounds. 
 OK: physical memory:Total: 2.97G-Used: 376M(12%)-Free: 2.6G(88%),virtual memory:Total:2G-Used:250M(12%)-Free:1.76G(88%),page file:Total:4.81G-Used:266M(5%)-Free:4.55G(95%)
    

A l'exception de la dernière ligne qui est trop complète, les autres tests ne retournent pas grand chose de précis.

Chapter 8. Le format graphique GD2

Table of Contents

Ce format est utilisé par plusieurs applications, dont Nagios™, mais hélas pas par Gimp™. Il est nécessaire d'utiliser un paquet supplémentaire libgd-tools. Une fois ce paquet installé, vous avez accès à la commande pngtogd2.

Voici un exemple :

pngtogd2 file.png file.gd2 0 1

Il est indiqué que l'utilisation du format GD2 est préférable pour Nagios? Ceci lui permet un traitement plus rapide. Son utilisation possible hormis l'image de fond comprise dans le fichier cgi.cfg est faisable dans la définition des hosts, ce qui donne icon_image exemple.png et statusmap_image exemple.gd2

Chapter 9. Nagios et Vmware (ESXi)

Table of Contents

Les dépendances :

En se rendant sur le site de Nagios exchange-vmware exchange et en cherchant des plugins pour Vmware™ on peut percevoir qu'il en existe de nombreux. J'ai regardé avec attention tous les plugins intéressants. Un seul a vraiment attiré mon attention : il s'agit de ce projet : Vmware ESX & VM host; il a pour moi l'avantage de rassembler beaucoup de commandes. Le script est maintenu par la société OP5. Hélas pour moi faute d'un Vcenter proche, je n'ai pas pu le tester.

Les dépendances :

Ce n'est pas forcément le plugin le plus simple à installer, il est nécessaire d'installer tout çà :

apt-get install libmath-calc-units-perl libclass-methodmaker-perl libnagios-object-perl libnagios-plugin-perl libnet-ssleay-perl \
 libcompress-zlib-perl libhtml-parser-perl liburi-perl libconfig-tiny-perl libparams-validate-perl libconvert-units-perl

Une fois ceci installé, il est temps d'aller chercher les sources du plugin via cette commande :

git clone git://git.op5.org/nagios/op5plugins.git op5plugins

Placez vous dans le répertoire op5plugins: il suffit de récupérer le plugin check_vmware_api.pl, puis de le placer parmi les autres plugins. Il existe une page sur le site d'OP5 qui explique tout cela : https://kb.op5.com/pages/viewpage.action?pageId=3801484

Usage: %s -D <data_center> | -H <host_name> [ -C <cluster_name> ] [ -N <vm_name> ]
  -u <user> -p <pass> | -f <authfile>"
  -l <command> [ -s <subcommand> ] [ -T <timeshift> ] [ -i <interval> ]"
  [ -x <black_list> ] [ -o <additional_options> ]"
  [ -t <timeout> ] [ -w <warn_range> ] [ -c <crit_range> ]"
  [ -V ] [ -h ]',

La version allongée de toutes ces commandes nous montrent ces vastes possibilités :

 ."    VM specific :"
   * cpu - shows cpu info"
       + usage - CPU usage in percentage"
       + usagemhz - CPU usage in MHz"
       + wait - CPU wait time in ms"
       + ready - CPU ready time in ms"
       ^ all cpu info(no thresholds)"
   * mem - shows mem info"
       + usage - mem usage in percentage"
       + usagemb - mem usage in MB"
       + swap - swap mem usage in MB"
       + swapin - swapin mem usage in MB"
       + swapout - swapout mem usage in MB"
       + overhead - additional mem used by VM Server in MB"
       + overall - overall mem used by VM Server in MB"
       + active - active mem usage in MB"
       + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning"
       ^ all mem info(except overall and no thresholds)"
   * net - shows net info"
       + usage - overall network usage in KBps(Kilobytes per Second)"
       + receive - receive in KBps(Kilobytes per Second)"
       + send - send in KBps(Kilobytes per Second)"
       ^ all net info(except usage and no thresholds)"
   * io - shows disk I/O info"
       + usage - overall disk usage in MB/s"
       + read - read latency in ms (totalReadLatency.average)"
       + write - write latency in ms (totalWriteLatency.average)"
       ^ all disk io info(no thresholds)"
   * runtime - shows runtime info"
       + con - connection state"
       + cpu - allocated CPU in MHz"
       + mem - allocated mem in MB"
       + state - virtual machine state (UP, DOWN, SUSPENDED)"
       + status - overall object status (gray/green/red/yellow)"
       + consoleconnections - console connections to VM"
       + guest - guest OS status, needs VMware Tools"
       + tools - VMWare Tools status"
       + issues - all issues for the host"
       ^ all runtime info(except con and no thresholds)"
     Host specific :"
   * cpu - shows cpu info"
       + usage - CPU usage in percentage"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       + usagemhz - CPU usage in MHz"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       ^ all cpu info"
           o quickstats - switch for query either PerfCounter values or Runtime info"
   * mem - shows mem info"
       + usage - mem usage in percentage"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       + usagemb - mem usage in MB"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       + swap - swap mem usage in MB"
           o listvm - turn on/off output list of swapping VM's"
       + overhead - additional mem used by VM Server in MB"
       + overall - overall mem used by VM Server in MB"
       + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning"
           o listvm - turn on/off output list of ballooning VM's"
       ^ all mem info(except overall and no thresholds)"
   * net - shows net info"
       + usage - overall network usage in KBps(Kilobytes per Second)"
       + receive - receive in KBps(Kilobytes per Second)"
       + send - send in KBps(Kilobytes per Second)"
       + nic - makes sure all active NICs are plugged in"
       ^ all net info(except usage and no thresholds)"
   * io - shows disk io info"
       + aborted - aborted commands count"
       + resets - bus resets count"
       + read - read latency in ms (totalReadLatency.average)"
       + write - write latency in ms (totalWriteLatency.average)"
       + kernel - kernel latency in ms"
       + device - device latency in ms"
       + queue - queue latency in ms"
       ^ all disk io info"
   * vmfs - shows Datastore info"
       + (name) - free space info for datastore with name (name)"
           o used - output used space instead of free"
           o breif - list only alerting volumes"
           o regexp - whether to treat name as regexp"
           o blacklistregexp - whether to treat blacklist as regexp"
           x - blacklist VMFS's"
           T (value) - timeshift to detemine if we need to refresh"
       ^ all datastore info"
           o used - output used space instead of free"
           o breif - list only alerting volumes"
           o blacklistregexp - whether to treat blacklist as regexp"
           x - blacklist VMFS's"
           T (value) - timeshift to detemine if we need to refresh"
   * runtime - shows runtime info"
       + con - connection state"
       + health - checks cpu/storage/memory/sensor status"
           o listitems - list all available sensors(use for listing purpose only)"
           o blackregexpflag - whether to treat blacklist as regexp"
           x - blacklist status objects"
       + storagehealth - storage status check"
           o blackregexpflag - whether to treat blacklist as regexp"
           x - blacklist status objects"
       + temperature - temperature sensors"
           o blackregexpflag - whether to treat blacklist as regexp"
           x - blacklist status objects"
       + sensor - threshold specified sensor"
       + maintenance - shows whether host is in maintenance mode"
       + list(vm) - list of VMWare machines and their statuses"
       + status - overall object status (gray/green/red/yellow)"
       + issues - all issues for the host"
           x - blacklist issues"
       ^ all runtime info(health, storagehealth, temperature and sensor are represented as one value and no thresholds)"
   * service - shows Host service info"
       + (names) - check the state of one or several services specified by (names), syntax for (names):<service1>,<service2>,...,<serviceN>"
       ^ show all services"
   * storage - shows Host storage info"
       + adapter - list bus adapters"
           x - blacklist adapters"
       + lun - list SCSI logical units"
           x - blacklist LUN's"
       + path - list logical unit paths"
           x - blacklist paths"
       ^ show all storage info"
   * uptime - shows Host uptime"
           o quickstats - switch for query either PerfCounter values or Runtime info"
   * device - shows Host specific device info"
       + cd/dvd - list vm's with attached cd/dvd drives"
           o listall - list all available devices(use for listing purpose only)"
     DC specific :"
   * cpu - shows cpu info"
       + usage - CPU usage in percentage"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       + usagemhz - CPU usage in MHz"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       ^ all cpu info"
           o quickstats - switch for query either PerfCounter values or Runtime info"
   * mem - shows mem info"
       + usage - mem usage in percentage"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       + usagemb - mem usage in MB"
           o quickstats - switch for query either PerfCounter values or Runtime info"
       + swap - swap mem usage in MB"
       + overhead - additional mem used by VM Server in MB"
       + overall - overall mem used by VM Server in MB"
       + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning"
       ^ all mem info(except overall and no thresholds)"
   * net - shows net info"
       + usage - overall network usage in KBps(Kilobytes per Second)"
       + receive - receive in KBps(Kilobytes per Second)"
       + send - send in KBps(Kilobytes per Second)"
       ^ all net info(except usage and no thresholds)"
   * io - shows disk io info"
       + aborted - aborted commands count"
       + resets - bus resets count"
       + read - read latency in ms (totalReadLatency.average)"
       + write - write latency in ms (totalWriteLatency.average)"
       + kernel - kernel latency in ms"
       + device - device latency in ms"
       + queue - queue latency in ms"
       ^ all disk io info"
   * vmfs - shows Datastore info"
       + (name) - free space info for datastore with name (name)"
           o used - output used space instead of free"
           o breif - list only alerting volumes"
           o regexp - whether to treat name as regexp"
           o blacklistregexp - whether to treat blacklist as regexp"
           x - blacklist VMFS's"
           T (value) - timeshift to detemine if we need to refresh"
       ^ all datastore info"
           o used - output used space instead of free"
           o breif - list only alerting volumes"
           o blacklistregexp - whether to treat blacklist as regexp"
           x - blacklist VMFS's"
           T (value) - timeshift to detemine if we need to refresh"
   * runtime - shows runtime info"
       + list(vm) - list of VMWare machines and their statuses"
       + listhost - list of VMWare esx host servers and their statuses"
       + listcluster - list of VMWare clusters and their statuses"
       + tools - VMWare Tools status"
           x - blacklist VM's"
       + status - overall object status (gray/green/red/yellow)"
       + issues - all issues for the host"
           x - blacklist issues"
       ^ all runtime info(except cluster and tools and no thresholds)"
   * recommendations - shows recommendations for cluster"
       + (name) - recommendations for cluster with name (name)"
       ^ all clusters recommendations"
     Cluster specific :"
   * cpu - shows cpu info"
       + usage - CPU usage in percentage"
       + usagemhz - CPU usage in MHz"
       ^ all cpu info"
   * mem - shows mem info"
       + usage - mem usage in percentage"
       + usagemb - mem usage in MB"
       + swap - swap mem usage in MB"
           o listvm - turn on/off output list of swapping VM's"
       + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning"
           o listvm - turn on/off output list of ballooning VM's"
       ^ all mem info(plus overhead and no thresholds)"
   * cluster - shows cluster services info"
       + effectivecpu - total available cpu resources of all hosts within cluster"
       + effectivemem - total amount of machine memory of all hosts in the cluster"
       + failover - VMWare HA number of failures that can be tolerated"
       + cpufainess - fairness of distributed cpu resource allocation"
       + memfainess - fairness of distributed mem resource allocation"
       ^ only effectivecpu and effectivemem values for cluster services"
   * runtime - shows runtime info"
       + list(vm) - list of VMWare machines in cluster and their statuses"
       + listhost - list of VMWare esx host servers in cluster and their statuses"
       + status - overall cluster status (gray/green/red/yellow)"
       + issues - all issues for the cluster"
           x - blacklist issues"
       ^ all cluster runtime info"
   * vmfs - shows Datastore info"
       + (name) - free space info for datastore with name (name)"
           o used - output used space instead of free"
           o breif - list only alerting volumes"
           o regexp - whether to treat name as regexp"
           o blacklistregexp - whether to treat blacklist as regexp"
           x - blacklist VMFS's"
           T (value) - timeshift to detemine if we need to refresh"
       ^ all datastore info"
           o used - output used space instead of free"
           o breif - list only alerting volumes"
           o blacklistregexp - whether to treat blacklist as regexp"
           x - blacklist VMFS's"
           T (value) - timeshift to detemine if we need to refresh"
   Copyright (c) 2008-2013 op5 AB,

Avant de tester tout cela avec Nagios™, il faut créer un compte dans le Vcenter en LECTURE uniquement(pour ce plugin). Ces paramètres seront utilisés par les variables: u <user> -p <pass>. Il est possible d'ajouter dans Nagios $USER20$=supervision $USER21$=MotDePasse depuis le fichier /etc/nagios/resource.cfg pour faciliter la configuration.

A tester

define command {
  command_name check_esx_cpu
  command_line $USER1$/check_vmware_api.pl -H $ARG1$ -u $USER20$ -p $USER21$ -l cpu -s usage -w 80 -c 90
}

Autres commandes à traiter :

check_esx3_host_cpu_usage       $USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l cpu -s usage -w $ARG1$ -c $ARG2$
check_esx3_host_mem_usage       $USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l mem -s usage -w $ARG1$ -c $ARG2$
check_esx3_host_swap_usage      $USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l mem -s swap -w $ARG1$ -c $ARG2$
check_esx3_host_net_usage       $USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l net -s usage -w $ARG1$ -c $ARG2$
check_esx3_host_vmfs            $USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l vmfs -s $ARG1$ -w “$ARG2$:” -c “$ARG3$:”
check_esx3_host_runtime_status	$USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l runtime -s status
check_esx3_host_runtime_issues	$USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l runtime -s issues
check_esx3_host_io_read         $USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l io -s read -w $ARG1$ -c $ARG2$
check_esx3_host_io_write        $USER1$/check_esx3 -H $HOSTADDRESS$ -u $USER21$ -p $USER22$ -l io -s write -w $ARG1$ -c $ARG2$
    

Chapter 10. NagiosGraph

Nous avons maintenant un nouveau Nagios™. Il manque tout de même une option que Nagios ne fait pas d'origine, c'est la récupération des données des divers plugins pour en faire des graphiques.

Après maintes recherches, plusieurs projets existent, certains semblent ne plus être soutenus. J'ai retenu Nagiosgraph™, dans sa dernière version. Ce projet est bien coté, et les dernières mises à jour semblent ne pas être vieilles; le forum possède des dépôts très récents. Cette version est compatible avec mon Nagios en version 4.0.x.

Récupération des sources

En allant directement sur le site il est possible d'installer des versions adaptées à différentes distributions Gnu/Linux; hélas elles datent toutes de 2011. La solution, une fois de plus, consiste à récupérer les dernières sources avec un outil comme subversion™ ou gitub™. C'est gitub™ qui sera utilisé. Il suffit d'aller sur cette page : http://sourceforge.net/p/nagiosgraph/git/ci/master/tree/, puis de lancer cette commande : git clone git://git.code.sf.net/p/nagiosgraph/git nagiosgraph-git (expliqué sur le site).

Installation

Il est nécessaire de télécharger si besoin les dépendances suivantes : apt-get install libcgi-pm-perl librrds-perl libgd-gd2-perl libgd-gd2-perl libnagios-object-perl. Ensuite il faut se servir du fichier INSTALL. Tout est indiqué.

La commande ./install.pl est bien faite, pas-à-pas le script vous demande éventuellement de changer les paramètres. Une fois cette étape réalisée, ce programme vous fait un résumé dont voici les lignes les plus importantes :

configuration:
  ng_prefix            /usr/local/nagiosgraph
  ng_etc_dir           /etc/nagiosgraph
  ng_bin_dir           /usr/local/nagiosgraph/bin
  ng_cgi_dir           /usr/local/nagiosgraph/cgi
  ng_doc_dir           /usr/local/nagiosgraph/doc
  ng_examples_dir      /usr/local/nagiosgraph/examples
  ng_www_dir           /usr/local/nagiosgraph/share
  ng_util_dir          /usr/local/nagiosgraph/util
  ng_var_dir           /usr/local/nagiosgraph/var
  ng_rrd_dir           /usr/local/nagiosgraph/var/rrd
  ng_log_dir           /var/log/nagiosgraph
  ng_log_file          /var/log/nagiosgraph/nagiosgraph.log
  ng_cgilog_file       /var/log/nagiosgraph/nagiosgraph-cgi.log
  ng_url               /nagiosgraph
  ng_cgi_url           /nagiosgraph/cgi-bin
  ng_css_url           /nagiosgraph/nagiosgraph.css
  ng_js_url            /nagiosgraph/nagiosgraph.js
  nagios_cgi_url       /nagios/cgi-bin
  nagios_perfdata_file /tmp/perfdata.log
  nagios_user          nagios
  www_user             www-data
[Warning]Warning
Bien faire attention à la variable ng_etc_dir(2eme ligne) qui doit comporter le répertoire nagiosgraph.Sinon tout est posé là ou on ne l'attend pas.

Ce programme ne fait que créer des répertoires, copier des fichiers puis appliquer les droits nécessaires. Il est donc nécessaire d'adapter manuellement les divers fichiers de configuration et également de copier des fichiers.

Bien vérifier que vous avez un répertoire /etc/nagiosgraph; celui ci comporte les fichiers de configuration essentiels.

Ensuite il suffit de faire les commandes suivantes, lesquelles sont toutes extraites du fichier INSTALL.

Il faut copier les fichiers CSS et JavaScript vers les répertoires suivants:

cp share/nagiosgraph.css /usr/local/nagios/share
cp share/nagiosgraph.js /usr/local/nagios/share

Il faut éditer le fichiers /etc/nagiosgraph/nagiosgraph.conf et vérifier la cohérence des données suivantes:

     logfile           = /var/log/nagiosgraph.log
     cgilogfile        = /var/nagiosgraph/log/nagiosgraph-cgi.log
     perflog           = /var/nagios/perfdata.log
     rrddir            = /var/nagiosgraph/rrd
     mapfile           = /etc/nagiosgraph/map
     nagiosgraphcgiurl = /nagios3/cgi-bin
     javascript        = /nagios3/nagiosgraph.js
     stylesheet        = /nagios3/nagiosgraph.css

Il est nécessaire de modifier les droits sur les fichiers suivants. Le principe des droits est assez simple, c'est soit l'utilisateur/groupe nagios ou l'utilisateur/groupe www-data (apache).

     mkdir /var/nagiosgraph/rrd
     chown nagios /var/nagiosgraph/rrd
     chmod 755 /var/nagiosgraph/rrd

     touch /var/nagiosgraph/log/nagiosgraph.log
     chown nagios /var/nagiosgraph/log/nagiosgraph.log
     chmod 644 /var/nagiosgraph/log/nagiosgraph.log

     touch /var/nagiosgraph/log/nagiosgraph-cgi.log
     chown www-data /var/nagiosgraph/log/nagiosgraph-cgi.log
     chmod 644 /var/nagiosgraph/log/nagiosgraph-cgi.log

     chown nagios /var/nagiosgraph
     chmod 755 /var/nagiosgraph

Il faut adapter le fichier nagios.cfg vis-à-vis de Nagiosgraph, en modifiant les lignes suivantes :

     process_performance_data=1
     
     service_perfdata_file=/var/nagios/perfdata.log
     service_perfdata_file_template=$LASTSERVICECHECK$||$HOSTNAME$||$SERVICEDESC$||$SERVICEOUTPUT$||$SERVICEPERFDATA$
     service_perfdata_file_mode=a
     service_perfdata_file_processing_interval=30
     service_perfdata_file_processing_command=process-service-perfdata
[Warning]Warning
En théorie, les lignes précédentes sont incluses à la fin du fichier nagios.cfg, à vous de faire en sorte d'éviter des doublons dans ce fichier.

Le fichier commands.cfg doit également être modifié pour Nagiosgraph. Celle ci fonctionne très bien (il existe sur le NET plusieurs versions):

      define command {
      command_name    process-service-perfdata
      command_line    /usr/local/nagios/libexec/insert.sh "$LASTSERVICECHECK$||$HOSTNAME$||$SERVICEDESC$||$SERVICEOUTPUT$||$SERVICEPERFDATA$"
      }

A ce stade tout est presque fonctionnel; il est possible de lancer Nagios™, mais avec les paramètres actuels rien de visible ne sera perçu. Il est nécessaire pour cela de configurer les hôtes et surtout les services pour apprécier Nagiosgraph™. C'est l'étape suivante.

Avec la dernière version d'Ubuntu je n'ai plus les images qui apparaissent lors de la souris au dessus de l’icône Nagiosgraph (...).

[Note]Note
Je ne montre aucun exemple de prise en compte d'un hôte par Nagiosgraph, je me suis focalisé sur les services, qui sont pour moi les plus importants pour les historiques et les statuts. De plus la supervision d'un hôte est simple à faire.

Configurer un service.

Les manipulations précédentes étaient simples, nous allons attaquer une autre étape qui parfois peut se compliquer.

Nagiosgraph™ conseille de faire une déclaration d'un template à cet effet. Personnellement j'ai arrêté ce système car tous les services testés été pris en compte (erreur de ma part (?)). Ceci peut suffire pour certains. J'ai fait différemment.

Solution globale

Pour y parvenir via un template globale, il suffit alors de rajouter dans cette situation les mots ,graphed-service (exemple) à la suite de la ligne use appropriées. Les 2 services sont alors séparés par une virgule !

     define service {
       name graphed-service
       ; cette ligne à été coupé volontairement pour ce document.
       action_url /nagiosgraph/cgi-bin/show.cgi?host=$HOSTNAME$&service=$SERVICEDESC$' onMouseOver='showGraphPopup(this)' 
       onMouseOut='hideGraphPopup()' rel='/nagiosgraph/cgi-bin/showgraph.cgi?host
       =$HOSTNAME$&service=$SERVICEDESC$
       register 0
}

Solution individuelle

Pour éviter une prise en compte globale des services par Nagiosgraph™, il suffit de rajouter uniquement la ligne action_url dans la déclaration du service.

Voici comment faire une prise en compte d'un service par Nagiosgraph™ de façon individuelle: la ligne concernée a été volontairement coupée pour s'adapter à la largeur du document :

    define service {
      name NTP
      use local-service
      action_url /nagiosgraph/cgi-bin/show.cgi?host=$HOSTNAME$&service=$SERVICEDESC$' 
      onMouseOver='showGraphPopup(this)' onMouseOut='hideGraphPopup()' 
      rel='/nagiosgraph/cgi-bin/showgraph.cgi?host=$HOSTNAME$&service=$SERVICEDESC$
      ...
    }

En principe, votre Nagios est désormais capable de vous montrer des graphiques; à ce titre la procédure pour créer les graphes est relativement longue. Par défaut, le cycle de création des graphiques est basé sur 5 minutes, donc ne rien attendre avant 2 cycles. Évidemment cette variable est réglable, mais c'est aussi vouloir paramétrer Nagiosgraph finement. De plus il est indispensable de bien connaître les méandres de rrdtool pour cela.

Il est nécessaire de modifier encore quelques fichiers pour finir.

Si nécessaire, il faut copier l’icône qui correspond aux graphiques de Nagiosgraph dans le bon répertoire. Me concernant, cette opération n'était pas utile.

     mv /usr/local/nagios/share/images/action.gif /usr/local/nagios/share/images/action.gif-orig
     cp share/graph.gif /usr/local/nagios/share/images/action.gif

Il faut apporter à Nagiosgraph de quoi prendre en compte les javascripts qui apportent un petit plus dans les graphiques, comme la sélection d'une zone.

     vi share/nagiosgraph.ssi
  <script type="text/javascript" src="/nagiosgraph/nagiosgraph.js"></script>
  
     src="/nagiosgraph/nagiosgraph.js"   ->    src=""
     cp share/nagiosgraph.ssi /usr/local/nagios/share/ssi/common-header.ssi

Les modifications qui suivent apportent dans Nagios™ un menu supplémentaire pour Nagiosgraph; il sera situé du coté gauche comme les autres. Il suffit d'éditer le fichier /usr/local/nagios/share/side.php et de modifier/insérer les lignes suivantes :

[Warning]Warning
Il s'agit ici de mes paramètres personnalisés, les lignes de références à insérer sont présentes dans le fichier README de Nagiosgraph.
<li><a href="<?php echo $cfg["cgi_base_url"];?>/outages.cgi" target="<?php echo $link_target;?>">Network Outages</a></li>
</ul>
</li>
</ul>

<div class="navsection">
<div class="navsectiontitle">Nagiosgraph</div>
<div class="navsectionlinks">
<ul class="navsectionlinks">
<li><a href="<?php echo $cfg["cgi_base_url"];?>/trends.cgi" target="<?php echo $link_target;?>">Trends</a></li>
<li><a href="/nagiosgraph/cgi-bin/show.cgi" target="main">Graphs++</a></li>
<li><a href="/nagiosgraph/cgi-bin/showhost.cgi" target="main">Host</a></li>
<li><a href="/nagiosgraph/cgi-bin/showservice.cgi" target="main">Service</a></li>
<!-- <li><a href="/nagiosgraph/cgi-bin/showgroup.cgi" target="main">Group</a></li> -->
</ul>

<!-- ************* suppression de la recherche ***************
<div class="navbarsearch">
<form method="get" action="<?php echo $cfg["cgi_base_url"];?>/status.cgi" target="<?php echo $link_target;?>">
<fieldset>
<legend>Quick Search:</legend>
<input type='hidden' name='navbarsearch' value='1'>
<input type='text' name='host' size='15' class="NavBarSearchItem">
</fieldset>
</form>
</div>
-->

</div>
<div class="navsection">
<div class="navsectiontitle">Reports</div>

Il est encore nécessaire de faire prendre en compte Nagiosgraph par Apache. Il suffit de rajouter dans le répertoire conf.d le fichier nagiosgraph.conf avec les lignes suivantes :

    ScriptAlias /nagiosgraph/cgi-bin /usr/local/nagiosgraph/cgi-bin
    <Directory "/usr/local/nagiosgraph/cgi-bin">
       Options ExecCGI
       AllowOverride None
       Order allow,deny
       Allow from all
    </Directory>
    Alias /nagiosgraph "/usr/local/nagiosgraph/share"
    <Directory "/usr/local/nagiosgraph/share">
       Options None
       AllowOverride None
       Order allow,deny
       Allow from all
    </Directory>

A ce stade, Apache™ et Nagios™ doivent être relancés pour la prise en compte des diverses modifications.

Vérification du bon fonctionnement.

Depuis l'interface graphique de Nagios vous devez apercevoir des icônes comportants un graphique ( ). Il suffit de placer la souris pour apercevoir en théorie un début de graphique. Il est également possible de cliquer sur ce même icône pour apercevoir plusieurs graphiques pour le service concerné.

Quoiqu'il en soit il est important de constater au moins la présence d'un icône graphique, ensuite c'est une excellente chose que de regarder l'ensemble des divers paramètres de Nagiosgraph™ au travers du lien suivant :

showconfig

[Note]Note
J'insiste une fois de plus sur l'importance du fichier README.html présent dans les sources, c'est la référence !

Ajouter le menu Nagiosgraph dans l'interface

<li><a href="<?php echo $cfg["cgi_base_url"];?>/outages.cgi" target="<?php echo $link_target;?>">Network Outages</a></li>
</ul>
</li>
</ul>

<div class="navsection">
<div class="navsectiontitle">Nagiosgraph</div>
<div class="navsectionlinks">
<ul class="navsectionlinks">
<li><a href="<?php echo $cfg["cgi_base_url"];?>/trends.cgi" target="<?php echo $link_target;?>">Trends</a></li>
<li><a href="/nagiosgraph/cgi-bin/show.cgi" target="main">Graphs++</a></li>
<li><a href="/nagiosgraph/cgi-bin/showhost.cgi" target="main">Host</a></li>
<li><a href="/nagiosgraph/cgi-bin/showservice.cgi" target="main">Service</a></li>
<!-- <li><a href="/nagiosgraph/cgi-bin/showgroup.cgi" target="main">Group</a></li> -->

</ul>

<!--
<div class="navbarsearch">
<form method="get" action="<?php echo $cfg["cgi_base_url"];?>/status.cgi" target="<?php echo $link_target;?>">
<fieldset>
<legend>Quick Search:</legend>
<input type='hidden' name='navbarsearch' value='1'>
<input type='text' name='host' size='15' class="NavBarSearchItem">
</fieldset>
</form>
</div>

-->

</div>
<div class="navsection">
<div class="navsectiontitle">Reports</div>

Le fichier map

Ce fichier map pour Nagiosgraph™ est un fichier de configuration essentiel. Néanmoins la prise en compte d'un service peut s'avérer un calvaire. Je tiens à préciser que je ne mets pas en cause le programme ou même l'équipe de programmeurs. Ce programme est très bien fait, par contre la prise en compte d'un service via ce fichier n'est pas toujours aisé.

Pour s'aider à paramétrer ce fichier, il existe sur le NET un excellent site avec de nombreux exemples:nagios.frank4dd.com

Voici à titre d'exemple mon fichier MAP, dont toutes les déclarations ne servent pas forcément.

# File:    </path/to/nagiosgraph>/etc/map
# Desc:    Nagiosgraph map file, perl rules to extract graph data from Nagios
#          host and performance data sent to </path/to/nagiosgraph>/log/<file>
# Last:    20100303 support@frank4dd.com
###############################################################################
# INSTRUCTIONS:                                                               #
#                                                                             #
# This file contains several examples of service types. Edit this file to     #
# add more service types. The data string from Nagios is in $_ . Use          #
# regular expressions to identify and extract data like the examples below    #
# below.  Match on either output: or perfdata: . The code is pure perl,       #
# that will be run inside an eval{}. Results are expected in @s. The general  #
# format is:                                                                  #
#                                                                             #
# /output|perfdata:<servicetype> <key>=<value> <key2=value2> .../             #
# and push @s, [ <databasename>,                                              #
#                [ <key>,  GAUGE|DERIVE, <value>  ],                          #
#                [ <key2>, GAUGE|DERIVE, <value2> ],                          #
#                [ .       .             .        ],                          #
#                [ .       .             .        ] ];                        #
#                                                                             #
# More advanced code is possible, as long as the resulting data structure is  #
# correct.                                                                    #
###############################################################################

# 01 ------------------------------------------------------------------------ #
# Data to graph: RoundTrip Time measured by Ping                              #
#  Service type: check-host-alive (ping)                                      #
# Nagios plugin: check_ping                                                   #
# Nagios output: ||PING OK - Packet loss = 0%, RTA = 1.84 ms                  #
# --------------------------------------------------------------------------- #

/output:PING.*?(\d+)%.+?(\d+)\sms/
and push @s, [ 'ping',
               [ 'rta'  , GAUGE, $2 ],
               [ 'Perte', GAUGE, $1 ] ];
               
# 03 ------------------------------------------------------------------------ #
# Data to graph: Linux CPU load                                               #
#  Service type: load-check                                                   #
# Nagios plugin: check_snmp_load.pl                                           #
# Nagios output: ||Load : 0.48 0.62 0.40 : OK||                               #
# --------------------------------------------------------------------------- #

/output:.*Charge moyenne: (\d+\.\d+), (\d+\.\d+), (\d+\.\d+)/
 and push @s, [ 'CPU',
 [ '01mn', GAUGE, $1 ],
 [ '05mn', GAUGE, $2 ],
 [ '15mn', GAUGE, $3 ] ];

# 06 ------------------------------------------------------------------------ #
# utilise : check_mem.sh
# output: OK - Libre 60% Libre=2353MB Total=3895MB 
#Perfdata: total=3895MB free=2353MB
# \d+ ne fonctionne pas (?) donc il faut \d\d ...

/output:.*(\d\d)%/
 and push @s, [ 'MEM' , [ 'Ram' , GAUGE, $1 ] ];

# 07 ------------------------------------------------------------------------ #
# utilise : check_temp.pl
# putput: TEMP OK - TEMP:35.0 C - temp1 Temperature OK 35.0 ###
#Perfdata: 

/output:.*TEMP:([.0-9]+) C/
 and push @s, [ 'TEMP' , [ 'Temp' , GAUGE, $1 ] ];

# 08 ------------------------------------------------------------------------ #
# Data to graph: Linux swap check                                           #
#  Service type: swap-memory-check                                                 #
# Nagios plugin: check_swap.pl                                            #
# Nagios output: ||SWAP OK - 100% libre (517 MB sur un total de 517 MB) |swap=517MB;0;0;0;517
# --------------------------------------------------------------------------- #
/output:SWAP.*(\d+)\% libre \((\d+)/
and push @s, [ 'SWAP',
             [ 'Max' , GAUGE, $2 ],
             [ 'swap', GAUGE, $1 ] ];
               
# 16 ------------------------------------------------------------------------ #
# Data to graph: Check Apache sessions                                        #
#  Service type: apache-load                                                  #
# Nagios plugin: check_apachestatus.pl                                        #
# Nagios output: OK 0.038933 seconds response time. Idle 5, busy 3, \         #
#                open slots 142                                               #
#  Use perfdata: Waiting for Connection=5 Starting Up=0 Reading Request=0 \   #
#                Sending Reply=3 Keepalive (read)=0 DNS Lookup=0 Closing \    #
#                Connection=0 Logging=0 Gracefully finishing=0 Idle cleanup=0\#
#                Open slot=142 Requests/sec=0.0 B per sec=Ram109.0B B per \      #
#                Request=4851.0B                                              #
# --------------------------------------------------------------------------- #
/output:.*([0-9]+\.?[0-9]+).* response time. Idle (\d+), busy (\d+), open slots (\d+)/
and push @s, [ 'sessions',
               [ 'idle',  GAUGE, $2 ],
               [ 'busy',  GAUGE, $3 ],
               [ 'avail', GAUGE, $4 ], ];
               
# 18 ------------------------------------------------------------------------ #
# Data to graph: HP Temperature Sensors                                       #
#  Service type: temperature_ambient                                          #
# Nagios plugin: check_snmp_temperature                                       #
# Nagios output: ||OK - Ambient_1 Temperature is 24C                          #
# --------------------------------------------------------------------------- #
/output:.* - (\S+) Temperature is (\d+)C/
and push @s, [ $1, [ 'Celsius', GAUGE, $2 ] ];

# 19 ------------------------------------------------------------------------ #
# Data to graph: Check Network Bandwidth                                      #
# Nagios plugin: check_bandwidth3                                             #
# Nagios output: ||OK Out: 1.29Kbps: In: 3.61Kbps||                           #
# Nagios output: ||OK Bandwidth Out: 458.41bps: In: 2.89Kbps||                #
#  Use perfdata: out=458.405063291139;2250000;2700000;0;3000000 \             #
#                in=2958.91139240506;2250000;2700000;0;3000000                #
# --------------------------------------------------------------------------- #
/perfdata:out=(\d+\.\d+);(\d+);(\d+);(\d+);(\d+) in=(\d+\.\d+)/
and push @s, [ 'bandwidth',
               [ 'out',  GAUGE, $1 ],
               [ 'in',   GAUGE, $6 ],
               [ 'sum',  GAUGE, $1+$6 ],
               [ 'warn', GAUGE, $2 ],
               [ 'crit', GAUGE, $3 ],
               [ 'max',  GAUGE, $5 ], ];

# 21 ------------------------------------------------------------------------ #
# Data to graph: Check NTP Clock                                              #
#  Service type: check_ntp_clock                                              #
# Nagios plugin: check_ntp_time                                               #
# Nagios output: NTP OK: Offset -0.003089785576 secs                          #
#  Use perfdata: offset=-0.003090s;5.000000;10.000000; (offset, warn and crit)#
# --------------------------------------------------------------------------- #
/output:NTP.*Offset ([-.0-9]+) secs/
and push @s, [ 'ntp', [ 'offset',  GAUGE, $1 ] ];

# 22 ------------------------------------------------------------------------ #
# Data to graph: Check SMTP Mail service                                      #
#  Service type: check-mail-gw                                                #
# Nagios plugin: check_smtp                                                   #
# Nagios output: ||SMTP OK - 5.279 sec. response time                         #
#  Use perfdata: ||time=5.278750s;;;0.000000                                  #
# --------------------------------------------------------------------------- #
/output:SMTP.*?(\d+\.\d+) sec/
and push @s, [ 'smtp', [ 'response', GAUGE, $1 ] ];

# 25 ------------------------------------------------------------------------ #
# Data to graph: check_hp_enclosure power usage in Watt                       #
# Nagios plugin: check_hp_bladechassis                                        #
# Nagios output: ||OK - System: BladeSystem c7000 Enclosure G2, SN:           #
# SGH018X9ES, Firmware: 3.00, hardware working fine, 4 blades, 2 i/o modules||#
#  Use perfdata: total_watt=1266W;0;0                                         #
# --------------------------------------------------------------------------- #
/perfdata:total_watt=(\d+)W/
and push @s, [ 'power', [ 'Watt', GAUGE, $1 ] ];

# 26 -------------------------------------------------------------------------#
# Data de NSCA (window$)
#
# Nagios output : OK: physical memory: Total: 1.47G - Used: 357M (23%) - Free: 1.12G (77%), virtual memory: Total: 2G - Used: 252M (12%) - Free: 1.75G (88%), page file: Total: 3.32G - Used: 205M (6%) - Free: 3.12G (94%) 
# multiplier $1 par 1024 ne fonctionne pas (?)
#-----------------------------------------------------------------------------#
# /output:.*Total: ([.\d+]+)G - Used: (\d+)M/
/output:.*physical memory: Total: ([.0-9]+)\w. - Used: ([.0-9]+)\w \(([0-9]+)\%/
and push @s, [ 'ms-MEM', [ 'USE',   GAUGE, $3 ] ];

Pourquoi est-ce compliqué ?

Le fichier map prend en compte les données pour faire les divers graphiques via une expression régulière en Perl. Comme pour beaucoup de Linuxiens, Perl est un langage connu, c'est aussi mon préféré; donc je pars avec un peu de bonus, néanmoins j'ai galéré. Voici comment faire en prendre en compte un service par nagiosgraph, en se basant sur le fait que vous n'avez pas trouvé une définition adéquate.

Chaque plugin nagios utilise 2 parties similaires, l'une s’appelle output et l'autre perfdata, voici ce que cela donne concrètement, via mon test check_mem.sh :

/usr/local/nagios/libexec/./check_mem1.sh -w90 -c95
OK - Utilisé 51% Libre=1987MB Total=3895MB | 51% total=3895MB free=1987MB

La partie output est la première, elle se termine par le caractère |, elle est suivie par perfdata. La partie output est utilisée par Nagios pour afficher un descriptif sur l'état du service. Et bien évidemment j'ai travaillé à récupérer des données via la partie perfdata sans comprendre pourquoi mes tests ne fonctionnaient pas. Pour moi, cette partie représente dans Nagios les données complémentaires pour un traitement externe comme par nagiosgraph. En réalité non dans mon cas ! mais il existe des exemples qui prennent en compte cette partie, à l'heure actuelle je ne peux pas expliquer pourquoi. Donc il suffit parfois de basculer d'un coté à l'autre pour enfin avoir des données.

[Note]Note
Donc en fonction des paramètres de sorties, il faut bien faire attention de placer soit le mot output ou perfdata; et le tout est suivi de votre règles de sélection. Dans le même style, une règle qui ne compte pas un mot, une lettre particulière (pertinente !) est susceptible de provoquer des troubles vis-à-vis des autres tests. Donc une règle dans le style : /output:.*:([.0-9]+)/ n'est correcte !.
[Note]Note
Pour la mise au point des règles d'extraction des données, il est possible d'utiliser le programme testentry.py, qui est inclus avec Nagiosgraph. Il est nécessaire de l'éditer et de placer les données (output et perfdata) à l’intérieur, puis de tester. Ce programme fait gagner du temps pour une situation difficile, si j'avais su plutôt...

Il existe une autre solution: c'est de faire en sorte que Nagiosgraph™ soit en mode debug. Cette procédure est relativement efficace néanmoins dans mon cas, elle n'explique pas forcément où est le problème. Il s'agit d'éditer le fichier nagiosgraph.conf puis d'activer les multiples paramètres debug présents; ils ne manquent pas. A vous de régler au mieux les divers paramètres. Je conseille même de placer le nom du service concerné, afin de ne pas polluer les données. Ensuite il faut scruter le fichier /var/nagiosgraph/log/nagiosgraph-cgi.log pour essayer de comprendre.

[Warning]Warning
Notez bien que Nagios mémorise tout en mémoire dès son lancement, donc le changement d'un paramètre doit faire l'objet d'une relance de ce service. Et comme Nagiosgraph fait partie de Nagios, c'est pareil. A la moindre modification il faut tout relancer puis attendre. Si vous changez un paramètre qui touche une base (RRD) de Rrdtool il est nécessaire de supprimer le fichier concerné, il sera créé par la suite avec les données adéquates.

Au final vous devriez avoir un Nagios similaire à cette image, certes avec un peu de temps passé à le configurer. Mais c'est un effort bien récompensé !

Chapter 11. Supervision Netasq

check_vpn_netasq.pl

C'est après de très nombreuses recherches et d'essais que j'ai enfin réussi à superviser ce que je voulais; ou presque. Il s'agit de superviser l'état d'un ou plusieurs VPN. Les outils qui vont me servir sont Openssh, snmpwatch, le plugin nagios::plugin, puis Perl pour finir. Le produit snmpwalk ne sert uniquement que pour comprendre, voir même pour essayer à comprendre. A ce titre Netasq fournit plein de fichiers MIB dont les fichiers : NETASQ-VPNSA-MIB: Table of negotiated IPSEC SA et NETASQ-IPSEC-STATS-MIB: Table of IPSEC statistics, sauf que je n'ai pas à réussi à extraire des données intéressantes avec ces 2 définitions. Ne pas hésiter à me dire comment les utiliser sinon; je lance un appel, j'aimerais comprendre. Donc il m'a fallu trouver une autre solution. Les produits Netasq de la série U comme un U70 offrent certaines commandes shell qui peuvent être très utiles. Il s'agit de : showSAD et de showPID. La première commande est celle que je vais utilisée, elle permet de faire ressortir des données pertinentes. De là mon script filtre uniquement la ligne contenant le mot mature. Le reste est facile à faire il suffit de compter les lignes pour chacun des VPN. A savoir qu'un VPN, comme on le conçoit, pour le script c'est 2 lignes(!), c'est important sinon vous serez dans le rouge par la suite.

Ce plugin est encore en test actuellement, il est disponible ici Exchange.nagios.

Son paramétrage

Les paramètres nécessaires sont simples. Je regrette néanmoins de ne pas avoir réussi à me loguer sur un U70 via SSH au travers des certificats. C'est pas faute d'avoir essayer, donc il va falloir hélas utiliser un login et un mot de passe, puis les laisser en clair dans Nagios. C'est à mon avis le seul point critique.

Voici comment l'intégrer dans Nagios, sa compréhension est simple, il faut noter que l'option warning est équivalente à critical. C'est normal, car le plugin nagios::plugin impose les deux, mais dans ma situation un VPN est actif ou mort. Donc il prend les états OK ou CRITICAL.

define command{
command_name	check_vpn
command_line	sudo $USER1$/check_vpn_netasq.pl -H 192.168.1.254 -u user -p mot_de_passe -w 2 -c 2
}
[Note]Note
Pour un bon fonctionnement je ne peux que vous conseiller de placer l'instruction sudo, sinon vous risquez de rencontrer un problème de droit pour enregistrer des données SSH. Voici ce que cela donne : ERROR: ctl_dir /usr/local/nagios/.libnet-openssh-perl/ is not secure.

check_eth_netasq.pl

Maintenant que la formule est prête avec le script précédent, rien de plus simple pour en faire un autre. C'est le cas avec ce script, sa mission est de récupérer le nombre d'octets transmis sur une interface. Après maintes recherches, rien ne dit que c'est que c'est l'interface ETH0 qui est concerné. Mais en prenant un Netasq avec uniquement cette interface d'activée, seuls ces paramètres remontent, donc j'en conclu que c'est pour cette ci, ou pour la globalité des interfaces. Les données sont envoyées au Netasq, il doit être configuré pour répondre aux requêtes SNMP. Cette étape est simple à réalisé sur cette machine. Ensuite il ne reste plus qu'à tester le script. Si le script fonctionne bien il doit renvoyer ce type de données :

ETH_NETASQ OK - in11455669c out15579283c

Donc et conformément aux directives MIB/SNMP il s'agit du nombre d'octets envoyés et reçus depuis une interface. La lettre c est une indication pour Nagios, elle indique qu'il faut traiter ce chiffre en mode COUNTER. Ce type de test est important à mes yeux, au même titre que celui des VPN, car il confirme que le Netasq fonctionne bien, ou pas.

Pour aller encore un peu plus loin avec, il est possible d'utiliser Nagiosgraph pour réaliser des graphes à propos de cet interface. Pour y arriver il suffit de faire tout çà :

Il faut ajouter une règle d'extraction dans le fichier MAP, bien prendre l'option COUNTER (!) :

# 27 -------------------------------------------------------------------------#
# Data ETH pour Netasq
# Nagios output: ETH_NETASQ OK - IN 135536 OUT 85816 Octets  
#-----------------------------------------------------------------------------#
/output:.*IN ([0-9]+) OUT ([0-9]+) Octets/
and push @s, [ 'eth0', [ 'In',   COUNTER, $1 ] ,
                       [ 'Out',  COUNTER, $2 ] ];

Il ne reste plus qu'à ajouter la ligne qui va bien au niveau des services Nagios, et d'attendre l'apparition des graphes. Voir ici sinon : ajout-graph.

Chapter 12. La notification avec Gmail

Table of Contents

Via un plugin :

Via un plugin :

Même si Gmail est parfois critiqué, elle n'en reste pas moins pour moi une excellente solution gratuite de messagerie. Donc maintenant; il faut que notre Nagios" soit en mesure de nous envoyer des méls dans une boite dédiée. Après plusieurs recherches, les projets ne manquent, bien qu'ils ne soient tout de même pas très nombreux. La solution d'activer Postfix reste une solution viable, néanmoins je cherche à limiter l'installation de composants au maximum.

[Note]Note
Le choix de prendre un service distant peut faire en sorte que le service de notifications est dépendant de la liaison entre Nagios et le serveur. C'est un risque à prendre, sinon il reste la solution d'installer Postfix qui lui transmettra les notifications une fois que la liaison est revenue.

La solution retenue vient de ce projet Nagios Alerts via gmail and python. Après plusieurs tests et des modifications, celui ci est simple à installer et à configurer, voici comment faire :

Dans les sources su programme, il faut ajouter les paramètres de votre compte Gmail dédié, en remplaçant les valeurs YOUR_ADDRESS_HERE@gmail.com, et le paramètre YOUR_PASSWORD_HERE par les bonnes valeurs.

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.set_debuglevel(1) #0 for quiet or 1 for verbosity
    server.ehlo('YOUR_ADDRESS_HERE@gmail.com')
    server.starttls()
    server.ehlo('YOUR_ADDRESS_HERE@gmail.com')  # say hello again
    server.login('YOUR_ADDRESS_HERE@gmail.com', 'YOUR_PASSWORD_HERE')
    
    server.sendmail('YOUR_ADDRESS_HERE@gmail.com', Addresses, "Subject: " + subject + '\nTo:' + address + '\n\n' + body)

Ensuite, il ne reste plus qu'à attendre un mél, puis à modifier éventuellement les paramètres suivants pour une meilleure présentation.

#notify host via gmail using python script. \\nnn will insert return, use for body of mssg
define command{
	command_name	notify-host-by-email
	command_line	/usr/local/nagios/libexec/send_gmail.py -a $CONTACTEMAIL$ -s "[NAGIOS-HOST] $NOTIFICATIONTYPE$" 
	-b "Alerte pour hote:\\ttt $HOSTNAME$ dans l'etat:\\ttt $HOSTSTATE$\\nnnType de Notification :\\ttt$NOTIFICATIONTYPE$\\nnn
	Hote est:\\ttt$HOSTNAME$\\nnnEtat:\\ttt$HOSTSTATE$\\nnnInfos:\\ttt$HOSTOUTPUT$\\nnnDate/Time:\\ttt$TIME$  $DATE$\\nnn -- FIN --"
}

#notify service via gmail using python script. \\nnn will insert return, use for body of mssg
define command{
	command_name	notify-service-by-email
	command_line	/usr/local/nagios/libexec/send_gmail.py -a $CONTACTEMAIL$ -s "[NAGIO-SVC] $SERVICESTATE$" 
	-b "Type de notification:\\ttt$NOTIFICATIONTYPE$\\nnnPour le service:\\ttt\\ttt $SERVICEDESC$\\nnn
	Hôte est:\\ttt\\ttt($HOSTALIAS$)\\ttt\\nnnEn mode:\\ttt$SERVICESTATE$ depuis le: $TIME$  $DATE$\\nnn\\nnn
	Informations complementaire :\\ttt$SERVICEOUTPUT$ ($NOTIFICATIONTYPE$)\\nnn
	Alerte pour:\\ttt ($HOSTALIAS$) $SERVICEDESC$ est dans l'etat : $SERVICESTATE$\\nnn -- FIN --"
}
[Note]Note
Dans le script seul le retour de chariot est pris en compte, pour utiliser les tabulations il suffit de rajouter cette ligne à coté de l'autre : body = '\t'.join(body.split('\\ttt'))

Une fois toutes les modifications faites, voici ce que cela peut donner :

Type de notification:           PROBLEM
Pour le service:        PING
Hôte est:              (RT-1-Gab.T)
En mode:                CRITICAL depuis : 10:59:57  05-10-2013

Informations complementaire :
 - PING CRITICAL -  Paquets perdus = 0%, RTA = 915.30 ms (PROBLEM)
  - Alerte pour: (RT-1-Gab.T) le service PING est dans l'état : CRITICAL
 -- FIN --

Chapter 13. PNP4Nagios

Installation

Sans critiquer Nagiosgraph toutefois, ce produit ne m'a pas apporté exactement ce que je voulais. De plus, il faut modifier le fichier map au moindre changement. J'ai choisi d'essayer PNP4Nagios dans sa dernière version à ce jour (pnp4nagios-0.6.21 [ 03-24-2013 ]). La documentation sur le site de PNPNagios est très complète, seule la compilation mérite d'être notée, voici ce que j'ai fait :

./configure Options --prefix=/usr/local/pnp4nagios --exec-prefix=/usr/local/pnp4nagios --bindir=/usr/loccal/pnp4nagios \
        --sysconfdir=/etc/pnp4nagios --localstatedir=/var/pnp4nagios --with-layout=debian --with-nagios-user=nagios \
        --with-nagios-group=nagios --with-perfdata-logfile=perfdata.log --with-perfdata-dir=/var/pnp4nagios \
        --with-perfdata-spool-dir=/var/pnp4nagios --with-debug --with-httpd-conf=/etc/apache2/conf.d \
        --with-init-dir=/etc/init.d

Donc rien d'extraordinaire, toutefois j'ai du intervenir pour ajuster presque tous les fichiers de configurations. Il faut ajouter à cela les modifications imposées vis-à-vis en particulier de Nagios. Il existe 3 modes de fonctionnement pour pnp4nagios qui va du plus classique au plus performant; en réalité il en existe 5. Ces 3 modes sont une fois de plus clairement expliqué, ils dépendent en particulier de votre architecture, du nombre de hôtes/services à tester. J'ai choisi le mode bulk, et celui ci me donne entière satisfaction.

Il est important de lancer un script pour tester votre configuration avant de lancer PNP4Nagios, voici la commande qui est modifiée par rapport à la documentation officielle :

/usr/local/pnp4nagios/libexec/verify_pnp_config_v2.pl -c /etc/nagios/nagios.cfg -p /etc/pnp4nagios/ -m bulk

Il existe une autre solution pour superviser et graphiquement le tout. Une fois dans l'interface graphique, il suffit de cliquer sur l'image correspondant au sigle information. Plusieurs graphes apparaissent en vous donnant un état du système détaillé.

Les dépendances

Ceci n'est pas forcément notifier dans la documentation disponible sur le site PNP4Nagios, mais il faut installer ceci :

apt-get install libcrypt-rijndael-perl

En théorie ceci ne doit pas être forcément installé, mais dans mon rôle de testeur...désormais il est indispensable. Il s'agit des 2 scripts suivants : npcd et pnp_gearman_worker. Ces 2 scripts ont fait l'objet d'adaptations par rapport à mes besoins et à ma configuration générale. Au final il est nécessaire d'avoir des historiques similaires à ceci :

2013-10-29 18:27:05 [26360] [0] process_perfdata.pl-0.6.21 Gearman Worker Daemon
2013-10-29 18:27:05 [26361] [0] Pidfile (/var/log/pnp4nagios/pnp_gearman_worker.pid) created
2013-10-29 18:27:05 [26362] [0] connecting to gearmand 'localhost:4730'

Voilà qui est clair, néanmoins je ne connais avec certitude son rôle exacte entre lui et npcd...si jamais une personne connait, ne pas hésiter.

Les problèmes rencontrés.

Certains plugins refusaient d'être pris en compte, pour une raison très simple. Il est clairement expliqué sur le site de PNP4nagios que cette application respecte les normes des plugins Nagios. Il est donc important que chaque plugin adopte cette méthode. J'ai adapté 2 plugins en me référant à cette méthode et d'un seul coup les graphiques sont apparus. Pour aider à mieux comprendre pourquoi un blocage peut arriver, il est possible de visualiser sous Nagios les données reçues. Pour cela il suffit de cliquer sur l'hôte ou le service, et non sur le plugin (!), et vous devriez apercevoir ce type de données :

Status Information:	TEMP OK - temp= 40 C
Performance Data:	temp=40;65;75

La 2eme ligne est la plus importante elle doit être basée sur ce modèle : 'label'=value[UOM];[warn];[crit];[min];[max], les valeurs min et max ne sont pas obligatoires.

Les templates

Une fois de plus c'est très bien expliqué, il existe des exemples plus ou moins compliqués de modèles(template) pour PNP4nagios. C'est l'un des avantages de PNP4nagios, pouvoir modifier à souhait une série de graphiques en se servant d'un modèle. Néanmoins avant de se lancer, il est nécessaire que PNP4Nagios prenne en compte votre plugin, et surtout vous génère un fichier XML. Ce fichier sera pour votre votre template la référence.

Et au final vous devez avoir des graphes aussi beau que celui là :

Chapter 14. Conclusion.

Table of Contents

J'espère que la lecture de document vous a permis d'installer Nagios sans problème, vous permettant d'être en mesure de superviser beaucoup d'équipements en tout genre. Il reste encore beaucoup de points à traiter, comme la redondance via un autre serveur Nagios en mode esclave via NRPE. Ce même plugin mérite également de s'y arrêter, il fera peut-être l'objet d'un ajout dans ce document ultérieurement.

Installer Nagios n'est pas forcément une chose facile et rapide, mais il existe une étape qui mérite un soin particulier. C'est organiser la structure de Nagios avant de commencer la supervision, en se posant certaines questions comme : qui doit être superviser; quel service à prendre en compte, y compris pour Nagiosgraph, quelles sont les dépendances, comment je vais organiser mes fichiers de conf, quelles sont les plugins à utiliser(et à tester !), les contacts...etc.

Si jamais Nagios vous fait peur, il existe sur le NET de nombreuses entreprises en mesure de faire le travail à votre place. Il existe également des formations. Nagios reste à mes yeux une formidable application; il existe également le projet Centréon™. Au final, vous aurez une solution libre, performante et souple, et même plus performante qu'une application payante parfois.

Appendix A. Les liens utiles.

  • check_esxi_hardware.py : Sur ce site il est possible de récupérer le script et de la documentation. Ce script est maintenue à ce jour régulièrement; hélas je regrette des tests plus précis sur les processeurs, la mémoire...DRAFT Secure Domain Name System (DNS) Deployment Guide

  • OP5 : le site op5.com Cette même société propose également une interface de supervision un peu comme Nagios, très beau travail !

  • Il s'agit d'une démo de Nagios par un particulier apparemment. Il faut cliquer sur l'icone Nagiosgraph pour aller vers la page où il est possible de récupérer des définitions pour le fichier map, il faut utiliser le menu Nagios-graphs pour y accéder.http://nagios.frank4dd.com/nagios/

  • Voici un lien vers l'ensemble des variables utilisées par Nagios: celles ci peuvent servir pour vos macros. macrolist.html

Glossary

Github

GitHub est un service web d'hébergement et de gestion de développement de logiciels, utilisant le programme Git. Ce logiciel permet de télécharger les dernières sources d'une application facilement.

Nagios XI

Le projet Nagios est composé de 2 parties en ce qui concerne le cœur de Nagios. Le plus connu Nagios qui est un projet Open-source, et Nagios XI qui est un projet commercial.

Licence FDL

Licence GNU de documentation libre est disponible ici : http://www.gnu.org/licenses/fdl.html

VPN

Dans les réseaux informatiques et les télécommunications, le réseau privé virtuel (Virtual Private Network en anglais, abrégé en VPN) est vu comme une extension des réseaux locaux et préserve la sécurité logique que l'on peut avoir à l'intérieur d'un réseau local. Il correspond en fait à une interconnexion de réseaux locaux via une technique de « tunnel ». On parle de VPN lorsqu'un organisme interconnecte ses sites via une infrastructure partagée avec d'autres organismes. (source wikipedia)