Le flux de traitement des notifications dans Zabbix suit une logique séquentielle précise : Déclencheur (Trigger) ➔ Action ➔ Type de média (Script). Pour externaliser l'envoi des e-mails, il est nécessaire de définir un répertoire dédié où le serveur Zabbix ira chercher les exécutables.
Configuration de l'environnement d'exécution
L'emplacement des scripts doit être déclaré dans le fichier de configuraton principle zabbix_server.conf.
AlertScriptsPath=/usr/lib/zabbix/alertscripts
Après avoir modifié ce paramètre, le service doit être redémarré pour appliquer les changements :
systemctl restart zabbix-server
Le répertoire doit ensuite être créé et les permissions ajustées pour que l'utilisateur système zabbix puisse y accéder :
mkdir -p /usr/lib/zabbix/alertscripts
chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts
Développement du script de notification
Au lieu de dépendre d'outils tiers obsolètes ou de compilations manuelles de Perl, l'approche la plus robuste consiste à utiliser Python 3 avec la bibliothèque native smtplib. Cela permet une gestion fiable de l'encodage et du formatage HTML.
Créez le fichier dispatch_mail.py dans le répertoire des scripts :
#!/usr/bin/env python3
import sys
import smtplib
import logging
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# Configuration de la journalisation
logging.basicConfig(
filename='/var/log/zabbix_smtp.log',
format='%(asctime)s - %(levelname)s - %(message)s',
level=logging.INFO
)
# Paramètres du serveur de messagerie
SMTP_HOST = "smtp.fournisseur.com"
SMTP_PORT = 587
SENDER_ADDRESS = "supervision@entreprise.com"
SENDER_CREDENTIAL = "votre_mot_de_passe"
def transmit_alert(destination, alert_subject, alert_payload):
msg = MIMEMultipart("alternative")
msg["Subject"] = alert_subject
msg["From"] = SENDER_ADDRESS
msg["To"] = destination
# Intégration du contenu HTML
html_part = MIMEText(alert_payload, "html", "utf-8")
msg.attach(html_part)
try:
with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as server:
server.starttls()
server.login(SENDER_ADDRESS, SENDER_CREDENTIAL)
server.send_message(msg)
logging.info(f"Notification transmise avec succès à {destination}")
except Exception as error:
logging.error(f"Échec de l'envoi vers {destination}: {error}")
sys.exit(1)
if __name__ == "__main__":
if len(sys.argv) != 4:
logging.error("Nombre d'arguments invalide. Attendu: destinataire, sujet, message.")
sys.exit(1)
target_email = sys.argv[1]
email_subject = sys.argv[2]
email_body = sys.argv[3]
transmit_alert(target_email, email_subject, email_body)
Assurez-vous que le script est exécutable et accessible :
chmod +x /usr/lib/zabbix/alertscripts/dispatch_mail.py
touch /var/log/zabbix_smtp.log
chown zabbix:zabbix /var/log/zabbix_smtp.log
Intégration dans l'interface Zabbix
Dans Zabbix 4 et versions ultérieures, la liaison du script se fait via la configuration des types de médias. Naviguez vers Administration ➔ Types de média ➔ Créer un type de média.
- Nom : Script E-mail HTML
- Type : Script
- Nom du script : dispatch_mail.py
Dans la section Paramètres du script, ajoutez les trois variables qui seront transmises par le moteur d'actions :
{ALERT.SENDTO}{ALERT.SUBJECT}{ALERT.MESSAGE}
Définition des actions et templates HTML
Accédez à Configuration ➔ Actions pour concevoir la mise en page des notifications. Les modèles modernes utilisent le CSS en ligne pour garantir la compatibilité avec les clients de messagerie.
Opérations par défaut (Incident) :
<div style="font-family: Arial, sans-serif; font-size: 14px; color: #333;">
<h3 style="color: #dc3545;">{TRIGGER.STATUS}: {TRIGGER.NAME}</h3>
<table style="border-collapse: collapse; width: 100%; border: 1px solid #dee2e6;">
<tr>
<td style="padding: 10px; border: 1px solid #dee2e6; background-color: #f8f9fa;"><strong>Hôte affecté</strong></td>
<td style="padding: 10px; border: 1px solid #dee2e6; background-color: #f8d7da;">{HOSTNAME1}</td>
</tr>
<tr>
<td style="padding: 10px; border: 1px solid #dee2e6; background-color: #f8f9fa;"><strong>Horodatage</strong></td>
<td style="padding: 10px; border: 1px solid #dee2e6;">{EVENT.DATE} {EVENT.TIME}</td>
</tr>
<tr>
<td style="padding: 10px; border: 1px solid #dee2e6; background-color: #f8f9fa;"><strong>Niveau de sévérité</strong></td>
<td style="padding: 10px; border: 1px solid #dee2e6;">{TRIGGER.SEVERITY}</td>
</tr>
<tr>
<td style="padding: 10px; border: 1px solid #dee2e6; background-color: #f8f9fa;"><strong>Détail de la métrique</strong></td>
<td style="padding: 10px; border: 1px solid #dee2e6; background-color: #f8d7da;">{ITEM.NAME}: {ITEM.VALUE}</td>
</tr>
<tr>
<td style="padding: 10px; border: 1px solid #dee2e6; background-color: #f8f9fa;"><strong>Identifiant de l'événement</strong></td>
<td style="padding: 10px; border: 1px solid #dee2e6;">{EVENT.ID}</td>
</tr>
</table>
</div>
Opérations de rétablissement (Résolution) :
La structure du tableau reste identique, mais les indicateurs visuels doivent refléter le retour à la normale. Modifiez les codes hexadécimaux de couleur d'arrière-plan dans le template de rétablissement pour passer du rouge clair (#f8d7da) au vert clair (#d4edda), et mettez le titre principal en vert (#28a745).
Enfin, liez ce type de média aux utilistaeurs cibles en allant dans Administration ➔ Utilisateurs. Dans l'onglet Média, sélectionnez "Script E-mail HTML" et renseignez l'adresse e-mail de destination. La validation du workflow s'effectue en simulant une panne, par exemple en stoppant le démon zabbix-agent sur un nœud cible, ce qui générera l'e-mail d'incident, suivi d'un second e-mail de rétablissement au redémarrage du service.