Avoir une solution de Continuous Integration et de Continuous Delivery, c'est très bien. C'est même un pré-requis pour une équipe Agile. Mais encore faut-il s'assurer qu'elle est bien opérationnelle et que les personnes concernées sont alertées en cas de problème. C'est précisément ce rôle que remplit Nagios.


Nagios est une solution de monitoring de la santé de serveurs sortie en 1999. Elle bénéficie d'une grande communauté et d'un grand nombre de plugins et d'extensions. Son nom provient de "Nagios Ain't Gonna Insist On Sainthood".

Nagios permet de superviser des hôtes et des services et d'indiquer les problèmes (exemple : hôte non joignable, disque d'un hôte plein, ...).

Il y a deux classes de vérification :

  • les vérifications actives : Initiées par Nagios, elles consistent à exécuter du code régulièrement. Elles sont typiquement utilisées pour monitorer les services HTTP, SSH ou encore les bases de données;
  • les vérifications passives : Initiées par un système autre que Nagios, elles consistent à notifier Nagios du résultat de la vérification. Elles sont typiquement utilisées pour monitorer les services asynchrones ou les services se trouvant derrière un firewall.

Concrètement, Nagios est capable par exemple de pinguer un serveur Web toutes les 10 minutes et de déclencher une action comme envoyer un email à un groupe de contacts prédéfini si le serveur ne répond pas dans le délai imparti.

La configuration de Nagios est faite via des fichiers de configuration.

Dans cet article, nous allons voir comment mettre en oeuvre Nagios avec Docker. Pour cela, nous allons utiliser l'image jasonrivers/nagios. Le scénario que nous allons dérouler est le suivant :

  • Un container fait tourner une instance de Nagios.
  • Un autre container fait tourner une instance du serveur Web Nginx.
  • Lorsque le container Nginx est arrêté, l'instance de Nagios doit émettre une alerte.

Pour déployer ces containers Docker, nous allons utiliser Docker Compose. Nous utiliseront donc un fichier docker-compose.yml qui a cette forme :

version: '3'
services:
 nagios:
  image: jasonrivers/nagios
  ports:
   - 8081:80
  environment:
   - NAGIOSADMIN_USER=nagiosadmin
   - NAGIOSAMDIN_PASS=nagios
  volumes:
   - ./etc/:/opt/nagios/etc/
 nginx:
  image: nginx
  ports:
   - 8082:80

Ce fichier définit donc deux services : nagios, qui tourne sur le port 8081, et nginx, qui tourne sur le port 8082. Il définit également le username et le mot de passe de Nagios (à savoir nagiosadmin / nagios) et partage le répertoire /opt/nagios/etc de l'instance Nagios via le sous-répertoire local ./etc. C'est dans ce répertoire que l'on stocke les fichiers de configuration de Nagios.

Nous sommes prêts à lancer les services nagios et nginx :

docker-compose up

Vous pouvez vérifier que les deux services tournent avec un navigateur Web en vous rendant à l'adresse :

  • http://localhost:8081 pour vérifier que l'instance Nagios a bien démarré,
  • http://localhost:8082 pour vérifier que l'instance du serveur Web Nginx a bien démarré.

Le fichier de configuration de base de Nagios est nagios.cfg. Il se trouve dans le sous-répertoire ./etc. C'est une bonne pratique de répartir l'ensemble des informations dans des fichiers distincts, par exemple : hostsgroups.cfg, hosts.cfg et services.cfg.

Pour cela, vous devez les déclarer dans le fichier nagios.cfg. Dans la section "OBJECT CONFIGURATION FILE(S)", ajoutez ces lignes :

cfg_file=/opt/nagios/etc/objects/hostgroups.cfg
cfg_file=/opt/nagios/etc/objects/hosts.cfg
cfg_file=/opt/nagios/etc/objects/services.cfg

Le fichier hostgroups.cfg permet de définir des groupes d'hôtes. C'est vite très pratique lorsque vous gérez un parc de serveurs. Voici un exemple de contenu :

define hostgroup{
  hostgroup_name  test-group
  alias      Test Servers
  members     my_client
}

Le fichier hosts.cfg permet de définir les hôtes. Voici un exemple de contenu du fichier hosts.cfg :

