serveur_powerdns : A d'exposition auto-dérivés (DNS de la Phase 3 bindings)

La zone interne inclut désormais un A pour chaque FQDN d'exposition
(expose des applications) vers l'edge qui le sert (domaines.edge), via
expositions_des_applications. Déclarer expose → vhost + SAN cert + DNS.

Prouvé : dig @infra-dns-01 grafana/keycloak.lab.chezlepro.internal → edge .21.

Limite : PowerDNS est autoritatif (pas récursif) — pour que les nœuds
l'utilisent sans casser Internet, il faut un récursif (pdns-recursor) ou
garder le plancher /etc/hosts. Ne pas repointer client_dns naïvement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-03 13:47:29 -04:00
parent 494dbb32dc
commit 00ba515aad
4 changed files with 39 additions and 0 deletions

View file

@ -3,6 +3,16 @@
## 2026-07-03
### Ajouté
- **PowerDNS — A d'exposition auto-dérivés (le DNS de la Phase 3 des bindings).** `serveur_powerdns`
génère désormais, dans la zone interne, un enregistrement A pour chaque FQDN d'exposition (champ
`expose` des applications) vers l'**edge qui le sert** (`domaines.edge`) — via
`expositions_des_applications` (même source que les vhosts nginx et les SANs du cert edge).
Déclarer `expose` produit maintenant **vhost + SAN de cert + enregistrement DNS**, tout dérivé.
**Prouvé** : `dig @infra-dns-01 grafana.lab.chezlepro.internal` et `keycloak.…``192.168.15.21`
(edge). Option `serveur_powerdns_publier_expositions` (défaut true). **Limite / reste** : PowerDNS
est **autoritatif, pas récursif** — pour que les nœuds *utilisent* ces A sans casser la résolution
Internet, il faut un **récursif** (pdns-recursor : forward de la zone interne + récursion du reste)
ou garder le plancher `/etc/hosts`. Ne PAS repointer naïvement `client_dns` vers l'autoritatif.
- **Bindings — Phase 1 : résolveur de liens dans `instancier.py` (relations service→service
déclaratives).** Une application déclare ses `liens: [{vers, role}]` dans
`plan/applications.yml` ; chaque rôle décrit les liens qu'il accepte dans `meta/liens.yml`

View file

@ -31,3 +31,8 @@ serveur_powerdns_records:
# Groupes dont les hotes actifs avec ansible_host seront ajoutes a la zone.
serveur_powerdns_inventory_groups:
- hotes_actifs
# Publier des A pour les FQDN d'exposition (champ 'expose' des applications) vers l'edge
# qui les sert (domaines.edge). Ferme la boucle : declarer 'expose' -> vhost + cert + DNS.
serveur_powerdns_publier_expositions: true
serveur_powerdns_expositions: []

View file

@ -32,6 +32,21 @@
mode: "0644"
notify: Validate and reload PowerDNS
- name: Charger les registres applications et domaines (expositions)
ansible.builtin.include_vars:
file: "{{ item }}"
loop:
- "{{ setops_plan_dir }}/applications.yml"
- "{{ setops_plan_dir }}/domaines.yml"
when: serveur_powerdns_publier_expositions | bool
- 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

View file

@ -24,3 +24,12 @@ $TTL {{ serveur_powerdns_ttl }}
{% endif %}
{% endfor %}
{% endfor %}
{% if serveur_powerdns_publier_expositions | default(false) %}
{% for expo in serveur_powerdns_expositions | default([]) if expo.domaine == serveur_powerdns_zone %}
{% set edge_hosts = groups.get(expo.edge, []) %}
{% if edge_hosts and hostvars[edge_hosts[0]].ansible_host is defined %}
{{ expo.fqdn[:-(serveur_powerdns_zone | length + 1)] }} IN A {{ hostvars[edge_hosts[0]].ansible_host }}
{% endif %}
{% endfor %}
{% endif %}