From cccb4e5b43f8a66af44a00d687d0414c93442383 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Wed, 2 Sep 2026 17:48:19 -0400 Subject: [PATCH] supervision : declarer a qui elle parle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Icinga livre son exemple avec root@localhost — une adresse que personne ne lit. Une supervision qui voit tout et n en parle a personne a le meme effet qu aucune supervision, en plus couteux : elle rassure. serveur_icinga_destinataire cree un utilisateur dans le groupe auquel les notifications sont deja assignees (Icinga refuse deux objets de meme nom, on ne peut pas redefinir l exemple ; on en ajoute un autre, l exemple reste muet). Vide, aucun destinataire n est pose ET LE DEPLOIEMENT LE DIT — plutot que de laisser croire qu une alerte partira. Eprouve : message expedie par le relais du site, status=sent (250 2.0.0 Ok), livre directement a mx.chezlepro.ca sans intermediaire ni dependance envers un locataire. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on --- roles/serveur_icinga/defaults/main.yml | 11 ++++++++++ roles/serveur_icinga/tasks/main.yml | 21 +++++++++++++++++++ .../templates/setops-users.conf.j2 | 20 ++++++++++++++++++ scripts/site_inventaire.py | 2 ++ 4 files changed, 54 insertions(+) create mode 100644 roles/serveur_icinga/templates/setops-users.conf.j2 diff --git a/roles/serveur_icinga/defaults/main.yml b/roles/serveur_icinga/defaults/main.yml index 380e3b7..fdf33f0 100644 --- a/roles/serveur_icinga/defaults/main.yml +++ b/roles/serveur_icinga/defaults/main.yml @@ -70,3 +70,14 @@ serveur_icinga_sauvegarde_attendue: >- {{ (client_backup_groupes_etat | default([]) | map('extract', groups) | select('defined') | flatten | unique | list) | intersect(groups['client_backup'] | default([])) }} + +# A QUI LA SUPERVISION PARLE — vide = personne, et on le DIT. +# +# Icinga livre son exemple avec `root@localhost`. Une supervision qui voit tout et +# n'en parle a personne a le meme effet qu'une supervision absente, en plus couteux : +# elle rassure. Renseigne, ce champ cree un destinataire dans le groupe auquel les +# notifications sont deja assignees. +# +# Vide, aucun destinataire n'est pose et le deploiement le SIGNALE — plutot que de +# laisser croire qu'une alerte partira. +serveur_icinga_destinataire: "" diff --git a/roles/serveur_icinga/tasks/main.yml b/roles/serveur_icinga/tasks/main.yml index a2da2f2..8d811c6 100644 --- a/roles/serveur_icinga/tasks/main.yml +++ b/roles/serveur_icinga/tasks/main.yml @@ -199,3 +199,24 @@ group: root mode: "0644" delegate_to: "{{ groups['serveur_backup'] | first }}" + +# --- A QUI PARLER ------------------------------------------------------------- +- name: Déclarer le destinataire des alertes + ansible.builtin.template: + src: setops-users.conf.j2 + dest: /etc/icinga2/conf.d/setops-users.conf + owner: root + group: nagios + mode: "0640" + when: serveur_icinga_destinataire | length > 0 + notify: Redemarrer icinga2 + +# DIRE CE QU'ON NE FAIT PAS. Sans destinataire, Icinga notifie `root@localhost` — une +# adresse que personne ne lit. Le silence alerterait alors dans le vide. +- name: Dire que personne ne recevra les alertes + ansible.builtin.debug: + msg: >- + `serveur_icinga_destinataire` n'est pas renseigne : les notifications iront a + `root@localhost`, que personne ne lit. La supervision VERRA les defauts sans + pouvoir les dire. Declarer l'adresse au plan. + when: serveur_icinga_destinataire | length == 0 diff --git a/roles/serveur_icinga/templates/setops-users.conf.j2 b/roles/serveur_icinga/templates/setops-users.conf.j2 new file mode 100644 index 0000000..6354679 --- /dev/null +++ b/roles/serveur_icinga/templates/setops-users.conf.j2 @@ -0,0 +1,20 @@ +/* + * Gere par Set-OPS (role serveur_icinga). Ne pas editer a la main. + * + * A QUI LA SUPERVISION PARLE. + * + * Icinga livre `users.conf` avec `email = "root@localhost"` — une adresse qui n'existe + * nulle part et que personne ne lit. Une supervision qui voit tout et le dit a personne + * a le meme effet qu'une supervision absente, en plus couteux : elle rassure. + * + * Ce fichier REMPLACE l'utilisateur d'exemple par celui du plan. Il trie apres + * `users.conf` — mais Icinga refuse deux objets de meme nom, on ne peut donc pas le + * redefinir : on en declare un AUTRE, et on l'ajoute au groupe auquel les notifications + * sont deja assignees. L'exemple reste, muet ; le notre recoit. + */ +object User "setops-exploitant" { + import "generic-user" + display_name = "Exploitant Set-OPS" + groups = [ "icingaadmins" ] + email = "{{ serveur_icinga_destinataire }}" +} diff --git a/scripts/site_inventaire.py b/scripts/site_inventaire.py index 7768234..df7952e 100755 --- a/scripts/site_inventaire.py +++ b/scripts/site_inventaire.py @@ -403,6 +403,8 @@ def inventaire() -> dict: # depend de l'ordre des plays est un reglage qui reviendra en arriere. # # Ici, tout play qui applique `ssh_hardening` a cet hote la voit. + # A qui la supervision parle. Vide, le role le SIGNALE au deploiement. + "serveur_icinga_destinataire": str(intrants.get("supervision_courriel") or ""), # LE POSTFIX DU SITE EXPEDIE, IL NE RECOIT PAS. # # `serveur_postfix` est d'abord le serveur de courriel d'un ecosysteme : il