CORRECTION DE COMPTE D ABORD. J avais annonce cinq groupes sans sonde. La mesure en donne VINGT-SEPT : j avais compte ceux que j avais en tete, pas ceux que le depot contient. Il en reste vingt-deux. LES CINQ, PAR ORDRE DE DEGAT SILENCIEUX. autorite (step_ca) — la plus urgente : nos certificats vivent 24 h, une AC muette ne casse rien aujourd hui et casse TOUT demain, d un coup, sur les 21 machines. Elle surveille aussi l expiration de la RACINE, que personne ne regarde parce qu elle vit des annees (relevee a 3642 jours). base (postgresql) — une VRAIE requete, pas pg_isready : celui-ci dit que le port repond, pas que la base sert. Plus le compte des connexions : a saturation, chaque application tombe sans que la base ait l air morte. annuaire (openldap) — elle COMPTE les entrees. Un annuaire vide repond success a tout : le mensonge des sauvegardes vides, vert et sans contenu. zones (powerdns) — un autoritatif sans zone repond NXDOMAIN a tout, ce qui se lit comme « ce nom n existe pas ». edge (nginx) — elle valide la configuration SUR DISQUE : nginx sert la derniere valide, et une configuration cassee ne se voit qu au prochain demarrage, souvent des mois plus tard. Les cinq eprouvees vertes sur le sain puis rouges PAR PARAMETRE, sans toucher a un service. Etat : 20 sondes sur 19 roles, 23 services distincts, 70 instances, 67 au vert. Les trois autres sont connues : deux sauvegardes sans donnee a emporter, et Loki en delai de stabilisation apres redeploiement. make prouver : CONFORME, 64 OK, 0 echec, 0 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
147 lines
5.4 KiB
YAML
147 lines
5.4 KiB
YAML
---
|
|
- name: Installer PowerDNS Authoritative
|
|
ansible.builtin.apt:
|
|
name: "{{ serveur_powerdns_packages }}"
|
|
state: present
|
|
update_cache: true
|
|
cache_valid_time: 3600
|
|
|
|
- name: Créer le répertoire des zones PowerDNS
|
|
ansible.builtin.file:
|
|
path: "{{ serveur_powerdns_zone_directory }}"
|
|
state: directory
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
|
|
- name: Déployer la configuration du backend BIND
|
|
ansible.builtin.template:
|
|
src: setops-bind.conf.j2
|
|
dest: /etc/powerdns/pdns.d/setops-bind.conf
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
notify: Validate and reload PowerDNS
|
|
|
|
- name: Déployer l'index des zones PowerDNS
|
|
ansible.builtin.template:
|
|
src: bindbackend.conf.j2
|
|
dest: "{{ serveur_powerdns_bind_config }}"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
notify: Validate and reload PowerDNS
|
|
|
|
# CHAQUE REGISTRE EST CHARGE POUR LUI-MEME (2026-08-25).
|
|
#
|
|
# Ce `include_vars` listait les deux fichiers en dur et echouait si l'un manquait.
|
|
# `domaines.yml` declare les domaines PUBLICS, et un ecosysteme peut legitimement n'en
|
|
# avoir aucun — c'est le cas du SITE, dont tous les services sont internes.
|
|
#
|
|
# Le defaut est reste invisible tant que le site gardait `publier_expositions: false` ;
|
|
# il est apparu a la seconde ou on a voulu publier ses noms de service. C'est le MEME
|
|
# defaut que `hosts_statiques` a corrige le meme jour, dans les memes termes : un registre
|
|
# absent n'est pas une faute, il est simplement absent.
|
|
- name: Vérifier la présence des registres du plan (sur le nœud de contrôle)
|
|
ansible.builtin.stat:
|
|
path: "{{ item }}"
|
|
register: serveur_powerdns_plan
|
|
delegate_to: localhost # les registres du plan vivent sur le nœud de contrôle
|
|
become: false # lire un fichier ne nécessite pas de privilèges
|
|
loop:
|
|
- "{{ setops_plan_dir }}/applications.yml"
|
|
- "{{ setops_plan_dir }}/domaines.yml"
|
|
loop_control:
|
|
label: "{{ item | basename }}"
|
|
when: serveur_powerdns_publier_expositions | bool
|
|
|
|
- name: Charger les registres applications et domaines (si présents)
|
|
ansible.builtin.include_vars:
|
|
file: "{{ item.item }}"
|
|
loop: "{{ serveur_powerdns_plan.results | default([]) }}"
|
|
loop_control:
|
|
label: "{{ item.item | basename }}"
|
|
when:
|
|
- serveur_powerdns_publier_expositions | bool
|
|
- item.stat.exists | default(false)
|
|
|
|
- name: Dériver les A d'exposition (FQDN publics -> edge qui les sert)
|
|
ansible.builtin.set_fact:
|
|
serveur_powerdns_expositions: >-
|
|
{{ {'applications': applications | default({})}
|
|
| expositions_des_applications({'domaines_publics': domaines_publics | default({})}) }}
|
|
when: serveur_powerdns_publier_expositions | bool
|
|
|
|
- name: Générer la zone DNS interne depuis l'inventaire
|
|
ansible.builtin.template:
|
|
src: zone.db.j2
|
|
dest: "{{ serveur_powerdns_zone_directory }}/{{ serveur_powerdns_zone }}.zone"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
notify: Validate and reload PowerDNS
|
|
|
|
# Meme source que la zone directe : `hotes_actifs` et son `ansible_host`. Deux zones
|
|
# alimentees par une seule verite — l'endroit ou elles divergeraient n'existe pas.
|
|
- name: Générer les zones DNS inverses depuis l'inventaire
|
|
ansible.builtin.template:
|
|
src: zone-inverse.db.j2
|
|
dest: "{{ serveur_powerdns_zone_directory }}/{{ zone_inverse }}.zone"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
loop: "{{ serveur_powerdns_zones_inverses | default([]) }}"
|
|
loop_control:
|
|
loop_var: zone_inverse
|
|
notify: Validate and reload PowerDNS
|
|
|
|
# UNE ZONE INVERSE QUI N'EST PLUS REVENDIQUEE DOIT DISPARAITRE. Sans ce retrait, un
|
|
# ecosysteme qui abandonne un reseau laisserait derriere lui un fichier que le backend ne
|
|
# declare plus mais que le repertoire garde — et le prochain lecteur croirait la zone
|
|
# servie.
|
|
- name: Relever les zones inverses présentes sur la machine
|
|
ansible.builtin.find:
|
|
paths: "{{ serveur_powerdns_zone_directory }}"
|
|
patterns: "*.in-addr.arpa.zone"
|
|
register: serveur_powerdns_inverses_presentes
|
|
|
|
- name: Retirer les zones inverses que l'écosystème ne revendique plus
|
|
ansible.builtin.file:
|
|
path: "{{ item.path }}"
|
|
state: absent
|
|
loop: "{{ serveur_powerdns_inverses_presentes.files | default([]) }}"
|
|
loop_control:
|
|
label: "{{ item.path | basename }}"
|
|
when: >-
|
|
(item.path | basename | regex_replace('\.zone$', ''))
|
|
not in (serveur_powerdns_zones_inverses | default([]))
|
|
notify: Validate and reload PowerDNS
|
|
|
|
- name: Activer et démarrer PowerDNS
|
|
ansible.builtin.systemd:
|
|
name: "{{ serveur_powerdns_service_name }}"
|
|
enabled: true
|
|
state: started
|
|
# Dry-run (--check) : le paquet n'est pas reellement installe, donc le service
|
|
# n'existe pas encore et systemd echouerait. On saute en mode check seulement ;
|
|
# en vrai deploiement, la tache s'execute normalement.
|
|
when: not ansible_check_mode
|
|
|
|
# --- Sonde de supervision (docs/supervision-conception.md) --------------------------
|
|
# Le role qui possede la verite depose sa propre sonde ; le porteur (`client_sante`) la
|
|
# fait tourner et pousse le verdict, sans savoir ce qu'elle mesure.
|
|
- name: Assurer le repertoire des sondes de supervision
|
|
ansible.builtin.file:
|
|
path: /usr/local/lib/setops/sondes
|
|
state: directory
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
|
|
- name: Deposer la sonde « zones »
|
|
ansible.builtin.template:
|
|
src: sonde-zones.sh.j2
|
|
dest: /usr/local/lib/setops/sondes/zones.sh
|
|
owner: root
|
|
group: root
|
|
mode: "0750"
|