From 00ba515aadbdb23544b6d45c3b6dbf027263fe31 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Fri, 3 Jul 2026 13:47:29 -0400 Subject: [PATCH] =?UTF-8?q?serveur=5Fpowerdns=20:=20A=20d'exposition=20aut?= =?UTF-8?q?o-d=C3=A9riv=C3=A9s=20(DNS=20de=20la=20Phase=203=20bindings)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- CHANGELOG.md | 10 ++++++++++ roles/serveur_powerdns/defaults/main.yml | 5 +++++ roles/serveur_powerdns/tasks/main.yml | 15 +++++++++++++++ roles/serveur_powerdns/templates/zone.db.j2 | 9 +++++++++ 4 files changed, 39 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e981800..d73868f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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` diff --git a/roles/serveur_powerdns/defaults/main.yml b/roles/serveur_powerdns/defaults/main.yml index 1084571..92df51c 100644 --- a/roles/serveur_powerdns/defaults/main.yml +++ b/roles/serveur_powerdns/defaults/main.yml @@ -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: [] diff --git a/roles/serveur_powerdns/tasks/main.yml b/roles/serveur_powerdns/tasks/main.yml index 4a6aaea..d46fadb 100644 --- a/roles/serveur_powerdns/tasks/main.yml +++ b/roles/serveur_powerdns/tasks/main.yml @@ -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 diff --git a/roles/serveur_powerdns/templates/zone.db.j2 b/roles/serveur_powerdns/templates/zone.db.j2 index 5b5fa68..6e802a0 100644 --- a/roles/serveur_powerdns/templates/zone.db.j2 +++ b/roles/serveur_powerdns/templates/zone.db.j2 @@ -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 %}