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 %}