--- - name: Exiger un résolveur joignable quand l'intégration est active ansible.builtin.assert: that: - client_resolveur_adresse | length > 0 fail_msg: >- client_resolveur est actif mais aucun hôte ne porte `serveur_resolveur`, ou son adresse est introuvable. Déclarer le service au plan, ou forcer client_resolveur_actif=false. when: client_resolveur_actif | bool - name: Refuser la bascule du résolveur sans confirmation explicite ansible.builtin.assert: that: - client_resolveur_confirm | bool fail_msg: "Bascule refusée : définir client_resolveur_confirm=true (avec client_resolveur_apply=true)." when: client_resolveur_apply | bool # ON VÉRIFIE AVANT DE BASCULER, PAS APRÈS. Un resolv.conf qui pointe vers un service muet # coupe l'hôte de tout — et le diagnostic, lui, exige de résoudre des noms. - name: Valider que le résolveur répond AVANT de basculer (interne + Internet) ansible.builtin.command: "dig @{{ client_resolveur_adresse }} {{ item.nom }} {{ item.type }} +short" register: client_resolveur_validation changed_when: false failed_when: client_resolveur_validation.stdout | trim == '' loop: - { nom: "{{ client_resolveur_zone_interne }}", type: "SOA" } - { nom: "deb.debian.org", type: "A" } loop_control: label: "{{ item.nom }} {{ item.type }}" when: - client_resolveur_actif | bool - client_resolveur_apply | bool - client_resolveur_confirm | bool - not ansible_check_mode - name: Désigner le résolveur de l'écosystème ansible.builtin.copy: dest: "{{ client_resolveur_resolv_conf }}" content: | # Généré par Set-OPS (rôle client_resolveur). Résolveur de l'écosystème. search {{ client_resolveur_zone_interne }} nameserver {{ client_resolveur_adresse }} owner: root group: root mode: "0644" when: - client_resolveur_actif | bool - client_resolveur_apply | bool - client_resolveur_confirm | bool - not ansible_check_mode # RETIRER L'ANCIEN DÉMON LOCAL — APRÈS la bascule, jamais avant. # # Sans cette tâche, les N Unbound qu'on voulait supprimer resteraient installés et actifs : # le rôle aurait changé le `resolv.conf` sans rien économiser, et la raison même du # changement serait perdue. Une intégration qui ne sait pas se retirer est un piège # différé. # # L'ORDRE COMPTE. Retirer le paquet avant d'avoir écrit le nouveau `resolv.conf` couperait # l'hôte de toute résolution au milieu du play — et le diagnostic, lui, a besoin de # résoudre des noms. # # L'HÔTE QUI PORTE LE RÉSOLVEUR EST ÉPARGNÉ, évidemment : c'est le même paquet. - name: Retirer le résolveur local devenu inutile ansible.builtin.apt: name: unbound state: absent purge: false when: - client_resolveur_actif | bool - client_resolveur_apply | bool - client_resolveur_confirm | bool - inventory_hostname not in (groups['serveur_resolveur'] | default([])) - not ansible_check_mode