Icinga ne surveillait rien : aucun objet Host ni Service de Set-OPS, seulement
la config Debian d'origine sur localhost.
Superviser setops-sauvegarde.service aurait reproduit le defaut du jour meme :
l'unite etait VERTE sur onze noeuds pendant qu'elle n'emportait rien. Le noeud
sait qu'il a LANCE sa sauvegarde, pas qu'elle est ARRIVEE. backup-01 evalue donc
ses depots et pousse un resultat passif par noeud vers l'API Icinga.
Trois criteres, parce qu'un seul suffit a mentir : l'instantane existe, il est
recent (26 h / 50 h), il contient au moins un fichier.
Le sens du flux est delibere : le depot parle a la supervision, jamais l'inverse
— compromettre mon-01 ne donne aucun acces aux sauvegardes.
Le ttl de 6 h fait la fraicheur : si le rapporteur se tait, Icinga perime les
services tout seul. C'est le silence qui a laisse le defaut vivre un mois.
Deux erreurs corrigees par la mesure :
- --data-urlencode refuse en Bad Request (l'API veut du JSON) ; le flux, le TLS
et l'auth marchaient, seule la charge etait perdue.
- le seuil « vide » en octets signalait a tort idm-01 (2363 o) : un export LDIF
d'un annuaire a un compte pese cela. « Vide » se mesure en FICHIERS. Et le
verdict est un AVERTISSEMENT : la machine ne distingue pas « les donnees ont
disparu » de « il n'y en a pas encore ».
Reserve assumee : curl -k — l'API presente le cert de sa propre AC, pas step-ca.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
52 lines
2.4 KiB
YAML
52 lines
2.4 KiB
YAML
---
|
|
serveur_icinga_paquets:
|
|
- icinga2
|
|
- icingadb
|
|
- icingadb-redis
|
|
- postgresql-client # pour importer le schema vers la BD distante
|
|
|
|
serveur_icinga_service_icinga2: "icinga2"
|
|
serveur_icinga_service_icingadb: "icingadb"
|
|
serveur_icinga_service_redis: "icingadb-redis"
|
|
|
|
# Depot apt officiel Icinga (paquet trousseau + source signee).
|
|
serveur_icinga_keyring_url: >-
|
|
https://packages.icinga.com/icinga-archive-keyring_latest+debian{{ ansible_distribution_major_version }}.deb
|
|
serveur_icinga_depot_source: >-
|
|
deb [signed-by=/usr/share/keyrings/icinga-archive-keyring.gpg]
|
|
https://packages.icinga.com/debian icinga-{{ ansible_distribution_release }} main
|
|
|
|
# Base Icinga DB : resolue depuis le registre par le groupe consommateur.
|
|
serveur_icinga_groupe: "serveur_icinga"
|
|
serveur_icinga_db_host: "" # dérivé (FQDN) par resoudre_base au déploiement
|
|
|
|
# Redis dedie a Icinga DB (paquet icingadb-redis).
|
|
serveur_icinga_redis_host: "localhost"
|
|
serveur_icinga_redis_port: 6380
|
|
|
|
serveur_icinga_config: "/etc/icingadb/config.yml"
|
|
serveur_icinga_schema: "/usr/share/icingadb/schema/pgsql/schema.sql"
|
|
|
|
# TLS vers PostgreSQL (zero-confiance). true = IcingaDB verifie le cert serveur
|
|
# contre le root_ca step-ca (host dans le SAN). root_ca doit etre lisible (0644).
|
|
serveur_icinga_db_tls: false
|
|
serveur_icinga_db_ca: "/etc/step/certs/root_ca.crt"
|
|
|
|
# --- Supervision des sauvegardes (resultats passifs pousses par le depot) ---
|
|
# Le controle porte sur la VERITE DE TERRAIN (l'instantane cote depot), pas sur l'unite
|
|
# systemd du noeud source : une unite verte sur un depot vide a menti pendant un mois.
|
|
serveur_icinga_setops_conf: "/etc/icinga2/conf.d/setops-sauvegardes.conf"
|
|
serveur_icinga_api_conf: "/etc/icinga2/conf.d/setops-api-users.conf"
|
|
serveur_icinga_api_utilisateur: "setops-depot"
|
|
serveur_icinga_api_motdepasse: "{{ vault_icinga_api_depot | default('') }}"
|
|
|
|
# Hote portant les depots : DERIVE du groupe, jamais ecrit en dur.
|
|
serveur_icinga_hote_sauvegarde: "{{ (groups['serveur_backup'] | default([]) | first) | default('') }}"
|
|
|
|
# Noeuds dont on ATTEND un instantane : ceux qui portent client_backup ET detiennent
|
|
# reellement de l'etat. Meme regle que `client_backup_jobs`, et meme source que P36 —
|
|
# la liste en clair du catalogue, lue depuis le role qui la possede.
|
|
serveur_icinga_sauvegarde_attendue: >-
|
|
{{ (client_backup_groupes_etat | default([]) | map('extract', groups)
|
|
| select('defined') | flatten | unique | list)
|
|
| intersect(groups['client_backup'] | default([])) }}
|