wiki/HowtoIcinga.md

604 lines
26 KiB
Markdown
Raw Normal View History

2017-04-19 11:58:36 +02:00
---
2017-04-19 15:17:06 +02:00
categories: monitoring
title: Howto Icinga
2017-04-19 11:58:36 +02:00
---
2017-06-07 18:38:38 +02:00
* Documentation : <https://docs.icinga.com/>
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
[Icinga](https://www.icinga.com/) est un logiciel libre de surveillance système et réseau d'équipements. Au départ (en 2009), c'est un fork de [Nagios](https://www.nagios.com/) avec pour objectifs davantage d'évolutivité et une interface web plus moderne. La version 1 d'Icinga a une configuration compatible avec Nagios, ce qui n'est pas le cas de la version 2 qui a été complètement ré-écrite.
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
Après avoir utilisé Nagios pendant plus de 10 ans, nous utilisons désormais Icinga.
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
_Cette documentation concerne Icinga version 2._
2016-12-29 11:25:39 +01:00
2017-04-18 18:27:22 +02:00
## Installation
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
Nous utilisons les paquets d'icinga.com car l'interface web n'est pas présente dans les paquets officiels Debian 8.
2016-12-29 11:25:39 +01:00
~~~
2017-02-24 14:32:03 +01:00
# echo 'deb http://packages.icinga.com/debian icinga-jessie main' >/etc/apt/sources.list.d/icinga.list
2017-06-09 03:36:16 +02:00
# wget -O - http://packages.icinga.com/icinga.key | apt-key add -
~~~
~~~
2017-02-24 14:32:03 +01:00
# apt install icinga2
2017-06-08 14:48:55 +02:00
# icinga2 --version
icinga2 - The Icinga 2 network monitoring daemon (version: r2.6.3-1)
Copyright (c) 2012-2017 Icinga Development Team (https://www.icinga.com/)
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl2.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Application information:
Installation root: /usr
Sysconf directory: /etc
Run directory: /run
Local state directory: /var
Package data directory: /usr/share/icinga2
State path: /var/lib/icinga2/icinga2.state
Modified attributes path: /var/lib/icinga2/modified-attributes.conf
Objects path: /var/cache/icinga2/icinga2.debug
Vars path: /var/cache/icinga2/icinga2.vars
PID path: /run/icinga2/icinga2.pid
System information:
Platform: Debian GNU/Linux
Platform version: 8 (jessie)
Kernel: Linux
Kernel version: 3.16.0-4-amd64
Architecture: x86_64
Build information:
Compiler: GNU 4.9.2
Build host: smithers
~~~
2017-06-09 03:36:16 +02:00
## Architecture
Icinga peut avoir différents rôles :
* nœud **master** : serveur central
* nœud **satellite** : pour le mode cluster, serveur rattaché au nœud master pour de la haute disponibilité
* nœud **client** : serveur chargé de lancer des commandes locales (semblable à un serveur *nrpe*)
On peut également découper la configuration Icinga en différentes zones où seront regroupées des nœuds master et satellite. Cette notion de zone permet d'avoir des nœuds distants, par exemple répartis dans plusieurs pays. (TODO: est-ce qu'une zone est super-master avec un noeud master qui contient toute la conf ??). Si l'on utilise un nœud client, il aura généralement sa propre zone.
2017-06-08 14:48:55 +02:00
2017-06-09 03:36:16 +02:00
TODO : comprendre si le schéma a bien un intérêt... (il parle de satellite alors que facultatif ? et ne parle pas de zones ?)
![Illustration des noms des rôles dans Icinga2](howtoicinga_distributed_roles.png)
## Configuration
2017-06-08 14:48:55 +02:00
~~~
/etc/icinga2
├── conf.d
2017-06-09 03:36:16 +02:00
│ └── *.conf
2017-06-08 14:48:55 +02:00
├── constants.conf
├── features-available
2017-06-09 03:36:16 +02:00
│ └── *.conf
2017-06-08 14:48:55 +02:00
├── features-enabled
2017-06-09 03:36:16 +02:00
│ └── *.conf
2017-06-08 14:48:55 +02:00
├── icinga2.conf
├── init.conf
├── pki
├── repository.d
2017-06-09 03:36:16 +02:00
│ └── README
2017-06-08 14:48:55 +02:00
├── scripts
2017-06-09 03:36:16 +02:00
│ ├── mail-host-notification.sh
│ └── mail-service-notification.sh
2017-06-08 14:48:55 +02:00
├── zones.conf
└── zones.d
└── README
~~~
2017-06-09 03:36:16 +02:00
La configuration d'Icinga se base sur des objets de types différents : l'objet **Host** définit une machine surveillée alors que l'objet **Service** définit un service rattaché à une machine. Voir [description détaillée de tous les objets](http://docs.icinga.org/icinga2/latest/doc/module/icinga2/chapter/object-types).
2017-06-08 14:48:55 +02:00
2017-06-09 03:36:16 +02:00
Le nom des fichiers contenant les objets n'est pas important, mais une bonne pratique est de séparer ses objets dans des fichiers du type `/etc/icinga2/zones.d/<ZONE>/hosts.conf` et `/etc/icinga2/zones.d/<ZONE>/services.conf` (si il n'y a qu'une zone, on peut l'appeler _master_).
2017-06-08 14:48:55 +02:00
2017-06-09 03:36:16 +02:00
### Configuration nœud master
2017-06-08 14:48:55 +02:00
2017-06-09 03:36:16 +02:00
On utilise l'assistant de configuration : il se chargera d'activer l'API et de créer une autorité de certification pour l'authentification avec les éventuels autres nœuds.
2016-12-29 11:25:39 +01:00
~~~
# icinga2 node wizard
2017-06-08 14:48:55 +02:00
Welcome to the Icinga 2 Setup Wizard!
We'll guide you through all required configuration details.
Please specify if this is a satellite setup ('n' installs a master setup) [Y/n]: n
Starting the Master setup routine...
2017-06-08 17:37:14 +02:00
Please specify the common name (CN) [icinga2-master]:
Checking for existing certificates for common name 'icinga2-master'...
2017-06-08 14:48:55 +02:00
Certificates not yet generated. Running 'api setup' now.
information/cli: Generating new CA.
2017-06-09 03:36:16 +02:00
[...]
2017-06-08 14:48:55 +02:00
Done.
Now restart your Icinga 2 daemon to finish the installation!
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
# systemctl restart icinga2
2016-12-29 11:25:39 +01:00
~~~
2017-06-09 03:36:16 +02:00
### Configuration interface web
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
L'interface web a besoin d'un serveur web avec PHP et d'une base de données : nous utilisons [Apache](HowtoApache) et [MySQL](HowtoMySQL).
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
La base de données sert à :
2017-02-24 14:43:29 +01:00
2017-06-09 03:36:16 +02:00
* sauvegarder les utilisateurs et groupes de l'interface web
* stocker les informations de configuration, le status des hôtes et services (mis à jour grâce au module _ido-mysql_)
2016-12-29 11:25:39 +01:00
~~~
2017-02-24 14:32:03 +01:00
# apt install icingaweb2 icinga2-ido-mysql
2016-12-29 11:25:39 +01:00
~~~
2017-06-09 03:36:16 +02:00
> *Note* : le paquetage *icinga2-ido-mysql* fournit un assistant d'installation pour configurer une base de données et un utilisateur MySQL automatiquement. Si on le souhaite le faire manuellement, les paramètres sont stockés dans le fichier `/etc/icinga2/features-available/ido-mysql.conf` et le schéma des tables est dans `/usr/share/icinga2-ido-mysql/schema/mysql.sql`
2017-02-24 14:32:03 +01:00
2017-06-08 15:23:08 +02:00
Une fois l'installation terminée, il est nécessaire d'activer le module **ido-mysql** d'icinga2 :
2016-12-29 11:25:39 +01:00
~~~
2017-02-24 14:32:03 +01:00
# icinga2 feature enable ido-mysql
2017-06-09 03:36:16 +02:00
# systemctl restart icinga2
2016-12-29 11:25:39 +01:00
~~~
2017-06-08 15:16:10 +02:00
Il est possible de lancer des commandes (planifier un check, downtimer une machine...) à partir de l'interface web directement. Pour cela, il faut ajouter à l'utilisateur du serveur web au groupe **nagios**.
2016-12-29 11:25:39 +01:00
~~~
# addgroup --system www-data nagios
# icinga2 feature enable command
# service icinga2 restart
~~~
2017-06-09 03:36:16 +02:00
> *Note* : Il est aussi possible de contrôler icinga2 directement via son API. Cela est pratique notament dans le cas où l'interface web n'est pas sur la même machine. Il faut à ce moment là créer un utilisateur API avec un couple login/pass et les renseigner dans la configuration de l'interface web.
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
Pour continuer l'installation de l'interface web, il faut aller sur <http://monitoring.example.com/icingaweb2/setup> : un tocken sera demandé qui peut être créé avec la commande `icingacli setup token create`.
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
La prochaine étape de l'assistant demande quelles fonctions activer : il faut au moins activer le module **Monitoring** sinon l'interface web perd = son intérêt !
L'assistant lance ensuite une série de tests. Il est important de s'assurer que tous les tests sont OK (il est normal que les tests PostgreSQL s'affichent en jaune, car on utilise MySQL).
2016-12-29 11:25:39 +01:00
2017-06-09 10:11:57 +02:00
Pour le paramétrage de l'authentification à l'interface web, on peut utiliser la même base de données utilisé par icinga2 pour exporter son état ou un annuaire LDAP.
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
TODO : à comprendre...
2016-12-29 11:25:39 +01:00
2017-04-19 16:17:39 +02:00
Si l'on choisit un backend base de données, il suffit de renter les informations d'authentification que l'on souhaite avoir. La WebUI va ensuite nous informer que la base de données n'existe pas encore et nous demander le mot de passe administrateur pour en créer une pour nous. Encore une fois, il est possible de faire cela directement en ligne de commande avec MySQL.
2016-12-29 11:25:39 +01:00
2017-06-08 15:16:10 +02:00
Après avoir finalisé les informations pour l'authentification, il vous faudra donner au WebUI l'accès à la base de données créée précédemment pour *icinga2*. Si vous avez utilisé l'assistant de configuration du paquetage *icinga2-ido-mysql*, vous pourrez retrouver directement les informations d'authentification à MySQL utilisé par icinga2 dans `/etc/icinga2/features-available/ido-mysql.conf`.
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
L'interface web est désormais accessible via <http://monitoring.example.org/icingaweb2/>
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
### Configuration client
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
Pour surveiller un équipement, il faut installer icinga2 (nœud client) ou s'appuyer sur d'autres protocoles (NRPE, SSH, SNMP).
#### mode top down command endpoint (exécution de commande)
<https://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/distributed-monitoring#distributed-monitoring-top-down-command-endpoint>
C'est la méthode la plus simple, similaire à NRPE : le nœud master souhaitant effectuer un check, il lance une commande au travers de l'agent local icinga2 installé. Le seul pré-requis est que les objets de type **CheckCommand** définissant les commandes à exécuter doivent être présent localement (i.e. là où la commande est exécutée).
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
#### mode bottom up config sync
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
<https://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/distributed-monitoring#distributed-monitoring-bottom-up>
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
_Attention, cette méthode est dépréciée depuis la sortie de la versions 2.6 et devrait être [retirée dans une future version](https://github.com/Icinga/icinga2/issues/4799)_
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
Avec cette méthode, les équipements sont configurés pour se surveiller eux-mêmes et remonter les résultats des checks. La configuration réside sur les machines locales et est synchronisée vers le nœud master.
#### mode top down config sync
<https://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/distributed-monitoring#distributed-monitoring-top-down-config-sync>
Le principe est semblable à la méthode précédente, la différence est que la configuration des machines locales est faite sur le serveur central. Lorsque l'on redémarre le daemon, le serveur central s'assure que les machines locales ont la bonne configuration. Plutôt d'aller « du bas vers le haut » on va donc « du haut vers le bas ». Cette méthode permet de centraliser l'ensemble de notre configuration.
#### Configuration de base
Par défaut, quand on installe icinga2 sur une machine, le daemon est lancé et icinga2 se met à surveiller l'hôte local. Pour cet exemple, le client va être configuré de manière minimale pour juste le rattacher au master du cluster (TODO: on est dans quel mode ??)
C'est dans la configuration que l'on fera sur la machine *icinga2-master* que l'on va décider comment on utilise la machine.
On utilise l'assistant de configuration (_note_: les autres commandes `icinga2 node <paramètre>` sont dépréciées) :
2016-12-29 11:25:39 +01:00
~~~
# icinga2 node wizard
2017-06-08 14:48:55 +02:00
Welcome to the Icinga 2 Setup Wizard!
We'll guide you through all required configuration details.
2016-12-29 11:25:39 +01:00
Please specify if this is a satellite setup ('n' installs a master setup) [Y/n]: y
Starting the Node setup routine...
2017-02-24 14:32:03 +01:00
Please specifiy the common name (CN) [icinga2-client1]:
2016-12-29 11:25:39 +01:00
Please specify the master endpoint(s) this node should connect to:
Master Common Name (CN from your master setup): icinga2-master
Do you want to establish a connection to the master from this node? [Y/n]: y
Please fill out the master connection information:
2017-04-18 18:27:22 +02:00
Master endpoint host (Your master's IP address or FQDN): 192.0.2.1
2017-02-24 14:32:03 +01:00
Master endpoint port [5665]:
2016-12-29 11:25:39 +01:00
Add more master endpoints? [y/N]: n
Please specify the master connection for CSR auto-signing (defaults to master endpoint host):
2017-04-18 18:27:22 +02:00
Host [192.0.2.1]:
2017-02-24 14:32:03 +01:00
Port [5665]:
information/base: Writing private key to '/etc/icinga2/pki/icinga2-client1.key'.
information/base: Writing X509 certificate to '/etc/icinga2/pki/icinga2-client1.crt'.
2017-04-18 18:27:22 +02:00
information/cli: Fetching public certificate from master (192.0.2.1, 5665):
2016-12-29 11:25:39 +01:00
Certificate information:
Subject: CN = icinga2-master
Issuer: CN = Icinga CA
Valid From: Aug 15 21:03:54 2016 GMT
Valid Until: Aug 12 21:03:54 2031 GMT
2017-06-08 14:48:55 +02:00
Fingerprint: 13 37 FF 42 00 13 00 DE DB EE F0 00 16 45 2A 14 F5 00 CA FE
2016-12-29 11:25:39 +01:00
Is this information correct? [y/N]: y
information/cli: Received trusted master certificate.
Please specify the request ticket generated on your Icinga 2 master.
2017-04-18 18:27:22 +02:00
(Hint: # icinga2 pki ticket --cn 'icinga2-sclient1'): ed347c9f5c4c1a08f811bf2032944d01c48979a
information/cli: Requesting certificate with ticket 'ed347c9f5c4c1a08f811bf2032944d01c48979a'.
2016-12-29 11:25:39 +01:00
2017-02-24 14:32:03 +01:00
information/cli: Writing signed certificate to file '/etc/icinga2/pki/icinga2-client1.crt'.
2016-12-29 11:25:39 +01:00
information/cli: Writing CA certificate to file '/etc/icinga2/pki/ca.crt'.
Please specify the API bind host/port (optional):
2017-02-24 14:32:03 +01:00
Bind Host []:
Bind Port []:
2016-12-29 11:25:39 +01:00
Accept config from master? [y/N]: y
2017-06-06 18:39:58 +02:00
Accept commands from master? [y/N]: y
2016-12-29 11:25:39 +01:00
~~~
2017-06-09 03:36:16 +02:00
> *Note* : Pour contrôler l'empreinte du certificat de la machine à laquelle on se connecte, on peut utiliser la commande `openssl x509 -noout -in /etc/icinga2/pki/icinga2-master.crt -fingerprint -sha1`
2017-04-20 16:03:12 +02:00
2017-04-19 16:17:39 +02:00
À noter qu'à l'étape où l'assistant demande le ticket généré sur le master, il faut exécuter la commande suivante sur le master et copier l'output dans l'assistant :
2016-12-29 11:25:39 +01:00
~~~
2017-06-09 03:36:16 +02:00
# icinga2 pki ticket --cn '<nom du client>'
2016-12-29 11:25:39 +01:00
~~~
2017-06-06 18:39:58 +02:00
2017-06-09 03:36:16 +02:00
Après l'exécution de l'assistant, l'instance Icinga est réglée comme appartenant à sa propre *zone*. Cette *zone* est fille du master renseigner lors de l'assistant.
2017-06-08 15:16:10 +02:00
Si client reconnaît maintenant le master, il est nécessaire de configurer le master pour qu'il reconnaisse le client. On va donc modifier le fichier *zones.conf* sur le master y ajouter la *zone* et le *endpoint* du nouveau client :
2016-12-29 11:25:39 +01:00
~~~
[...]
2017-02-24 14:32:03 +01:00
object Endpoint "icinga2-client1" {
2017-04-19 15:17:06 +02:00
host = "192.0.2.10"
2016-12-29 11:25:39 +01:00
}
2017-02-24 14:32:03 +01:00
object Zone "icinga2-client1" {
2017-04-19 15:17:06 +02:00
endpoints = [ "icinga2-client1" ]
2017-02-24 14:32:03 +01:00
parent = "master"
2016-12-29 11:25:39 +01:00
}
~~~
2017-04-19 16:17:39 +02:00
Et voilà ! En théorie, le master et le client peuvent se parler ! Comme nous n'avons pas encore configuré de test sur le nouveau client, il est normal qu'il n'apparaisse pas dans la WebUI.
2016-12-29 11:25:39 +01:00
2017-06-08 14:48:55 +02:00
#### Cas A - Client avec configuration centrale sur le master
2016-12-29 11:25:39 +01:00
2017-06-09 03:36:16 +02:00
Dans ce premier cas, les fichiers de configuration sont présents et modifiés sur le master, qui les synchronise sur le(s) client(s).
2017-06-08 15:16:10 +02:00
Nous allons donc ajouter nos tests sur le master dans *zones.d*, le dossier prévu à cet effet. On commence par y créer un nouveau dossier correspondant à la zone (donc le client appartenant à celle-ci) que l'on souhaite configurer :
2016-12-29 11:25:39 +01:00
~~~
2017-02-24 14:32:03 +01:00
# mkdir /etc/icinga2/zones.d/icinga2-client1
2016-12-29 11:25:39 +01:00
~~~
2017-06-08 15:16:10 +02:00
Dans ce dossier, on crée un fichier nommé *hosts.conf* qui va nous servir à définir un nouvel objet de type *Host*. Cet objet va nous permettre par la suite de lier d'autres types d'objets à notre nouveau client :
2016-12-29 11:25:39 +01:00
~~~
2017-02-24 14:32:03 +01:00
object Host "icinga2-client1" {
2017-06-05 18:35:36 +02:00
import "generic-host"
2017-04-19 11:58:36 +02:00
2017-06-05 18:35:36 +02:00
check_command = "hostalive"
2017-04-19 15:17:06 +02:00
address = "192.0.2.10"
2016-12-29 11:25:39 +01:00
}
~~~
2017-06-08 15:16:10 +02:00
On peut maintenant ajouter de nouveaux tests dans *services.conf*, des objets de type *Service* :
2016-12-29 11:25:39 +01:00
~~~
object Service "disk" {
import "generic-service"
2016-12-29 11:25:39 +01:00
host_name = "icinga2-sclient1"
2016-12-29 11:25:39 +01:00
check_command = "disk"
}
object Service "ssh" {
import "generic-service"
2016-12-29 11:25:39 +01:00
host_name = "icinga2-sclient1"
2016-12-29 11:25:39 +01:00
check_command = "ssh"
}
~~~
2017-06-09 03:36:16 +02:00
Pour que la synchronisation se fasse entre le master et le client, on redémarre Icinga sur le master :
2016-12-29 11:25:39 +01:00
~~~
2017-06-09 03:36:16 +02:00
# systemcrl reload icinga2
2016-12-29 11:25:39 +01:00
~~~
2017-06-09 03:36:16 +02:00
> *Note* : Si, pour une raison ou une autre, la configuration venait à être invalide lors du reload, celui-ci va être avorté. Mais Icinga va continuer de fonctionner avec l'ancienne configuration valide chargée avant. En effet, il contrôle la configuration avant de demander au daemon de s'arréter. Pour controler la syntaxe de la configuration, on peut d'ailleurs utiliser la commande `icinga2 daemon --validate`
2016-12-29 11:25:39 +01:00
2017-06-08 15:16:10 +02:00
Si tout s'est passé correctement, vous devriez voir apparaître une nouvelle machine dans l'inteface web, accompagné de deux nouveaux services : *disk* et *ssh*.
2017-04-19 16:17:39 +02:00
A noter que cette méthode de configuration est assez fastidieuse étant donné que l'on doit déclarer chaques services pour chaques machines. Ainsi, on tendra a préviligier l'utilisation de gabarits que l'on va ensuite appliquer sur les machines en fonctions de règles. Ces règles peuvent être basées sur :
2017-04-18 18:27:22 +02:00
2017-04-19 11:58:36 +02:00
* Des conventions de nommage des machines (i.e. foo-mail -> correspond à \*-mail -> Application de services propres à un serveur mail (SMTP, IMAP, mailq...))
2017-04-18 18:27:22 +02:00
* L'appartenance à des groupes
* La présence d'attributs personalisés sur l'hôte
2017-06-08 15:16:10 +02:00
Ainsi, à place de définir 1000 services ssh pour 1000 machine linux, on va définir une fois le service ssh et l'appliquer aux 1000 machines. Dans l'exemple suivant, on va ainsi appliquer le service ssh aux machines dont on connait l'addresse et dont l'attribut vars.os a pour valeur "linux".
2017-04-18 18:27:22 +02:00
~~~
apply Service "ssh" {
import "generic-service"
check_command = "ssh"
assign where host.address && host.vars.os == "Linux"
}
~~~
2017-06-08 14:48:55 +02:00
#### Cas B - Configuration en pont d'éxécution de commandes
2017-05-30 11:25:19 +02:00
2017-06-09 03:36:16 +02:00
Dans ce cas, toute la configuration va rester sur lae nœud master (et donc dans le dossier `/etc/icinga2/zone.d/master/`). C'est le master qui va planifier l'exécution des checks.
2017-05-30 11:25:19 +02:00
2017-06-09 03:36:16 +02:00
Ainsi, on peut définir dans un fichier `icinga2-client2.conf` :
2017-05-30 11:25:19 +02:00
2017-06-06 18:39:58 +02:00
~~~
object Host "icinga2-client2" {
import "generic-host"
2017-05-30 11:25:19 +02:00
2017-06-06 18:39:58 +02:00
check_command = "hostalive"
address = "192.0.2.20"
2017-05-30 11:25:19 +02:00
}
2017-06-06 18:39:58 +02:00
object Service "disk" {
import "generic-service"
2017-05-30 11:25:19 +02:00
2017-06-06 18:39:58 +02:00
command_endpoint = "icinga2-client2"
host_name = "icinga2-sclient2"
check_command = "disk"
}
2017-05-30 11:25:19 +02:00
2017-06-06 18:39:58 +02:00
object Service "ssh" {
import "generic-service"
command_endpoint = "icinga2-client2"
host_name = "icinga2-sclient2"
check_command = "ssh"
2017-05-30 11:25:19 +02:00
}
~~~
2017-06-09 03:36:16 +02:00
La définition de l'hôte et des services est quasi identique au cas précédent. Cependant, il faut ajouter en plus l'attribut **command_endpoint** aux objets de type *Service* pour definir l'*Endpoint* qui doit être commandé pour exécuter la commande.
2017-06-06 18:39:58 +02:00
2017-06-09 03:36:16 +02:00
#### Cas C - Monitoring d'une machine distante sans Icinga
2017-06-05 18:35:36 +02:00
2017-06-09 03:36:16 +02:00
Comme annoncé plus haut, il est aussi possible de surveiller une machine qui n'aurait pas Icinga par d'autres moyens comme NRPE ou SSH. La commande de l'exécution des checks devra alors être prise en charge par un nœud du cluster Icinga. Idéalement, un *master* ou un *satellite*. Ainsi, la configuration proposée doit être entreposée dans le dossier de la zone qui aura la charge de la surveillance de la machine.
2017-06-05 18:35:36 +02:00
~~~
2017-06-06 16:58:32 +02:00
object Host "no-icinga2-host" {
2017-06-05 18:35:36 +02:00
import "generic-host"
check_command = "hostalive"
address = "192.0.2.10"
}
~~~
2017-06-08 14:48:55 +02:00
##### Utilisation de NRPE
2017-06-05 18:35:36 +02:00
2017-06-09 03:36:16 +02:00
Lors d'une migration de *Nagios* vers *Icinga*, il peut être intéréssant de supporter tout les checks fait par NRPE pour fluidifier la transition vers la nouvelle plateforme.
2017-06-05 18:35:36 +02:00
2017-06-08 15:16:10 +02:00
Pour cela, il faut d'abord récupérer le client **NRPE** :
2017-06-05 18:35:36 +02:00
~~~
# apt install nagios-nrpe-plugin
~~~
2017-06-08 15:16:10 +02:00
En suite, il suffit juste de créer les services dans la configuration du master pour paramettrer les checks voulu. L'exemple suivant crée un service *swap* pour la machine *no-icinga2-host* décrite plus haut qui exécutera la commande *check_swap* par NRPE.
2017-06-05 18:35:36 +02:00
~~~
2017-06-08 16:15:13 +02:00
object Host "no-icinga2-host" {
import "generic-host"
check_command = "hostalive"
address = "192.0.2.30"
}
2017-06-05 18:35:36 +02:00
object Service "swap" {
import "generic-service"
2017-06-06 16:58:32 +02:00
host_name = "no-icinga2-host"
2017-06-05 18:35:36 +02:00
check_command = "nrpe"
vars.nrpe_command = "check_swap"
}
~~~
2017-06-08 14:48:55 +02:00
##### Utilisation de SSH
2017-06-05 18:35:36 +02:00
2017-06-09 03:36:16 +02:00
Dans certaines situations, l'utilisation de NRPE ou Icinga n'est pas possible (restrictions firewall, NAT...). Dans ces cas là, on peut aussi exécuter des commandes via une connexion SSH.
2017-06-05 18:35:36 +02:00
Quelques pré-requis avant :
* L'utilisateur du daemon icinga2 doit avoir une clé ssh pour s'authentifier. Celle-ci doit être autorisée par l'hôte distant.
* Le daemon doit avoir l'empreinte du serveur ssh dans son known_hosts. (Sinon, il refusera de se connecter)
* Les scripts/plugins/commandes à exécuter doivent être présents sur la machine et exécutables par l'utilisateur utilisé par icinga2
2017-06-08 15:16:10 +02:00
Avec ces pré-requis, il suffit alors de définir une commande de check important l'objet *by_ssh* fournit avec icinga2. Ensuite, il suffit d'utiliser cette commande lors de la définition des services
2017-06-05 18:35:36 +02:00
~~~
object CheckCommand "by_ssh_swap" {
import "by_ssh"
vars.by_ssh_command = "/usr/lib/nagios/plugins/check_swap -w $by_ssh_swap_warn$ -c $by_ssh_swap_crit$"
vars.by_ssh_swap_warn = "75%"
vars.by_ssh_swap_crit = "50%"
}
object Service "swap" {
import "generic-service"
2017-06-06 16:58:32 +02:00
host_name = "no-icinga2-host"
2017-06-05 18:35:36 +02:00
check_command = "by_ssh_swap"
vars.by_ssh_logname = "icinga"
}
~~~
2017-06-09 03:36:16 +02:00
> *Cool fact* : on peut même faire du NRPE par SSH (dans le cas d'une machine en NAT ou avec un firewall assez restrictif). Exemple :
2017-06-05 18:35:36 +02:00
~~~
object CheckCommand "nrpe_via_ssh" {
import "by_ssh"
vars.by_ssh_command = "/usr/lib/nagios/plugins/check_nrpe -H $host.vars.internalIP$ $service.vars.nrpe_command$"
vars.by_ssh_logname = "monitoring"
}
apply Service "ssh-nrpe-load" {
import "generic-service"
check_command = "nrpe_via_ssh"
vars.nrpe_command = "-c check_load"
vars.notification_period = "worktime"
assign where host.vars.service_base && host.check_command == "nrpe_via_ssh"
}
~~~
2017-04-18 18:27:22 +02:00
2017-06-09 03:36:16 +02:00
## Configuration avancée
2017-06-07 11:01:16 +02:00
2017-06-08 16:15:13 +02:00
### Zone globale
Une bonne pratique est de créer une zone globale. Elle va aisi permettre de pousser des fichier de configuration sur tous les noeuds icinga2 du cluster. C'est pratique pour déployer des éléments de configuration générique et/ou globaux. Ainsi, si on appelle notre zone globale *global-templates*, il suffit de créer un dossier `/etc/icinga2/zone.d/global-templates` et d'ajouter le bloc suivant au fichier `/etc/icinga2/zone.conf` pour **chaque** installations d'icinga2 :
~~~
object Zone "global-templates" {
global = true
}
~~~
2017-06-07 11:01:16 +02:00
### Envoi de notifications
2017-06-06 18:39:58 +02:00
Contrôler le bon fonctionnement de services, c'est bien. Alerter en cas de défaillance c'est mieux !
On peut définir un objet notification qui sera appliqué a nos services pour envoyer des mails. Il utilisera le script d'envoi d'emails fournit avec icinga2
~~~
apply Notification "mail" to Service {
import "mail-service-notification"
users = ["foo"]
states = [ Critical, Unknown ]
period = "9to5"
assign where true
}
~~~
2017-06-08 15:23:08 +02:00
L'objet **Notification** 'mail' est définit pour envoyer une notification par couriel à l'utilisateur 'foo' lorsqu'un service est en état *Critical* ou *Unknown* sur la période *9to5* fournit dans la configuration par défaut.
2017-06-06 18:39:58 +02:00
~~~
object User "foo" {
import "generic-user"
display_name = "Foo"
email = "foo@example.net"
}
~~~
2017-06-07 11:01:16 +02:00
### Timeperiods
2017-06-08 15:23:08 +02:00
On peut facilement décrire de nouveaux objets **Timeperiod** pour décrire par exemple les heures ouvrées et envoyer des notifications uniquement durant cette période. Ici, c'est défini du lundi au vendredi, de 9h à 12h et de 14h à 18h.
2017-06-07 11:01:16 +02:00
~~~
object TimePeriod "HO" {
import "legacy-timeperiod"
display_name = "Heures Ouvrées"
ranges = {
"monday" = "09:00-12:00,14:00-18:00"
"tuesday" = "09:00-12:00,14:00-18:00"
"wednesday" = "09:00-12:00,14:00-18:00"
"thursday" = "09:00-12:00,14:00-18:00"
"friday" = "09:00-12:00,14:00-18:00"
}
}
~~~
### Contrôle de santé du cluster
Une autre bonne pratique est de rajouter des checks pour s'assurer du bon fonctionnement de notre cluster. Il existe deux commandes utilisables qui sont complémentaires :
* cluster : Elle s'assure que tout les *endpoints* de la zone soient actifs et que les zones directement connectés fonctionnent correctement
* cluster-zone : Elle s'assure que la zone donnée en paramètres est bien connecté au cluster
Idéalement, il faut donc utiliser **cluster** pour des zones de plus d'une machines, et **cluster-zone** pour s'assurer que chaque zone filles fonctionnent bien. Dans notre cas on va utiliser des checks *cluster-health* depuis le master pour s'assurer que nos deux endpoints *icinga2-client1* et *icinga2-client2* soient bien connectés.
2017-06-08 17:37:14 +02:00
Exemple avec *cluster-zone* :
~~~
# cat /etc/icinga2/zone.d/icinga2-master/cluster.conf
apply Service "cluster-health" {
check_command = "cluster-zone"
display_name = "cluster-health-" + host.name
vars.cluster_zone = host.name
assign where host.vars.client_endpoint
}
~~~
2017-06-07 11:01:16 +02:00
### Haute disponibilité
2017-06-06 18:39:58 +02:00
2017-06-09 03:36:16 +02:00
Dans certaines situations, on va vouloir mettre plusieurs instances Icinga dans une même zone à fin de les faire travailler ensemble et ainsi répartir la charge et avoir une tolérance de panne. Les modules d'Icinga sont capables de gérer la répartition entre chaque membres actifs d'une même zone.
2017-06-07 11:01:16 +02:00
Modules avec des fonctions de haute disponibilité :
2017-06-07 17:47:56 +02:00
2017-06-07 11:01:16 +02:00
* checker : Il va répartir l'exécution des checks entre chaque machines de la zone
2017-06-08 15:16:10 +02:00
* notification : De même, il peut répartir l'envoi des notifications entre chaque machines. C'est aussi désactivable avec le paramètre *enable_ha* - A ce moment là chaque noeuds avec la fonctionalité de notification active envera une notification
* ido-{mysql,postgresql} : Là, les noeuds de la zone vont s'accorder pour qu'une seule instance écrive dans la base de données MySQL. Si l'instance en charge d'écrire est down, une autre prendra la relève. Désactivable avec le paramettre *enable_ha*
2017-06-07 11:01:16 +02:00
2017-06-08 15:23:08 +02:00
Pour ajouter un nouveau noeud une *zone* master, il suffit de l'installer normalement comme expliqué plus haut, puis d'ajuster le fichier `zone.conf` pour faire en sorte que les deux noeuds appartiennent bien à la même zone.
2017-06-06 16:58:32 +02:00
## Plomberie
2017-06-05 18:35:36 +02:00
### Gestion de la PKI - Génération manuelle des certificats
2017-05-30 18:29:27 +02:00
2017-05-30 11:25:19 +02:00
Dans certains cas, on peut être amené à générer manuellement le certificat TLS pour l'authentification d'un nouveau noeud.
La commande suivante sert à générer une CSR, pour une machine "icinga2-client2". Elle peut être directement lancée sur la machine désignée ou depuis le master du cluster (si la machine monitorée n'as pas encore été provisionée par exemple).
~~~
# icinga2 pki new-cert --cn icinga2-client2 \
--key icinga2-client2.key \
--csr icinga2-client2.csr
~~~
En suite, depuis le master, on génère le certificat avec la CSR.
~~~
# icinga2 pki sign-csr --csr icinga2-client2.csr --cert icinga2-client2
~~~
Il ne reste plus qu'a rappatrier les fichiers `/etc/icinga2/pki/icinga2-client2.*` sur la machine désignée.
2017-06-09 03:36:16 +02:00
## FAQ
### Que veut-dire « Icinga » ?
C'est un mot zulu signifiant « il recherche » ou « il examine ».
### plugin Vim pour la syntaxe de la configuration d'Icinga
Tous les fichiers de configuration utilisent la même syntaxe. Il existe un plugin vim pour cette dernière :
~~~
# apt -t jessie-backports install vim-icinga2
~~~