Chapitre 517 minIntermédiaire
Hôtes, modèles, éléments et déclencheurs Zabbix
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- créer un hôte, lui lier un modèle et ajuster ses macros ;
- lire et créer un élément avec sa clé et son intervalle ;
- écrire l'expression d'un déclencheur avec ses fonctions ;
- éviter le battement d'une alerte avec une expression de rétablissement ;
- comprendre la découverte de bas niveau (LLD).
3 exercices corrigés2 schémas
Dans Zabbix, tout part de quatre objets : l'hôte (la machine ou l'équipement supervisé), le modèle (template, un ensemble de mesures réutilisable), l'élément (item, une mesure) et le déclencheur (trigger, la condition qui transforme une mesure en problème). Ce chapitre explique chacun d'eux avec les écrans de Zabbix 7.0, la syntaxe des clés et des expressions, les macros qui adaptent un modèle à un hôte, et la découverte de bas niveau qui crée les mesures toute seule.
Les objets de Zabbix et leurs liens
| Objet | Rôle | Exemple |
|---|---|---|
| Groupe d'hôtes | Range les hôtes, sert aux droits des utilisateurs, aux actions et aux tableaux de bord | Serveurs Linux, Serveurs Windows, Réseau, Sites/Marseille |
| Hôte | Ce que l'on supervise, avec une ou plusieurs interfaces (agent, SNMP, IPMI, JMX) | srv-gestion, SW-ETAGE1, pfsense |
| Modèle | Ensemble d'éléments, déclencheurs, graphiques, règles de découverte, scénarios web et macros, lié à un ou plusieurs hôtes | Linux by Zabbix agent, Cisco IOS by SNMP |
| Élément | Une mesure, collectée à un intervalle et stockée | Espace utilisé de /, en pourcentage |
| Déclencheur | Une expression logique sur un ou plusieurs éléments ; vraie, elle crée un problème | « espace utilisé > 85 % pendant 5 minutes » |
| Macro | Une variable qui remplace un seuil, un identifiant, une adresse | {$VFS.FS.PUSED.MAX.WARN} = 80 |
Les groupes de modèles (template groups) rangent les modèles à part des hôtes. Zabbix 7.0 en fournit plusieurs centaines, dans des groupes comme Templates/Operating systems, Templates/Network devices ou Templates/Applications.
Créer un hôte
Data collection > Hosts, bouton Create host.
| Champ | Valeur pour srv-gestion | Remarque |
|---|---|---|
| Host name | srv-gestion | Le nom technique, unique. En contrôle actif, il doit être identique au Hostname= de l'agent |
| Visible name | srv-gestion (application de gestion) | Le nom affiché, facultatif |
| Templates | Linux by Zabbix agent | Bouton Select, groupe Templates/Operating systems |
| Host groups | Serveurs Linux | Tape un nouveau nom pour créer le groupe |
| Interfaces | Add > Agent : IP 192.168.10.179, port 10050, Connect to IP | Une interface par type de collecte |
| Monitored by | Server | Ou Proxy (prx-mrs pour Marseille), ou Proxy group |
| Enabled | Coché | Décoché, l'hôte n'est plus collecté |
L'onglet Macros de l'hôte redéfinit les macros de ses modèles ; l'onglet Tags pose des étiquettes (site: lyon, service: gestion) que porteront ses problèmes ; l'onglet Encryption règle le chiffrement avec l'agent (chapitre 6) ; l'onglet Inventory peut se remplir automatiquement à partir des éléments.
Après quelques minutes, la colonne Availability de Data collection > Hosts affiche l'icône ZBX en vert : le serveur joint l'agent. En rouge, survole l'icône : le message dit pourquoi (Get value from agent failed: cannot connect to [[192.168.10.179]:10050]: … Connection refused signifie que l'agent n'écoute pas ou qu'un pare-feu refuse).
Les éléments et leurs clés
Un élément est défini par son type (qui collecte et comment, voir le chapitre 3) et sa clé, qui dit quoi mesurer. Une clé a la forme nom[paramètre1,paramètre2,…].
| Clé | Ce qu'elle mesure | Unité |
|---|---|---|
agent.ping | L'agent répond (toujours 1 s'il répond) | — |
system.cpu.util | Utilisation du processeur, tous cœurs confondus | % |
system.cpu.load[all,avg5] | Charge moyenne sur 5 minutes (Linux) | — |
vm.memory.size[available] | Mémoire disponible | octets |
vfs.fs.size[/,pused] | Espace utilisé du système de fichiers / | % |
vfs.fs.size[C:,free] | Espace libre du volume C: (Windows) | octets |
net.if.in["ens18"] | Trafic entrant de l'interface ens18 | octets/s après prétraitement |
proc.num[nginx] | Nombre de processus nginx | — |
service.info[DNS] | État du service Windows DNS | 0 = en marche |
net.tcp.service[https,,443] | Le port 443 répond en HTTPS | 1 ou 0 |
system.uptime | Durée de fonctionnement | secondes |
log[/var/log/gestion/app.log,ERROR] | Nouvelles lignes du journal contenant ERROR (contrôle actif) | texte |
Crée un élément à la main sur l'hôte (Data collection > Hosts, colonne Items de la ligne, bouton Create item) :
| Champ | Exemple |
|---|---|
| Name | Processus nginx |
| Type | Zabbix agent |
| Key | proc.num[nginx] (le bouton Select liste les clés connues) |
| Type of information | Numeric (unsigned) |
| Update interval | 1m |
| History / Trends | 31d / 365d, par exemple |
| Tags | component: application |
Le bouton Test de l'écran interroge l'agent et affiche la valeur tout de suite : fais-le avant d'enregistrer. Les valeurs collectées apparaissent dans Monitoring > Latest data, filtré sur l'hôte, avec un lien vers le graphique de chaque élément.
Le prétraitement (onglet Preprocessing) transforme la valeur avant de la stocker. Les étapes les plus utiles :
| Étape | Effet | Exemple |
|---|---|---|
| Change per second | Transforme un compteur cumulatif en débit | Octets reçus par une interface → octets par seconde |
| Custom multiplier | Multiplie par une constante | × 8 pour passer des octets aux bits |
| JSONPath | Extrait un champ d'une réponse JSON | $.status d'une API |
| Regular expression | Extrait une partie d'un texte | Le numéro de version d'une bannière |
| Discard unchanged with heartbeat | N'enregistre une valeur identique qu'une fois par période | Une version de logiciel, une fois par jour |
Les déclencheurs
Un déclencheur est une expression sur les valeurs d'un ou plusieurs éléments. Quand elle devient vraie, Zabbix crée un événement problème ; quand elle redevient fausse, un événement de rétablissement (OK). La syntaxe de Zabbix 7.0 est :
fonction(/hôte/clé,paramètres) opérateur constante
Quelques exemples sur srv-gestion :
last(/srv-gestion/proc.num[nginx])=0
min(/srv-gestion/system.cpu.util,5m)>90
min(/srv-gestion/vfs.fs.size[/,pused],5m)>85
nodata(/srv-gestion/agent.ping,5m)=1
avg(/srv-gestion/system.cpu.util,1h)>2*avg(/srv-gestion/system.cpu.util,1h:now-1w)
- Plus aucun processus
nginxà la dernière mesure. - Le processeur est au-dessus de 90 % pendant 5 minutes sans interruption (la plus petite valeur des 5 dernières minutes dépasse 90).
- Le disque
/est rempli à plus de 85 % depuis 5 minutes. - Aucune valeur de
agent.pingreçue depuis 5 minutes : l'agent, la machine ou le réseau ne répond plus. - La charge moyenne de la dernière heure vaut plus du double de celle de la même heure, la semaine dernière (décalage
now-1w).
Les fonctions à connaître :
| Fonction | Renvoie | Usage typique |
|---|---|---|
last(/h/k) | La dernière valeur (last(/h/k,#2) : l'avant-dernière) | État d'un service, valeur instantanée |
min(/h/k,5m) / max(/h/k,5m) | Le minimum / le maximum sur la période | « Au-dessus de X pendant 5 minutes » : min(…)>X ; « en dessous de Y pendant 5 minutes » : max(…)<Y |
avg(/h/k,15m) | La moyenne sur la période | Charge, temps de réponse |
count(/h/k,10m,"eq","0") | Le nombre de valeurs qui respectent la condition | « Au moins 3 échecs en 10 minutes » |
nodata(/h/k,5m) | 1 si aucune valeur n'est arrivée pendant la période | Agent ou trapper muet |
change(/h/k) | La différence entre les deux dernières valeurs | Redémarrage, version qui change |
find(/h/k,,"like","error") | 1 si la dernière valeur contient le texte | Journaux, bannières |
fuzzytime(/h/k,60) | 0 si l'horloge de l'hôte s'écarte de plus de 60 s de celle du serveur | Heure désynchronisée |
timeleft(/h/k,1d,100) | Temps estimé avant que la valeur atteigne 100, d'après la tendance du dernier jour | Disque qui sera plein dans moins d'une semaine |
On combine avec and, or, not et les parenthèses. Les suffixes de temps sont s, m, h, d, w ; les suffixes d'unité K, M, G, T (en puissances de 1 024) :
last(/srv-fichiers/vfs.fs.size[D:,free])<20G and last(/srv-fichiers/vfs.fs.size[D:,pfree])<10
« Moins de 20 Gio libres et moins de 10 % libres sur D: » : la double condition évite d'alerter sur un petit volume presque plein mais suffisant, ou sur un énorme volume à 91 % qui a encore 2 To devant lui.
Gravité, nom et données d'un déclencheur
Crée un déclencheur dans l'onglet Triggers de l'hôte (ou du modèle), bouton Create trigger.
| Champ | Rôle |
|---|---|
| Name | Le titre du problème, avec des macros : Disque / de {HOST.NAME} rempli à plus de 85 % |
| Operational data | La valeur affichée à côté du problème : {ITEM.LASTVALUE1} |
| Severity | La gravité, de Not classified à Disaster |
| Expression | La condition de problème |
| OK event generation | Expression (le problème se résout quand l'expression redevient fausse), Recovery expression (une condition de retour distincte), None (seule une intervention humaine le ferme) |
| PROBLEM event generation mode | Single (un problème tant que la condition dure) ou Multiple (un nouveau problème à chaque valeur qui la vérifie, utile pour les journaux) |
| Allow manual close | Autorise un technicien à fermer le problème à la main |
| Tags | scope: capacity, service: gestion : servent aux actions, aux SLA et aux filtres |
| Dependencies (onglet) | Le déclencheur est muet si un autre, dont il dépend, est actif (chapitre 9) |
Les six gravités et leur usage chez Sorbier :
| Gravité | Couleur | Usage | Exemple |
|---|---|---|---|
| Not classified | Gris | À éviter | — |
| Information | Bleu clair | Pour mémoire, aucune action | Un serveur a redémarré pendant la maintenance |
| Warning | Jaune | À traiter dans la journée | Disque à 80 %, certificat qui expire dans 30 jours |
| Average | Orange | À traiter rapidement, heures ouvrées | Disque à 90 %, perte d'un lien redondé |
| High | Rouge clair | Intervention immédiate | Service DNS arrêté, site public injoignable |
| Disaster | Rouge | Tout le monde, astreinte comprise | Pare-feu injoignable, tout le siège coupé |
Éviter le battement : l'expression de rétablissement
Un disque qui oscille autour de 85 % (84,9, 85,1, 84,8…) ouvre et ferme un problème à chaque mesure : on dit que l'alerte bat (flapping). La parade est une hystérésis : une condition de problème et une condition de retour différentes.
Expression : min(/srv-gestion/vfs.fs.size[/,pused],5m)>85
Recovery expression : max(/srv-gestion/vfs.fs.size[/,pused],10m)<80
Le problème s'ouvre au-dessus de 85 % pendant 5 minutes, et ne se ferme que lorsque l'occupation est restée sous 80 % pendant 10 minutes. Entre 80 et 85, rien ne change.
Les modèles officiels font de même avec leurs macros : le déclencheur d'heure désynchronisée de Linux by Zabbix agent s'ouvre au-delà de 60 secondes d'écart ({$SYSTEM.FUZZYTIME.MAX}) et ne se ferme qu'en dessous de 10 secondes ({$SYSTEM.FUZZYTIME.MIN}).
Les modèles et leurs macros
Un modèle évite de recréer les mêmes éléments sur chaque hôte. Le modèle officiel Linux by Zabbix agent apporte d'un coup la charge, la mémoire, l'espace de chaque système de fichiers, le trafic de chaque interface, l'heure, le nombre de processus et une vingtaine de déclencheurs, par exemple :
| Déclencheur du modèle (version 7.0) | Expression | Gravité |
|---|---|---|
Linux: High CPU utilization | min(/Linux by Zabbix agent/system.cpu.util,5m)>{$CPU.UTIL.CRIT} | Warning |
Linux: FS [{#FSNAME}]: Space is low | min(…/vfs.fs.dependent.size[{#FSNAME},pused],5m)>{$VFS.FS.PUSED.MAX.WARN:"{#FSNAME}"} | Warning |
Linux: FS [{#FSNAME}]: Space is critically low | Même forme avec {$VFS.FS.PUSED.MAX.CRIT:"{#FSNAME}"} | Average |
Linux: Zabbix agent is not available | max(…/zabbix[host,agent,available],{$AGENT.TIMEOUT})=0 | Average |
Linux: {HOST.NAME} has been restarted | last(…/system.uptime)<10m | Warning |
Les seuils sont des macros, avec une valeur par défaut dans le modèle : {$CPU.UTIL.CRIT} = 90, {$VFS.FS.PUSED.MAX.WARN} = 80, {$VFS.FS.PUSED.MAX.CRIT} = 90, {$AGENT.TIMEOUT} = 3m. Pour changer un seuil, ne modifie pas le modèle : redéfinis la macro sur l'hôte (onglet Macros, bouton Inherited and host macros pour voir la valeur héritée). Ta modification survit aux mises à jour du modèle et ne touche qu'un hôte.
Une macro peut avoir un contexte : {$VFS.FS.PUSED.MAX.WARN:"/var/lib/mysql"} = 85 ne s'applique qu'au système de fichiers /var/lib/mysql, les autres gardent 80. Les macros se définissent à trois niveaux, du plus général au plus précis : globales (Administration > Macros), du modèle, de l'hôte. La plus précise l'emporte. Une macro peut être de type Secret text : sa valeur (un mot de passe SNMP, un jeton d'API) n'est plus affichée dans l'interface.
La découverte de bas niveau (LLD)
Combien de systèmes de fichiers sur srv-fichiers ? Combien de ports sur SW-ETAGE1 ? Tu ne veux pas créer à la main un élément par disque et par port. La découverte de bas niveau (Low-Level Discovery, LLD) s'en charge.
- Une règle de découverte interroge l'hôte à intervalle régulier : la clé
vfs.fs.discoveryrenvoie la liste des systèmes de fichiers,net.if.discoverycelle des interfaces,service.discoverycelle des services Windows, et pour un switch une requête SNMP sur la table des interfaces. - Chaque entrée de la liste porte des macros LLD :
{#FSNAME}(/,/var/lib/mysql),{#FSTYPE}(ext4),{#IFNAME}. - Des prototypes d'éléments, de déclencheurs et de graphiques utilisent ces macros :
vfs.fs.dependent.size[{#FSNAME},pused]. Zabbix crée un élément réel par entrée découverte. - Des filtres écartent ce qui n'intéresse pas : les systèmes de fichiers temporaires (
tmpfs), les interfaces virtuelles. Les modèles officiels règlent ces filtres par des macros comme{$VFS.FS.FSTYPE.MATCHES}ou{$NET.IF.IFNAME.NOT_MATCHES}. - Quand un disque disparaît, ses éléments sont marqués « plus découverts » puis supprimés après un délai.
C'est grâce à la LLD qu'un simple lien vers Linux by Zabbix agent suffit pour superviser tous les disques d'un serveur, y compris celui que tu ajouteras l'an prochain.
Exercices
Exercice 1 sur 3 Écrire des expressions de déclencheur Réussi À revoir
Écris l'expression de chaque déclencheur pour l'hôte indiqué.
- srv-ad : le service Windows
DNSn'est pas en marche (service.info[DNS]vaut 0 quand il tourne). - srv-journaux : la mémoire disponible (
vm.memory.size[available]) reste sous 200 Mio pendant 10 minutes. - srv-web : aucune valeur de
agent.ping(agent actif) depuis 3 minutes. - srv-gestion : la moyenne de
system.cpu.utilsur 15 minutes dépasse 80 % et la chargesystem.cpu.load[all,avg15]dépasse 4. - srv-fichiers : le volume
D:(vfs.fs.size[D:,pused]) sera plein, d'après sa tendance des 7 derniers jours, dans moins de 5 jours.
Voir la réponseMasquer la réponse de l'exercice 1
last(/srv-ad/service.info[DNS])<>0. On teste « différent de 0 » plutôt que « égal à 6 » (arrêté) : la valeur peut aussi valoir 1 (en pause), 7 (inconnu) ou 255 (service absent), qui sont tous des problèmes.max(/srv-journaux/vm.memory.size[available],10m)<200M. La plus grande valeur des 10 minutes est sous le seuil, donc toutes l'étaient.nodata(/srv-web/agent.ping,3m)=1. Pour un agent actif,nodataest le bon outil : le serveur ne peut pas interroger un agent actif, il constate seulement qu'il n'envoie plus rien.avg(/srv-gestion/system.cpu.util,15m)>80 and last(/srv-gestion/system.cpu.load[all,avg15])>4.timeleft(/srv-fichiers/vfs.fs.size[D:,pused],7d,100)<5d. La fonction renvoie le temps estimé (en secondes) pour que la valeur atteigne 100 ; on le compare à 5 jours.
Tu avais trouvé ?
Exercice 2 sur 3 Lire un déclencheur Réussi À revoir
Explique en français ce que fait chaque expression, et dis si elle est bien écrite.
last(/srv-fichiers/vfs.fs.size[C:,pused])>90min(/SW-ETAGE1/icmppingloss,5m)>20count(/srv-gestion/web.test.fail[Gestion],10m,"gt","0")>=3max(/srv-ad2/system.cpu.util,5m)>95
Voir la réponseMasquer la réponse de l'exercice 2
- Le volume
C:est occupé à plus de 90 % à la dernière mesure. Correcte, mais sensible au moindre pic (un fichier temporaire de passage) :min(…,5m)>90est plus robuste, et une expression de rétablissement plus basse (<85) évite le battement. - Le switch perd plus de 20 % des pings pendant 5 minutes sans interruption. Bien écrite : elle signale un lien dégradé, pas une perte ponctuelle.
- Le scénario web
Gestiona échoué au moins 3 fois en 10 minutes. Bien écrite : elle tolère un échec isolé (un délai réseau) mais alerte sur des échecs répétés. Avec un test chaque minute, l'alerte part au plus tôt au troisième échec. - Le processeur a dépassé 95 % au moins une fois en 5 minutes : la plus grande valeur est au-dessus du seuil, il suffit d'un pic. C'est presque toujours une erreur : pour une surcharge durable, il faut
min(…,5m)>95.
Tu avais trouvé ?
Exercice 3 sur 3 Macros et contexte Réussi À revoir
srv-gestion est lié à Linux by Zabbix agent ({$VFS.FS.PUSED.MAX.WARN} = 80, {$VFS.FS.PUSED.MAX.CRIT} = 90). Son volume /var/lib/mysql grossit régulièrement et doit alerter plus tôt, en avertissement dès 70 % et en critique dès 85 %. Le volume /boot, petit et stable, ne doit alerter qu'au-delà de 95 %.
- Quelles macros crées-tu, et à quel niveau ?
- Pourquoi ne pas modifier les valeurs dans le modèle ?
Voir la réponseMasquer la réponse de l'exercice 3
- Sur l'hôte srv-gestion, onglet Macros :
{$VFS.FS.PUSED.MAX.WARN:"/var/lib/mysql"}= 70 ;{$VFS.FS.PUSED.MAX.CRIT:"/var/lib/mysql"}= 85 ;{$VFS.FS.PUSED.MAX.WARN:"/boot"}= 95 ;{$VFS.FS.PUSED.MAX.CRIT:"/boot"}= 98 (le seuil critique doit rester au-dessus de l'avertissement).
- Le modèle est partagé par tous les serveurs Linux : le modifier changerait les seuils partout. Et une mise à jour du modèle officiel écraserait tes modifications, alors que les macros de l'hôte sont conservées.
Tu avais trouvé ?