Set-OPS-Public/roles/client_sante/tasks/main.yml

114 lines
4.1 KiB
YAML
Raw Normal View History

supervision : systemctl --failed entre dans Icinga (role client_sante) CE QU IL FERME. openipmi.service echouait a chaque demarrage sur les quatorze machines depuis le 2026-09-02, et systemctl --failed rendait ZERO partout : non parce qu elles allaient bien, mais parce qu aucune n avait redemarre depuis. Il a fallu qu un humain redemarre une machine pour que le defaut existe aux yeux de quelqu un. Un controle qui ne peut echouer qu au demarrage ne mesure rien tant que rien ne demarre. PASSIF, ET A DUREE DE VIE. Un controle actif ne voit pas la machine MUETTE. Ici c est le noeud qui parle, et le ttl de son envoi fait la fraicheur : sans nouvelle, Icinga perime le service tout seul. Le silence alerte autant que l echec. Le minuteur declenche AU DEMARRAGE autant que toutes les 15 min : les echecs de cette famille naissent au boot. CRITIQUE DES LA PREMIERE UNITE, jamais un seuil — une unite en echec est soit un vrai probleme soit du bruit a retirer, et un seuil ferait vivre le bruit. Les tolerances se nomment une par une, vide par defaut. CONTROLE NEGATIF. Unite factice sur obs-01, etat relu dans IcingaDB : CRITICAL, et le verdict NOMME l unite. Les treize autres OK. Apres nettoyage : 14/14 OK. UN CONFLIT EVITE. setops-sauvegardes.conf definissait les object Host ; un second fichier de controle aurait redefini les memes, et Icinga refuse un objet en double — la configuration entiere aurait ete rejetee, donc AUCUNE supervision, en voulant en ajouter. Les hotes vivent maintenant dans setops-hotes.conf, definis une fois. TROIS OBSTACLES. ${#tableau[@]} contient {# que Jinja lit comme un debut de commentaire (remede : comment_start_string en tete du gabarit). Ma premiere sonde a traduit un 403 « Missing permission: objects/query/service » en « 0 service » — encore un echec qui ecrasait permission ; l etat se lit dans IcingaDB. Et un echec apt transitoire sur mon-01, local et disparu au second essai : mesure avant conclusion. NON FAIT : le SITE n a pas recu client_sante. make prouver : CONFORME, 63 OK, 0 echec, 0 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-09 20:32:08 -04:00
---
# LE NOEUD RAPPORTE SES UNITES EN ECHEC. Voir le gabarit du script pour le pourquoi.
#
# Conditionne a l'existence d'un `serveur_icinga` : sans destinataire, le rapport
# n'irait nulle part, et un timer qui echoue chaque quart d'heure apprend a ignorer
# le rouge. Meme regle que `client_backup`.
- name: Aucune supervision dans cet écosystème — rien à poser
ansible.builtin.debug:
msg: >-
Aucun hôte `serveur_icinga` : le rapport de santé n'est pas posé. Ce n'est pas une
erreur — c'est un écosystème sans supervision, et le dire vaut mieux que d'installer
un minuteur qui échouerait dans le vide.
when: not client_sante_icinga_hote
- name: Poser le rapport de santé
when: client_sante_icinga_hote | length > 0
block:
- name: Exiger de quoi rapporter à Icinga
ansible.builtin.assert:
that:
- client_sante_icinga_motdepasse | length > 0
fail_msg: >-
`vault_icinga_api_depot` requis : un hôte `serveur_icinga` existe, mais aucun
secret d'API. Le nœud verrait ses unités en échec sans pouvoir le dire.
- name: Assurer le répertoire des secrets Set-OPS
ansible.builtin.file:
path: /etc/setops
state: directory
owner: root
group: root
mode: "0755"
- name: Déposer le mot de passe d'API Icinga
ansible.builtin.copy:
content: "{{ client_sante_icinga_motdepasse }}\n"
dest: /etc/setops/icinga-api.pass
owner: root
group: root
mode: "0600"
no_log: true
# L'AC d'ICINGA, PAS CELLE DE step-ca : Icinga refuse de servir un certificat qu'il
# n'a pas emis (il renouvelle tout ce qui expire sous 30 jours, nos certificats vivent
# 24 h). Domaine de confiance ferme, pair authentifie malgre tout.
- name: L'AC d'Icinga est-elle déjà disponible ?
ansible.builtin.stat:
path: "{{ client_sante_icinga_ca_source }}"
delegate_to: "{{ client_sante_icinga_hote }}"
register: client_sante_ca_presente
- name: Récupérer l'AC d'Icinga depuis l'hôte de supervision
when: client_sante_ca_presente.stat.exists
ansible.builtin.slurp:
src: "{{ client_sante_icinga_ca_source }}"
delegate_to: "{{ client_sante_icinga_hote }}"
register: client_sante_ca_icinga
- name: Déposer l'AC d'Icinga pour la vérification du pair
when: client_sante_ca_presente.stat.exists
ansible.builtin.copy:
content: "{{ client_sante_ca_icinga.content | b64decode }}"
dest: "{{ client_sante_ca_verification }}"
owner: root
group: root
mode: "0644"
- name: Installer curl pour le rapport passif
ansible.builtin.apt:
name: curl
state: present
- name: Déployer le script de rapport de santé
ansible.builtin.template:
src: setops-sante.sh.j2
dest: /usr/local/sbin/setops-sante.sh
owner: root
group: root
mode: "0750"
- name: Déployer l'unité systemd du rapport
ansible.builtin.template:
src: setops-sante.service.j2
dest: /etc/systemd/system/setops-sante.service
owner: root
group: root
mode: "0644"
notify: Recharger systemd
- name: Déployer le minuteur du rapport
ansible.builtin.template:
src: setops-sante.timer.j2
dest: /etc/systemd/system/setops-sante.timer
owner: root
group: root
mode: "0644"
notify: Recharger systemd
- name: Activer le rapport de santé
ansible.builtin.systemd:
name: setops-sante.timer
enabled: true
state: started
daemon_reload: true
# PREMIER RAPPORT IMMEDIAT, et ce n'est pas une commodite : sans lui, le service
# reste « en attente » jusqu'au premier declenchement, et un deploiement qui vient
# d'installer la supervision laisserait un tableau vide qu'on prendrait pour un
# tableau sain.
- name: Rapporter tout de suite (ne pas laisser un tableau vide passer pour sain)
ansible.builtin.command: /usr/local/sbin/setops-sante.sh
changed_when: false
failed_when: false