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