Table des matières

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.