La revision a commence par un balayage par motifs — chemins morts, cibles make absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque tout le reste : un motif ne voit que ce qui s exprime en motif. make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus haut. Il fallait lire pour la voir. 74 documents lus un par un. 66 corriges, 8 exacts. CE QUI ETAIT FRANCHEMENT FAUX AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre des VM reelles. Elle a ete rasee et remontee depuis zero trois fois. ecosysteme-chezlepro.md, le document montre a un client, portait la meme phrase : il se sous-vendait gravement. courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n est construit alors qu il rapporte des mesures datees du role en fonctionnement. hebergeur-exploitation.md disait rien n est fait d un depot qui existe. filiation-emancipation.md se contredisait a deux ecrans de distance. DES MODELES DECRITS D APRES UN MONDE ANTERIEUR Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le donnaient en exemple d integration FACULTATIVE — il est universel depuis le 2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki qui avait raison. CE QUI CASSE AU PREMIER ESSAI Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le FABRIQUE et le critere R2 de l epreuve d operateur independant. preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait detruite : raser derive du plan, il ne la detruira jamais — le risque est l inverse. Un mot de passe d essai en clair dans un depot public. DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux declarations reelles : 12 annonces, 21 reels. Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une erreur ajoute l assurance a l erreur. CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il nomme existe. P29 tient les positions d authentification, personne ne tient les habilitations. make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
5.3 KiB
DNS interne
Pour qui : le mainteneur du DNS interne.
Le service DNS interne est la premiere capacite de plateforme.
Plancher de resolution independant du DNS. Le socle (
hosts_statiques, dansserveur_debian) genere/etc/hostssur chaque VM depuis l'inventaire : tout l'ecosysteme se resout par nom meme serveur DNS eteint (et au bootstrap, avant que PowerDNS ne soit la). PowerDNS devient une commodite (zone, externe, dynamique), plus un point de defaillance.
Trois couches, et une seule est optionnelle
Ce paragraphe decrivait le modele d'avant le 2026-08-24 — un Unbound sur chaque VM, en opt-in. Ce n'est plus le cas :
client_resolveurn'installe plus rien, et son integration est universelle, pas elective.
1. hosts_statiques le PLANCHER : /etc/hosts genere sur chaque VM depuis l'inventaire
-> l'ecosysteme se resout DNS eteint. Jamais optionnel.
2. serveur_powerdns l'AUTORITATIF de la zone souveraine (un par ecosysteme)
3. serveur_resolveur le RECURSIF : UN seul Unbound pour tout le tenant, qui recurse
depuis la racine et delegue la zone souveraine a PowerDNS
client_resolveur l'integration : ecrit /etc/resolv.conf pour designer ce resolveur
client_resolveur n'installe plus de demon (2026-08-24). Il en posait un par VM — N
demons identiques de ~21 Mo pour quelques centaines de requetes. Il ne fait plus qu'une
chose : ecrire /etc/resolv.conf. Son integration est marquee universelle: true, et
elle n'a aucune exemption, pas meme l'hote qui porte le resolveur : il se sert
lui-meme. L'ancien nom (client_unbound) mentait des lors qu'il n'installait plus Unbound.
L'integration suit l'existence du service, elle ne se declare pas. Aucun
serveur_resolveur au plan rend client_resolveur_actif faux et le role ne touche a rien :
l'ecosysteme garde la resolution d'amorcage de cloud-init. C'est un choix valide, pas une
panne.
Groupes
serveur_powerdns -> autoritatif interne (PowerDNS Authoritative)
serveur_resolveur -> LE recursif du tenant (Unbound), un seul
client_resolveur -> integration universelle : designe ce resolveur dans /etc/resolv.conf
Zone initiale
La zone initiale est :
exemple.internal
Elle est definie dans :
instance/inventories/<inventaire>/group_vars/serveur_powerdns.yml
Enregistrement automatique
Le role serveur_powerdns genere la zone a partir de l'inventaire.
Les hotes qui remplissent ces conditions sont ajoutes automatiquement :
hote dans hotes_actifs
ansible_host defini
Exemple :
web-frontal-01 ansible_host=10.0.2.31
-> web-frontal-01.exemple.internal A 10.0.2.31
Les enregistrements additionnels explicites sont dans serveur_powerdns_records.
Backend PowerDNS
Le premier jalon utilise le backend BIND de PowerDNS.
Raison :
- pas de dependance prematuree a PostgreSQL ;
- zone lisible et generee par Ansible ;
- idempotence simple ;
- bon point de depart pour la supervision.
Quand serveur_postgresql sera stable, il sera possible de migrer vers un backend SQL si le besoin operationnel le justifie.
La bascule de /etc/resolv.conf est protegee
Le role client_resolveur ne bascule /etc/resolv.conf qu'apres avoir verifie que le
resolveur repond deja — pour l'interne et pour l'Internet :
client_resolveur_apply: true
client_resolveur_confirm: true
Sans ces deux variables, le role prépare Unbound mais ne modifie pas /etc/resolv.conf.
Cette protection est volontaire : une mauvaise configuration DNS peut couper la resolution de noms. C'est la dependance la plus dangereuse du lot — basculer un hote sur un resolveur qui n'est pas encore pret le rend muet, et le runner qui devrait reparer tombe avec les autres. Le playbook de groupe applique donc l'hote qui porte le resolveur avant ceux qui s'y adressent, et la preuve P44 refuse tout ecart entre cette declaration et lui.
Le piege qui a coute deux jours : la racine signee nie notre TLD
internal. n'est pas delegue dans la racine, qui est signee : elle rend donc une preuve
NXDOMAIN validee pour ce TLD. Or harden-below-nxdomain — actif par defaut dans
Unbound — tient ce « non » pour prouve et repond NXDOMAIN pour tout nom sous
internal. depuis son cache, sans jamais interroger la stub-zone declaree plus bas.
La delegation etait correcte. L'autoritatif repondait juste. Pas une requete ne lui parvenait.
Ce qui declenche l'empoisonnement : n'importe quelle question sur un nom inexistant sous
internal. — y compris la zone d'un autre ecosysteme, que ce resolveur ne sert pas et
va donc chercher a la racine. Sur un resolveur partage, ca arrive en permanence.
Et la panne parait intermittente : au redemarrage le cache est vide, tout fonctionne, on
conclut que c'est regle. Le remede mesure (2026-09-02) est harden-below-nxdomain: no dans
roles/serveur_resolveur/templates/setops.conf.j2 — pas aggressive-nsec, qui traite
un autre symptome.
Surveillance a prevoir
Les premiers checks utiles :
- service
pdnsactif ; - port UDP/TCP 53 disponible ;
- SOA de
exemple.internalresoluble ; - enregistrement
ns1.exemple.internalresoluble ; - enregistrements des hotes actifs presents ;
- serial de zone attendu ;
- latence de resolution.