Installation d'Icinga 2
Icinga est un fork de Nagios. C’est un logiciel de monitoring qui surveille le système et le réseau de votre serveur. Il va surveiller tout un tas de service (ssh, smtp, http, etc) ainsi que l’espace disque ou encore la charge système et vous envoyer un mail à chaque alerte.
Je vais détailler l'installation multi-serveur.
Le fonctionnement d’Icinga2 en multi serveur est très simple : il y a un serveur maître et un ou plusieurs serveurs clients. Les serveurs clients vont être synchronisés avec le maître afin que ce dernier puisse leur faire exécuter des vérifications à distance (mais exécutées en local sur le client) et que les clients puissent lui renvoyer les résultats de ces vérifications. Icingaweb2 n’est installé que sur le serveur maître vu que le résultat de toutes les vérifications vont remonter au maître. Le serveur maître peut bien évidemment lancer des vérifications en local.
Pour information, j’ai choisi cette configuration vu que je n’ai que deux serveurs à surveiller (mon serveur OVH et mon Raspberry, respectivement le maître et le client) mais il existe d’autres configurations. En plus du maître et du/des client(s), il peut y avoir des satellites placés entre le maître et les clients. N’ayant pas besoin d’une telle configuration, je ne me suis pas renseigné sur l’utilité de rajouter un satellite. J’imagine que ça permet de pouvoir lancer des tests sur des serveurs clients accessibles en local depuis le serveur satellite mais pas reliés à Internet. Vous pouvez également avoir plusieurs serveurs maîtres, qui sont des répliques, afin d’éviter que votre système de surveillance ne fonctionne plus en cas de panne du serveur maître.
Comme d’hab, toutes les commandes sont à lancer en root.
Installation
Installation du serveur maître
La version d’Icinga présente dans les dépôts de Debian datant un peu, on va récupérer la version directement du dépôt d’Icinga. On va commencer par importer la clé d’Icinga, servant à vérifier les paquets.
aptitude install apt-transport-https wget gnupg
wget -O - https://packages.icinga.com/icinga.key | gpg --dearmor -o /usr/share/keyrings/icinga-archive-keyring.gpg
Maintenant ouvrez le fichier
/etc/apt/sources.list
Ajoutez à la fin les lignes suivantes
# dépôt Icinga deb [signed-by=/usr/share/keyrings/icinga-archive-keyring.gpg] http://packages.icinga.com/debian icinga-bookworm main deb-src [signed-by=/usr/share/keyrings/icinga-archive-keyring.gpg] http://packages.icinga.com/debian icinga-bookworm main
Le dépôt d’Icinga est maintenant rajouté dans notre liste de dépôts.
Mettez à jour la liste des paquets
aptitude update
On peut donc passer à l’installation.
aptitude install icinga2 icingaweb2 icinga2-ido-mysql monitoring-plugins icingaweb2-module-monitoring icingacli
Icingaweb2 est l’interface web de Icinga et monitoring-plugins est une collection de plugins compatible Nagios/Icinga. Vous allez voir des fenêtres apparaître.
Répondez “Oui”.
Choisissez un mot de passe puis retapez-le dans la fenêtre d’après.
Choisir “Oui”.
Installation du serveur client
Prérequis
Tout d’abord, il va vous falloir un serveur de base de donnée SQL. On va installer MariaDB
aptitude install mariadb-server php-mysql
php-mysql sert à ce que PHP puisse dialoguer avec le serveur MariaDB.
Passons à l’installation d’Icinga2.
Installation d’Icinga2 sur le Raspberry
Comme sur Debian, on va ajouter le dépôt d'Icinga2 afin de récupérer la version plus récente d’Icinga2.
wget -O - https://packages.icinga.com/icinga.key | gpg --dearmor -o /usr/share/keyrings/icinga-archive-keyring.gpg
Maintenant ouvrez le fichier
/etc/apt/sources.list
Ajoutez à la fin les lignes suivantes
# dépôt Icinga deb [signed-by=/usr/share/keyrings/icinga-archive-keyring.gpg] http://packages.icinga.com/debian icinga-bookworm main deb-src [signed-by=/usr/share/keyrings/icinga-archive-keyring.gpg] http://packages.icinga.com/debian icinga-bookworm main
Le dépôt d’Icinga est maintenant rajouté dans notre liste de dépôts.
Il ne reste plus qu’à mettre à jour les dépôts et installer Icinga2 et les plugins
aptitude update && aptitude install icinga2 monitoring-plugins
On va activer le module api (obligatoire) ainsi que le module debuglog (optionnel) qui nous sera utile si jamais Icinga2 rencontre des problèmes
icinga2 feature enable api debuglog
Y a pas plus à faire au niveau de l’installation pour le client. On va donc pouvoir passer à la configuration.
Configuration
Configuration du serveur maître
Activez le module setup
icingacli module enable setup
Générez un token afin de vous identifier plus tard sur l’interface (retenez le token)
icingacli setup token create
Sur Debian, on doit créer la base de donnée à la main
mysql
Rentrez le mot de passe de l’administrateur mysql. Une fois connecté à mysql, créez la base de donnée icingaweb2:
CREATE DATABASE icingaweb2;
Créez un administrateur local de cette base (changez motdepasse par votre mot de passe)
GRANT ALL ON icingaweb2.* TO icingaweb2@localhost IDENTIFIED BY 'motdepasse';
Tapez “quit” pour quitter mysql.
Configurez l’API Icinga 2 pour le monitoring
icinga2 api setup
Ouvrez ensuite le fichier
/etc/icinga2/conf.d/api-users.conf
Modifiez-le afin d’avoir ceci (remplacez l’utilisateur et le mot de passe par celui qui vous avez choisi)
/** * The APIUser objects are used for authentication against the API. */ object ApiUser "fate" { password = "motdepasse" // client_cn = "" permissions = [ "*" ] }
Icinga fonctionne avec des modules, tous désactivés par défaut (du moins sur mon installation).
Vous pouvez activer un module avec la commande suivante
icinga2 feature enable nomdumodule
Pour voir tous les modules disponibles et ceux qui sont actifs et inactifs
icinga2 feature list
Il faut au moins que Checker, api, ido-mysql et notification soient actifs. Voici les modules que j’ai activés : api checker ido-mysql mainlog notification. Mainlog sert à afficher les erreurs dans les fichiers de log.
Redémarrez Icinga
systemctl restart icinga2.service
Allez sur la page votrenomdedomaine/icingaweb2/setup.
Rentrez le token créé précédemment puis cliquez sur Next.
Choisissez les modules que vous voulez (activer au moins “Monitoring”) puis appuyez sur “Next” (pour ma part j’ai activé Doc, Monitoring et Translation)
Sur cette page, Icinga va vérifier que vous ayez les pré-requis nécessaire au bon fonctionnement du logiciel. Pour ma part j’avais l’erreur The PHP config `date.timezone' is not defined. et le warning The PHP module PDO-PostgreSQL is missing. Comme j’utilise une base de donnée mysql, je n’ai pas besoin du module PostgreSQL, mais j’ai besoin de corriger l’erreur de la timezone.
Ouvrez le fichier
/etc/php/7.0/apache2/php.ini
Remplacez la ligne
;date.timezone =
par
date.timezone = Europe/Paris
Redémarrez Apache
systemctl restart apache2.service
Sur la page d’Icinga, cliquez sur Refresh. L’erreur devrait avoir disparue et vous devriez pouvoir cliquer sur Next.
Choisissez “database” pour le type d’authentification puis cliquez sur Next.
Remplissez les champs comme sur l’image et dans Password le mot de passe que vous avez choisi lorsque nous avons créé la base de donnée manuellement. Puis cliquez sur Validate Configuration. Si tout fonctionne, vous aurez le message “The configuration has been successfully validated.” comme sur l’image et vous pourrez cliquer sur Next.
Laissez le nom par défaut et cliquez sur “Next”.
Remplissez les champs en mettant le nom et le mot de passe que vous souhaitez, puis cliquez sur “Next”.
Sur la fenêtre d’après, laissez tout par défaut et cliquez sur “Next”
Cliquez également sur “Next” sur la fenêtre d’après ainsi que celle qui suit.
Sur la fenêtre “Monitoring Backend” laissez les valeurs par défaut et cliquez sur “Next”
Remplissez les champs comme sur l’image et mettant le mot de passe que vous avez choisi lors de l’installation de icinga2-ido-mysql. Cliquez sur “Validate Configuration” et vous devriez avoir le message “The configuration has been successfully validated.”.
Cliquez sur Next.
Remplissez les champs comme sur l’image en mettant le nom et le mot de passe que vous voulez, puis cliquez sur “Next”.
Laissez les valeurs par défaut sur la prochaine fenêtre et cliquez sur “Next”.
Sur la fenêtre suivante, cliquez sur “Finish”. Vous pouvez maintenant vous connecter à Icinga.
lancez la commande suivante
icinga2 node wizard
Vous allez avoir une série de question, répondez comme suit :
Welcome to the Icinga 2 Setup Wizard! We will guide you through all required configuration details. Please specify if this is a satellite/client setup ('n' installs a master setup) [Y/n]: n Starting the Master setup routine... Please specify the common name (CN) [FQDNduserveur]: FQDNduserveur Reconfiguring Icinga... Checking for existing certificates for common name 'FQDNduserveur'... Generating master configuration for Icinga 2. 'api' feature already enabled. Master zone name [master]: Default global zones: global-templates director-global Do you want to specify additional global zones? [y/N]: Please specify the API bind host/port (optional): Bind Host []: Bind Port []: Do you want to disable the inclusion of the conf.d directory [Y/n]: n Done. Now restart your Icinga 2 daemon to finish the installation!
Pour le common name, par convention, on met le FQDN.
Il ne vous reste plus qu’à redémarrer Icinga2
systemctl restart icinga2
On passe à la configuration du client (mon Raspberry dans mon cas)
Configuration du client
On utilise la même commande pour la configuration,
icinga2 node wizard
Vous allez de nouveau avoir une série de question auxquelles il faudra répondre un peu différemment
Welcome to the Icinga 2 Setup Wizard! We will guide you through all required configuration details. Please specify if this is a satellite/client setup ('n' installs a master setup) [Y/n]: y Starting the Client/Satellite setup routine... Please specify the common name (CN) [FQDNduclient]: FQDNduclient Please specify the parent endpoint(s) (master or satellite) where this node should connect to: Master/Satellite Common Name (CN from your master/satellite node): FQDNduserveurmaître Do you want to establish a connection to the parent node from this node? [Y/n]:y Please specify the master/satellite connection information: Master/Satellite endpoint host (IP address or FQDN): IPduserveurmaître/FQDNduserveurmaître Master/Satellite endpoint port [5665]: 5665 Add more master/satellite endpoints? [y/N]:n Parent certificate information: Subject: CN = FQDNduserveurmaître Issuer: CN = Icinga CA Valid From: Sep 7 13:41:24 2017 GMT Valid Until: Sep 3 13:41:24 2032 GMT Fingerprint: AC 99 8B 2B 3D B0 01 00 E5 21 FA 05 2E EC D5 A9 EF 9E AA E3 Is this information correct? [y/N]: y Please specify the request ticket generated on your Icinga 2 master (optional). (Hint: # icinga2 pki ticket --cn 'FQDNduclient'): 4f75d2ecd253575fe9180938ebff7cbca262f96e Please specify the API bind host/port (optional): Bind Host []: Bind Port []: Accept config from parent node? [y/N]: y Accept commands from parent node? [y/N]: y Reconfiguring Icinga... Done. Now restart your Icinga 2 daemon to finish the installation!
La phrase suivante va apparaître
(Hint: # icinga2 pki ticket –cn ‘icinga2-client1.localdomain’):
Lancez la commande indiquée sur le serveur maître. Il va communiquer avec le client et vous donner une clé qu’il faudra ensuite rentrer dans la fenêtre de configuration du client.
Il ne vous reste plus qu’à redémarrer Icinga2 sur le client et le maître
systemctl restart icinga2
On va pouvoir passer à la création des services sur le serveur maître et voir comment faire pour qu’ils soient lancés sur le client.
Création des services clients
Sur le client, ouvrez le fichier
/etc/icinga2/zones.conf
Ajoutez les lignes suivantes
object Endpoint "FQDNdumaître" { host = "FQDNdumaître" port = "5665" } object Endpoint "FQDNduclient" { host = "FQDNduclient" port = "5665" } object Zone "master" { endpoints = [ "FQDNdumaître" ] } object Zone "FQDNduclient" { endpoints = [ "FQDNduclient" ] parent = "master" }
Petite explication. On commence par créer deux “Endpoint”, un correspondant au serveur maître et un autre correspondant au client. Un “Endpoint” sert à donner à Icinga2 les informations nécessaires pour pouvoir lancer des tests sur une machine distante. On indique le host (adresse ip ou nom de domaine correspondant à la machine) et le port sur lequel se connecter (il faut évidemment que ce port soit accessible). On crée ensuite deux zones, une zone nommée “master” à laquelle on lie le endpoint du serveur maître, et une zone client qu’on lie au endpoint du client et où on indique également qu’elle est une zone enfant de la zone “master”. Ainsi, on fait comprendre à Icinga2 que la zone “master” ordonnera les tests qui seront effectués sur la zone client.
Il faut faire exactement la même chose sur le serveur maître.
Sur le serveur maître, ouvrez le fichier
/etc/icinga2/zones.d/master/hosts.conf
Ajoutez les lignes suivantes
object Host "FQDNduclient" { /* Import the default host template defined in `templates.conf`. */ import "generic-host" /* Specify the address attributes for checks e.g. `ssh` or `http`. */ address = "127.0.0.1" address6 = "::1" vars.endpoint = "FQDNduclient" vars.disks["disk /"] = { disk_partitions = "/" disk_units = "GB" } /* Modify ssh port number */ vars.ssh_port = portssh /* Set custom attribute `os` for hostgroup assignment in `groups.conf`. */ vars.os = "Raspbian" /* Define http vhost attributes for service apply rules in `services.conf`. */ vars.http_vhosts["http"] = { http_uri = "/" } /* Define notification mail attributes for notification apply rules in `notifications.conf`. */ vars.notification["mail"] = { /* The UserGroup `icingaadmins` is defined in `users.conf`. */ groups = [ "icingaadmins" ] } }
Pensez à changer “portssh” par le port que vous utilisez sur votre client (cette modification est expliquée dans cette page). On a rajouté un host correspondant au client. Attention, la valeur de la variable “vars.endpoint” doit absolument correspondre au nom du endpoint du client que vous avez rentré dans le fichier zones.conf. Il vous faudra également ajouter la ligne vars.endpoint = “FQDNduserveurmaître” dans le host du serveur maître (toujours dans le fichier hosts.conf). Là aussi, il faut que le nom du endpoint corresponde.
Le fait de rajouter cette ligne dans le host du client et du maître va faire qu’Icinga2 va pouvoir se connecter à distance au client et lui ordonner de lancer X test (selon ce que vous lui demanderez de lancer comme test) en local. Vous vous demandez peut-être comment ça marche en détail et pourquoi les deux hosts ont la même ip (qui représente l’ip locale) ? Le Icinga2 maître va se connecter au Icinga2 client via le endpoint créé dans le fichier zones.conf, puis il va ordonner au Icinga2 client de lancer un test, la place restante sur le disque dur par exemple, sur l’ip renseignée dans le host client du fichier hosts.conf. Icinga2 client va donc lancer le test demandé sur l’IP renseignée dans le host, 127.0.0.1, donc en local. Une fois le test effectué, il va envoyer le résultat au Icinga2 maître via le endpoint maître créé dans le fichier zones.conf
Il ne nous reste plus qu’à configurer les services
Ouvrez le fichier
/etc/icinga2/zones.d/master/services.conf
Par défaut vous devez avoir un certain nombre de services déjà actif, comme “ping4” par exemple. Il doit ressembler à ça :
apply Service "ping" { import "generic-service" check_command = "ping" assign where host.address }
C’est un service qui lance la commande ping sur tous les host qui ont une adresse ip renseignée. Si on le laisse tel quel, il va lancer le test sur le host maître et sur le host client en utilisant l’IP renseignée (127.0.0.1) pour chaque host, sans utiliser le endpoint. Les deux tests vont donc être lancés en local sur le maître. Pour utiliser le endpoint, on va devoir faire une petite modif
apply Service "ping4" { import "generic-service" check_command = "ping4" command_endpoint = host.vars.endpoint assign where host.vars.endpoint }
La ligne assign where host.address a été remplacée par assign where host.vars.endpoint et la ligne command_endpoint = host.vars.endpoint a été ajoutée. assign where host.vars.endpoint signifie que ce test s’exécutera sur tous les hosts qui ont une variable “vars.endpoint” et command_endpoint = host.vars.endpoint signifie que le test s’effectuera via le endpoint renseigné dans le host.
Si vous n’avez que très peu de service commun entre le maître et le client, vous pouvez créer la variable vars.maitre_endpoint = “FQDNduserveurmaître” pour le host du maître et vars.client_endpoint = “FQDNduclient” pour le host du client et dans le fichier services.conf, puis assigner un service soit au maître soit au client en mettant soit assign where host.vars.client_endpoint et command_endpoint = host.vars.client_endpoint pour le client, soit assign where host.vars.maitre_endpoint et command_endpoint = host.vars.maitre_endpoint pour le maître. Dans mon cas, comme j’ai beaucoup de services communs à mon serveur OVH et mon Raspberry, j’ai préféré créer une variable “endpoint” globale.
Voilà, il ne vous reste plus qu’à redémarrer Icinga2 sur le maître et le client et tout devrait fonctionner.
Désactiver la re-notification
Icinga2 a un comportement un peu con, il envoie un mail toutes les X minutes tant qu’un problème n’est pas résolu. Personnellement j’ai assez de neurones pour comprendre avec une seule notification qu’il y a un souci. On va donc changer ce comportement.
Sur le serveur maître, ouvrez le fichier
/etc/icinga2/conf.d/templates.conf
Vous devriez trouver les lignes
template Notification "mail-host-notification" {
et
template Notification "mail-service-notification" {
Sous chacune de ces lignes, il y a ligne
period = "24x7"
Pour désactiver la re-notification, il vous suffit de rajouter en dessous la ligne
interval = 0 // disable re-notification
Vous devriez avoir quelque chose qui ressemble à ça :
/** * Provides default settings for host notifications. * By convention all host notifications should import * this template. */ template Notification "mail-host-notification" { command = "mail-host-notification" states = [ Up, Down ] types = [ Problem, Acknowledgement, Recovery, Custom, FlappingStart, FlappingEnd, DowntimeStart, DowntimeEnd, DowntimeRemoved ] vars += { // notification_icingaweb2url = "https://www.example.com/icingaweb2" // notification_from = "Icinga 2 Host Monitoring <icinga@example.com>" notification_logtosyslog = false } period = "24x7" interval = 0 // disable re-notification } /** * Provides default settings for service notifications. * By convention all service notifications should import * this template. */ template Notification "mail-service-notification" { command = "mail-service-notification" states = [ OK, Warning, Critical, Unknown ] types = [ Problem, Acknowledgement, Recovery, Custom, FlappingStart, FlappingEnd, DowntimeStart, DowntimeEnd, DowntimeRemoved ] vars += { // notification_icingaweb2url = "https://www.example.com/icingaweb2" // notification_from = "Icinga 2 Service Monitoring <icinga@example.com>" notification_logtosyslog = false } period = "24x7" interval = 0 // disable re-notification }
Il ne vous reste plus qu’à redémarrer Icinga2.