DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi
L’objectif est d’installer un serveur Nagios sur un rapsberry pi afin de monitorer son infrastructure locale, cela demande de configurer le serveur nagios ainsi que nagios-nrpe sur les hosts monitorés afin de pouvoir effectuer des opérations de check localement.
L’installation se fait à partir des sources de Nagios.
Attention toutes les opérations se font sur le compte root, il faut donc avoir effectué un sudo -u root bash
$ sudo dd bs=1m if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/disk6 ; sync
Password:
1760+0 records in
1760+0 records out
1845493760 bytes transferred in 443.168437 secs (4164317 bytes/sec)Pour le premier boot brancher un écran un clavier et une souris (enfin si nécessaire), il est conseillé d’activer ssh ainsi par la suite plus besoin de clavier / souris / ecran on peut se connecter a distance sur le Pi.
Nous allons réaliser l’installation à partir des sources, il faut différencier l’installation du serveur Nagios et de l’agent sur les hosts à monitorer, cet agent n’est nécessaire que si l’on souhaite réaliser des taches locales, si l’objectif est juste de vérifier qu’un port réseau est bien à l’écoute cela ne sera pas nécessaire.
Dans un second temps nous verrons la configuration du serveur Nagios et des hosts à monitorer.
Il est en général nécessaire d’installer 3 packages sur le serveur. 1. Serveur Nagios Core 2. Plugins Nagios 3. NRPE
La procédure d’installation du serveur Nagios se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation. Nagios Core
Celui ci est nécessaire dans tous les cas.
La procédure d’installation des plugins Nagios se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation, l’installation des plugins est décrite un peu plus bas dans la page d’installation de Nagios Core. Nagios Core
Les plugins sont nécessaires sur le serveur Nagios si il est souhaité de monitorer aussi le serveur nagios, soit par lui meme soit par un autre serveur Nagios afin de faire du check croisé.
La procédure d’installation de NRPE se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation. https://support.nagios.com/kb/article/nrpe-how-to-install-nrpe-v4-from-source-515.html#Raspbian
NRPE est nécessaire si vous souhaitez réaliser des check_nrpe depuis le serveur Nagios, cela sera abordé un peu plus loin.
Pour monitorer un host il y a deux possibilités, soit on va juste vérifier qu’un port réseau (TCP ou UDP) est en écoute depuis le serveur, dans ce cas aucune autre installation supplémentaire n’est nécessaire, soit on souhaite réaliser des check un peu plus fins localement et dans ce cas il faudra prévoir l’installation de NRPE et des Nagios Plugins.
La procédure d’installation des plugins Nagios se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation, l’installation des plugins est décrite un peu plus bas dans la page d’installation de Nagios Core. Nagios Core
Les plugins sont nécessaires sur le serveur Nagios si il est souhaité de monitorer aussi le serveur nagios, soit par lui meme soit par un autre serveur Nagios afin de faire du check croisé.
La procédure d’installation de NRPE se trouve sur le site de référence, il suffit de suivre les instructions en fonction de son système d’exploitation. https://support.nagios.com/kb/article/nrpe-how-to-install-nrpe-v4-from-source-515.html#Raspbian
NRPE est nécessaire si vous souhaitez réaliser des check_nrpe depuis le serveur Nagios, cela sera abordé un peu plus loin.
Avant tout il faut commencer par quelques configuration, dans un premier temps nous allons juste configurer nagios pour qu’il check les hosts et les services réseau qui sont en écoute sur chacun d’eux, dans un second temps nous verrons pour faire évoluer les checks par nrpe afin d’affiner un peu ce qui sera surveillé par Nagios.
Dans un premier temps il faut commencer par faire quelques configurations dans les fichiers de Nagios.
Ajouter dans ce fichier ses commandes, par exemple ici des commandes de notification par gmail ou par SMS.
define command{
command_name notify-host-by-gmail
command_line /usr/local/nagios/libexec/notify-by-gmail TODO@gmail.com TODO_PASSWORD smtp.gmail.com 587 $CONTACTEMAIL$ "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" "***** Nagios ***** NotificationType:$NOTIFICATIONTYPE$ Host:$HOSTNAME$ State:$HOSTSTATE$ Address:$HOSTADDRESS$ Info:$HOSTOUTPUT$ Date/Time:$LONGDATETIME$"
}
define command{
command_name notify-service-by-gmail
command_line /usr/local/nagios/libexec/notify-by-gmail TODO@gmail.com TODO_PASSWORD smtp.gmail.com 587 $CONTACTEMAIL$ "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" "***** Nagios ***** NotificationType:$NOTIFICATIONTYPE$ Service:$SERVICEDESC$ Host:$HOSTALIAS$ Address:$HOSTADDRESS$ State:$SERVICESTATE$ Date/Time:$LONGDATETIME$ AdditionalInfo:$SERVICEOUTPUT$"
}define command{
command_name notify-host-by-sms
command_line /usr/local/nagios/libexec/notify-by-sms $CONTACTPAGER$ $CONTACTNAME$ "$NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$:$HOSTADDRESS$ is $HOSTSTATE$"
}
define command{
command_name notify-service-by-sms
command_line /usr/local/nagios/libexec/notify-by-sms $CONTACTPAGER$ $CONTACTNAME$ "$NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}Il est possible de mettre en place des commandes de notification comme on le souhaite, par exemple par des API il est possible de provoquer des notifications dans Slack , Telegram ….
define contact{
contact_name Patrice_Trognon
alias admin
contactgroups admins
host_notifications_enabled 1
service_notifications_enabled 1
host_notification_period 24x7
service_notification_period 24x7
host_notification_options d,u,r,f
service_notification_options u,c,r,f
host_notification_commands notify-host-by-gmail,notify-host-by-sms
service_notification_commands notify-service-by-gmail,notify-service-by-sms
email TODO_YOUR_EMAIL@gmail.com
pager TODO_YOUR_06
}
define contactgroup {
contactgroup_name admins
alias Nagios Administrators
members nagiosadmin,Patrice_Trognon
}Dans le contact pour utiliser les notifications par gmail que nous avons définit dans le fichier commands.cfg il faut penser a modifier ces deux lignes.
service_notification_commands notify-service-by-gmail ; send service notifications via email
host_notification_commands notify-host-by-gmail ; send host notifications via emailAttention il faut supprimer le hostgroup de ce fichier car il est déjà définit dans le fichier localhost.cfg
use : indique le template à utiliser, celui ci doit etre définit dans le fichier templates.cfg address : l’ip ou le nom dns du host.
define host{
use linux-server
host_name dns0
alias DNS0
address dns0.local.boxadmin.com
}
define host{
use linux-server
host_name dhcp0
alias DHCP0
address dhcp0.local.boxadmin.com
}
define host{
use linux-server
host_name gammu1
alias gammu1
address gammu1.local.boxadmin.com
}
define host{
use linux-server
host_name gammu2
alias gammu2
address gammu2.local.boxadmin.com
}
define host{
use linux-server
host_name torproxy
alias torproxy
address torproxy.local.boxadmin.com
}
define host{
use linux-server
host_name asterisk
alias asterisk
address asterisk.local.boxadmin.com
}
define host{
use linux-server
host_name mint
alias mint
address mint.local.boxadmin.com
}
define host{
use linux-server
host_name kubuntu
alias kubuntu
address kubuntu.local.boxadmin.com
}Dans un premier temps nous allons nous contenter de définir le check de services réseau sur chaque hosts qui sont capables de répondre sur l’ip, il s’agit alors d’un simple check_tcp (ou check_udp) ainsi que le check par un ping du host.
Exemple de définition d’un service de type ping sur le host dns0.
#------------------------------
# dns0.local.boxadmin.com
#------------------------------
define service{
use generic-service
host_name dns0
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}Dans mon infra j’ai le DNS et le DHCP qui sont en écoute en UDP, pour les trouver nous allons utiliser les commandes lsof et regarder dans le fichier /etc/services
Par exemple sur le host qui fait tourner le DNS cela donne
Pour trouver à quel port cela corresponds il faut chercher dans le fichier /etc/services
sur celui qui fait tourner le DHCP voici le résultat :
Pour trouver à quel port cela corresponds il faut chercher dans le fichier /etc/services
Sur le host faisant tourner le serveur DNS voici ce que donne la recherche
$> lsof | grep LISTEN
nrpe 504 nagios 4u IPv4 11170 0t0 TCP *:nrpe (LISTEN)
exim4 5324 Debian-exim 3u IPv4 26304578 0t0 TCP localhost:smtp (LISTEN)
sshd 5627 root 3u IPv4 26303903 0t0 TCP *:ssh (LISTEN)
named 32302 32308 isc-socke bind 21u IPv6 33757337 0t0 TCP *:domain (LISTEN)$> grep -E 'nrpe|smtp|ssh' /etc/services
ssh 22/tcp # SSH Remote Login Protocol
smtp 25/tcp mail
[...]
nrpe 5666/tcp # Nagios Remote Plugin ExecutorUne fois touvé les process en écoute sur TCP ou UDP sur chaque host, il est conseillé de réaliser un test depuis le serveur nagios avant de programmer les regles de check dans nagios, cela va permettre de vérifier que le serveur nagios parvient bien a joindre les hosts sur les ports indiqués, et donc d’eliminer par exemple un firewall qui bloquerait le traffic.
Pour cela il suffit de se placer sur le serveur Nagios dans le répertoire /usr/local/nagios/libexec
sur DNS0 nous avons trouvé 3 service en écoute sur TCP, respectivement sur les ports 5666 22 et 53, voici comment les tester
$> ./check_tcp -H dns0.local.boxadmin.com -p 5666
TCP OK - 0.006 second response time on dns0.local.boxadmin.com port 5666|time=0.005706s;;;0.000000;10.000000
$> ./check_tcp -H dns0.local.boxadmin.com -p 22
TCP OK - 0.006 second response time on dns0.local.boxadmin.com port 22|time=0.005869s;;;0.000000;10.000000
$> ./check_tcp -H dns0.local.boxadmin.com -p 53
TCP OK - 0.006 second response time on dns0.local.boxadmin.com port 53|time=0.005847s;;;0.000000;10.000000sur DHCP0 nous avons trouvé 2 service en écoute sur TCP, respectivement sur les ports 5666 et 22, voici comment les tester
$> ./check_tcp -H dhcp0.local.boxadmin.com -p 22
TCP OK - 0.005 second response time on dhcp0.local.boxadmin.com port 22|time=0.005243s;;;0.000000;10.000000
$> ./check_tcp -H dhcp0.local.boxadmin.com -p 9666
connect to address dhcp0.local.boxadmin.com and port 9666: Connection refused
$> ./check_dhcp -s dhcp0.local.boxadmin.com
OK: Received 1 DHCPOFFER(s), 1 of 1 requested servers responded, max lease time = 600 sec.#------------------------------
# dns0.local.boxadmin.com
#------------------------------
define service{
use generic-service
host_name dns0
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}
define service{
use generic-service
host_name dns0
service_description NRPE
check_command check_tcp!5666
}
define service{
use generic-service
host_name dns0
service_description ssh
check_command check_ssh
}
#------------------------------
# dhcp0.local.boxadmin.com
#------------------------------
define service{
use generic-service
host_name dhcp0
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}
define service{
use generic-service
host_name dhcp0
service_description NRPE
check_command check_tcp!5666
}
define service{
use generic-service
host_name dhcp0
service_description ssh
check_command check_ssh
}il faut continuer pour chaque host bien entendu.
$> grep nagios /var/log/syslog
Jan 3 07:19:53 nagios nagios: Successfully launched command file worker with pid 5019
Jan 3 07:22:02 nagios nagios: job 0 (pid=5061): read() returned error 11
Jan 3 07:22:02 nagios nagios: wproc: Core Worker 5017: job 0 (pid=5061) timed out. Killing it
Jan 3 07:22:02 nagios nagios: wproc: CHECK job 0 from worker Core Worker 5017 timed out after 30.04s
Jan 3 07:22:02 nagios nagios: wproc: host=gammu1; service=(null);
Jan 3 07:22:02 nagios nagios: wproc: early_timeout=1; exited_ok=0; wait_status=0; error_code=62;
Jan 3 07:22:02 nagios nagios: Warning: Check of host 'gammu1' timed out after 30.04 seconds
Jan 3 07:22:02 nagios nagios: HOST ALERT: gammu1;DOWN;SOFT;1;(Host check timed out after 30.04 seconds)
Jan 3 07:22:03 nagios nagios: wproc: Core Worker 5017: job 0 (pid=5061): Dormant child reaped
Jan 3 07:23:32 nagios nagios: job 2 (pid=5099): read() returned error 11
Jan 3 07:23:32 nagios nagios: wproc: Core Worker 5013: job 2 (pid=5099) timed out. Killing it
Jan 3 07:23:32 nagios nagios: wproc: CHECK job 2 from worker Core Worker 5013 timed out after 30.02s
Jan 3 07:23:32 nagios nagios: wproc: host=gammu1; service=(null);
Jan 3 07:23:32 nagios nagios: wproc: early_timeout=1; exited_ok=0; wait_status=0; error_code=62;
Jan 3 07:23:32 nagios nagios: Warning: Check of host 'gammu1' timed out after 30.02 seconds
Jan 3 07:23:32 nagios nagios: HOST ALERT: gammu1;DOWN;SOFT;2;(Host check timed out after 30.02 seconds)
Jan 3 07:23:33 nagios nagios: wproc: Core Worker 5013: job 2 (pid=5099): Dormant child reaped
Jan 3 07:23:41 nagios nagios: SERVICE ALERT: mint;NRPE;CRITICAL;SOFT;1;connect to address mint.local.boxadmin.com and port 5666: Connection refusedEn regardant dans les logs on voit la sortie des commandes de check, ici par exemple on constate que le host gammu1 est down, que le host ‘mint’ est up mais il ne parvient pas a vérifier l’état du port 5666
Pour se connecter sur son serveur nagios il faut aller depuis un navigateur sur http://nagios.local.boxadmin.com/nagios (remplacer nagios.local.boxadmin.com par le nom dns de son serveur nagios bien sur), ensuite il faut s’identifier, puis clicker sur Services a gauche afin de voir la liste des services, cela va demander un certain temps pour qu’ils passent en vert.
DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi