Zabbix offre une grande flexibilité pour la surveillance de divers aspects d'un système. Au-delà des métriques prédéfinies, il est souvent nécessaire de collecter des données spécifiques à l'environnement ou à l'application. C'est là que les clés utilisateur personnalisées (UserParameters) interviennent, permettant d'exécuter des scripts ou des commandes shell sur les hôtes surveillés pour obtenir des informations uniques.
Surveillance personnalisée : Exemple des sessions utilisateur actives
Prenons l'exemple d'une exigence courante : surveiller le nombre de personnes connectées simultanément à un serveur et générer une alerte si ce nombre dépasse un seuil, par exemple, trois utilisateurs. Zabbix peut être étendu pour gérer ce type de scénario.
Test initial avec zabbix_get
Pour interroger une métrique sur un agent Zabbix depuis le serveur, l'outil zabbix_get est utilisé. Par exemple, pour vérifier la disponibilité de l'agent :
zabbix_get -s '192.168.1.38' -p 10050 -k "agent.ping"
Notre objectif est de pouvoir interroger une clé nommée system.users.active pour obtenir le nombre de sessions actives :
zabbix_get -s '192.168.1.38' -p 10050 -k "system.users.active"
Définition d'une clé utilisateur personnalisée
Le processus implique la définition d'une commande shell qui renvoie la valeur souhaitée et sa configuration dans le fichier de l'agent Zabbix.
Préparation de la commande
Pour obtenir le nombre d'utilisateurs actuellement connectés, la commande who est très utile. En la combinant avec wc -l, on obtient un décompte simple :
who # Affiche les utilisateurs connectés
who | wc -l # Affiche le nombre d'utilisateurs connectés
Configuration de l'agent Zabbix
L'agent Zabbix permet d'inclure des fichiers de configuraton supplémentaires, ce qui est une bonne pratique pour organiser les clés personnalisées.
- Naviguez vers le répertoire de configuration de l'agent Zabbix, généralement
/etc/zabbix/. - Le fichier de configuraton principal est
zabbix_agent2.conf. Il contient une directiveIncludequi permet d'importer des fichiers depuis un répertoire spécifique, comme/etc/zabbix/zabbix_agent2.d/*.conf.
# Extrait de zabbix_agent2.conf
Include=/etc/zabbix/zabbix_agent2.d/*.conf
### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined parameters.
# Format: UserParameter=<key>,<shell command>
# See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
Cette section indique clairement le format des clés utilisateur : UserParameter=<clé>,<commande shell>.
Création du fichier de configuration personnalisé
Créez un nouveau fichier de configuration dans le répertoire inclus, par exemple /etc/zabbix/zabbix_agent2.d/user_sessions.conf :
[root@agent-server ~]# vim /etc/zabbix/zabbix_agent2.d/user_sessions.conf
Ajoutez-y la définition de notre clé personnalisée :
UserParameter=system.users.active,who|wc -l
Après avoir enregistré le fichier, l'agent Zabbix doit être redémarré pour que les modifications prennent effet :
[root@agent-server ~]# systemctl restart zabbix-agent2
[root@agent-server ~]# systemctl status zabbix-agent2
Validation depuis le serveur Zabbix
Une fois l'agent redémarré, testez la nouvelle clé personnalisée depuis le serveur Zabbix à l'aide de zabbix_get :
[root@zabbix-server ~]# zabbix_get -s '192.168.1.38' -p 10050 -k "system.users.active"
2
La valeur retournée (ici, 2) correspond au nombre actuel d'utilisateurs connectés sur l'hôte agent.
Intégration dans l'interface web Zabbix
Avec la clé personnalisée fonctionnelle, les étapes suivantes sont réalisées via l'interface web de Zabbix :
- Création d'un gabarit (Template) : Pour regrouper les éléments de surveillance.
- Définition d'un groupe d'applications (Application group) : Pour organiser logiquement les éléments de surveillance au sein du gabarit.
- Création d'un élément (Item) : En utilisant la clé
system.users.activeque nous venons de définir. Configurez les intervalles de collecte et le type de données. - Configuration d'un déclencheur (Trigger) : Pour définir la condition d'alerte (par exemple, si
system.users.activeest supérieur à 3). - Création d'un graphique (Graph) : Pour visualiser l'historique du nombre d'utilisateurs connectés.
- Liaison du gabarit à l'hôte : Attribuez le gabarit créé à l'hôte Zabbix cible.
Dépannage : Problèmes de permissions avec les commandes shell
Il est fréquent de rencontrer des problèmes de permissions lors de l'utilisation de clés personnalisées, car l'agent Zabbix s'exécute généralement sous un utilisateur non privilégié (souvent zabbix).
Un exemple courant est la commande ss -antp qui, exécutée directement depuis la ligne de commande avec un utilisateur privilégié, affiche des informations de processus (colonne users:) :
[root@agent-server ~]# ss -antp | grep -v 10050
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:* users:(("rpcbind",pid=8386,fd=4),("systemd",pid=1,fd=31))
...
Cependant, si la même commande est appelée via une clé utilisateur Zabbix (par exemple, tcp.socket.ss.atnp), l'agent Zabbix pourrait ne pas avoir les permissions nécessaires pour accéder aux informations de processus, résultant en une sortie tronquée :
[root@zabbix-server ~]# zabbix_get -s '192.168.1.38' -p 10050 -k "tcp.socket.ss.atnp"
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
...
Pour résoudre ce type de problème, on peut accorder des permissions spéciales à la commande exécutée. Pour l'exemple de ss, il est possible d'utiliser le bit SUID (Set User ID) :
[root@agent-server sbin]# ll /usr/sbin/ss
-rwxr-xr-x. 1 root root 131544 Apr 11 2018 /usr/sbin/ss
[root@agent-server sbin]# chmod +s /usr/sbin/ss
[root@agent-server sbin]# ll /usr/sbin/ss
-rwsr-sr-x. 1 root root 131544 Apr 11 2018 /usr/sbin/ss
Le bit SUID (le 's' dans les permissions) permet à un exécutable d'être exécuté avec les privilèges du propriétaire du fichier (ici, root), même s'il est lancé par un utilisateur non-root comme l'agent Zabbix. Après cette modification, l'appel de la clé personnalisée via Zabbix devrait retourner la sortie complète avec les informations de processus.