Blog

Comment se faire appeler par nagios via SIP en cas de problème

Écrit le 10 02 2017 par Kévin MET _

Ah, la joie de se faire réveiller en pleine nuit pour l’astreinte. Tous bon sysadmin connaît ce bonheur intense qui consiste à se réveiller en sursaut à 3H du matin, essayer d’ouvrir ses yeux collés et faire la mise au point sur son écran pour découvrir avec effroi que toute la prod est pétée... Voilà le sujet du jour, et plus précisément, on va voir comment être sur de ne pas louper un problème en astreinte en déclenchant un appel sur le mobile depuis Nagios en passant par un compte SIP.

Introduction

Dans ce rapide tutoriel je vais vous expliquer comment je fais pour être alerter via mon téléphone mobile en cas de notification Nagios. Pour cela, j’utilise un compte SIP de chez OVH, l’offre à 0,99HT par mois ce qui n’est vraiment pas cher payé pour le service rendu. Vous pouvez bien entendu utiliser n’importe quel autre fournisseur, voire même monter votre propre serveur asterisk.

Je n’ai pas retenu cette dernière solution car le fait de passer par un prestataire permet de passer des appels sur le réseau mobile sans prendre un trunk SIP pour son asterisk. Cela peut donc s’avérer très pratique si votre connexion internet tombe sournoisement durant votre sommeil (plus de wifi, plus de SIP, plus d’alertes). Cela évitera que vous découvriez les dégâts le lendemain matin. Voilà pourquoi je vous conseille de monter un trunk SIP si vous tenez vraiment à utiliser votre serveur asterisk.

Perl à la rescousse

Après quelques recherches sur internet, j’ai découvert que la plupart des acteurs de l’infogérance utilisent la même technique pour intégrer les appels SIP à nagios, le combo PJSUA + un script expect + un text2speech. Il vous suffit de chercher avec les bons mots clé sur google et vous verrez qu’on ne trouve que ça. Ayant déjà travaillé avec ce type de configuration j’ai fait un constat, le text2speech est juste incompréhensible, d’autant plus quand on l’écoute à 4H du matin avec la trace de l’oreiller collée au visage... De plus, si votre nagios est bien configuré, il ne vous alerte qu’en cas de réel problème, peu importe donc ce qu’on va comprendre du text2speech, il faudra se lever, allumer son PC et vérifier le problème sur Nagios. Bref, un simple appel est amplement suffisant pour nous alerter.

Partant de ce constat j’ai cherché comment passer un appel SIP en bash (c’est bien d’être optimiste) et j’ai trouvé une lib Perl ;) Net::SIP.

Franchement, je n’y connais pas grand-chose en SIP et je suis loin d’être un crack en Perl (c’est même un euphésimsme) et j’ai écrit ce micro script assez rapidement avec la doc de la lib et un peu de recherche sur perlmonks. C’est donc une lib assez facile à prendre en main. Si jamais je fais une maj du script, je laisse le lien github pour assurer un suivi : https://github.com/nierdz/admintools/blob/master/nagios/plugins/sip_call.pl


#!/usr/bin/perl

use strict;
use warnings;
use Net::SIP;

my ($destination) = @ARGV;

my $ua = Net::SIP::Simple->new(
	registrar => "sip3.ovh.fr",
	domain => "sip3.ovh.fr",
	from => "0033XXXXXXXXX",
	auth => [ "0033XXXXXXXXX", "XXXXXXXXXXXXXXXX" ],
	expires => 1800,
);

$ua->register or die ("Register failed: ".$ua->error);

$ua->invite( $destination,
	init_media => $ua->rtp( 'media_send_recv', 'announce.pcmu-8000', 2 ),
	rtp_param => [8, 160, 160/8000, 'PCMA/8000'],
	asymetric_rtp => 0,
) or die "Invite failed: ".$ua->error;

$ua->loop;

$ua->bye;