define host{
  use        generic-host
  host_name    my_client
  address      192.168.204.31
  contact_groups  admins
 max_check_attempts  1
  notes      Test my_client
}

Enfin, on définit les services à tester dans le fichier services.cfg :

define service{
  use           generic-service
  hostgroup_name      test-group
  service_description Ping
  check_command      check_ping!200.0,20%!600.0,60%
}

# Nginx webserver
define service{
 host_name my_client
 use generic-service
 service_description Nginx Web server
 check_command check_http_port!8082
}

define command{
 command_name check_http_port
 command_line $USER1$/check_http -I $HOSTADDRESS$ -p $ARG1$
}

Que fait-on ici ? Et bien on définir deux services :

  • un premier service "Ping" effectuant un ping sur les serveurs du groupe test-group,
  • un second service "Nginx Web server" effectuant un test de connexion au serveur HTTP sur le port 8082.

Nous utilisons le plugin "check_http" et la syntaxe de base est :

check_command check_http

Cependant, ce plugin ne fait le test sur le port 80 par défaut. Notre serveur fonctionnant sur le port 8082, nous devons modifier la manière dont on appelle ce plugin en spécifiant le port, à savoir 8082.

Si vous vous rendez sur la page Web de Nagios, vous constatez, au bout d'un certain délai, que la vérification des services est faite avec succès et que leur statut passe au vert.

Maintenant, nous allons arrêter le service Nginx avec cette commande 

docker-compose stop nginx

En retournant sur la page Web de Nagios, après un certain délai, et après avoir rafraîchi la page, vous allez constater que la vérification des services échoue et que leur statut passe au rouge.

Maintenant, il serait bien d'être alerté par email. Pour cela, il faut ajouter un contact, ou simplement modifier le contact prédéfini. Pour cela, ouvrez le fichier contacts.cfg et spécifiez l'email du destinataire dans la ligne commençant par "email" :

define contact{
 contact_name nagiosadmin
  use generic-contact
 alias Nagios Admin
  email XXXXXX
 }

Voici maintenant des exemples de plugins permettant de surveiller des services.

Il existe d'abord des plugins permettant de vérifier qu'un certain nombre de serveurs fonctionnenent correctement. Il s'agit essentiellement de vérifier qu'ils retournent bien l'entête attendue lors de la connexion :

  • check_http pour monitorer un serveur HTTP,
  • check_ftp pour monitorer un serveur FTP,
  • check_ssh pour monitorer un serveur SSH,
  • check_smtp pour monitorer un serveur SMTP,
  • check_pop pour monitorer un serveur POP3,
  • check_imap pour monitorer un serveur IMAP.

Mais il existe aussi d'autres plugins qui permettent de monitorer les serveurs :

  • check_local_disk pour vérifier l'espace disque disponible : il est ainsi possible de mettre en place une notification de type warning s'il reste moins de 20% d'espace libre et une notification d'alerte s'il reste moins de 10%;
  • check_local_users pour vérifier le nombre d'utilisateurs actuellement connectés;
  • check_local_procs pour vérifier le nombre de processeurs tournant sur un serveur : il est possible par exemple de définir une notification de type warning s'il y a plus de 200 process et une notification d'alerte s'il y en a plus de 400;
  • check_mem pour vérfier la mémoire disponible,
  • check_local_load pour vérifier la charge du serveur;
  • check_local_swap pour vérifier l'utilisation de l'espace Swap;
  • check_raid pour vérifier le fonctionnement RAID du matériel;
  • check_ddos pour détecter les attaques DDOS.

Nagios est l'une des solutions de monitoring des services, parmi d'autres. Elle a l'avantage d'être très ancienne et de disposer d'un grand nombre de plugins. Avec une solution comme Nagios, la supervision d'hôtes et de leurs services devient un exercice beaucoup plus simple.

 


Pensées pour mieux produire

Soyez prévenu dès que mon livre "Pensées pour mieux produire" sera disponible à la vente !

DevOps, Agile, Scrum, Kanban, XP, SAFe, LeSS, Lean Startup, Lean UX, Design Thinking, Craftmanship, Management 3.0, ...

 

Bruno Delb

Agile Coach and DevOps, with an experience in the Medical Device software domain, Management 3.0, Agile games and development (especially on mobile) are my passion.

Search

Ads