Pour utiliser ce script, il faut avoir installé la lib Net::SIP sur son système, soit en passant par CPAN, soit en passant par son gestionnaire de paquet. Sur Debian/Ubuntu, le paquet se nomme libnet-sip-perl. Vous l’aurez compris, il faut ensuite changer les identifiants et le registrar/domain pour l’adapter à votre situation. Enfin, il suffit d’appeler le script suivi du numéro de téléphone qu’on veut appeler :


# /usr/lib/nagios/plugins/sip_call.pl 0642XXXXXX

Pour les options que j’ai utilisé pour $ua, je vous invite à jeter un coup d’œil à la doc et notamment sur les options de la méthode new. Comme je vous le disais, je n’y connais pas grand-chose en SIP, donc si un guru en SIP passe sur cet article, s’il peut me dire si je n’ai pas fait de boulette dans la conf, ça serait cool. Voire même si il a des recommandations à faire, je suis preneur. Après, ça fait ce que je veux, c’est à dire que peu importe si on décroche ou si on raccroche, ça kill le script, ce qui évite un empilement.

Implémentation dans Nagios

Maintenant on va voir comment intégrer cela aux notifications Nagios. Déjà on va commencer par mettre le script dans le dossiers des plugins Nagios, dans une installation via le gestionnaire de paquets Debian/Ubuntu, il s’agit du dossier /usr/lib/nagios/plugins/ mais vous pouvez le mettre où ça vous chante, par exemple dans /usr/bin/ si ça vous convient mieux.


# ls -l /usr/lib/nagios/plugins/sip_call.pl
-rwxr-xr-x 1 root root 547 Feb 10 11:26 /usr/lib/nagios/plugins/sip_call.pl

Ensuite on ajoute un nouveau contact avec comme email le numéro de téléphone à appeler. Cela dépend de votre installation de Nagios, dans le cas d’une installation via le gestionnaire de paquet sur Debian/Ubuntu, c’est le fichier /etc/nagios3/conf.d/contacts_nagios2.cfg


define contact{
	contact_name					astreintes
	alias							Astreintes
	service_notification_period		HNO
	host_notification_period		HNO
	service_notification_options	u,c
	host_notification_options		u,d
	service_notification_commands	notify-by-sip
	host_notification_commands		notify-by-sip
	email							0642XXXXXX
}

Il est important de noter les paramètres suivant :

  • service_notification_options : On ne garde que u,c car on ne veut recevoir un appel qu’en cas de UNKNOWN ou de CRITICAL.
  • host_notification_options : On ne garde que u,d car on ne veut recevoir un appel qu’en cas de UNREACHABLE ou de DOWN.
  • service_notification_commands : notify-by-sip (Nouvelle commande qu’on va définir par la suite)
  • host_notification_commands : notify-by-sip
  • Dans ma configuration nagios, j’ai défini la timeperiod HNO (Heures Non Ouvrées) dans le fichier /etc/nagios3/conf.d/timeperiods_nagios2.cfg , voici la définition :

    
    define timeperiod{
    	timeperiod_name HNO
    	alias			Heures non ouvrees
    	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
    }
    

    Il ne reste plus qu’à définir la commande notify-by-sip, dans le fichier /etc/nagios3/commands.cfg dans une installation via le gestionnaire de paquet sur Debian/Ubuntu.

    
    # 'notify-by-sip' command definition
    define command{
    	command_name	notify-by-sip
    	command_line	/usr/lib/nagios/plugins/sip_call.pl $CONTACTEMAIL$
    }
    

    On vérifie que la conf de nagios est bonne avec la commande suivante :

    
    # /usr/sbin/nagios3 -v /etc/nagios3/nagios.cfg
    

    Et on relance le bouzin, c’est bon, vous êtes prêt à vous faire réveiller la nuit ;)

    Dans cette configuration, il suffit de changer le numéro de téléphone du contact d’astreinte et de relancer Nagios pour faire le roulement des astreintes entre les admins ou sinon, de vous refiler le mobile d’astreinte comme une patate chaude :)

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.