Set-OPS-Public/roles/client_unbound/tasks/main.yml
Daniel Allaire 0de5294a20 client_unbound : survivre a la perte de connexion sans la masquer
Le deploiement s'interrompait autour du redemarrage d'Unbound (« banner
exchange »), et Ansible abandonnait alors TOUTES les couches suivantes de
l'hote — alors qu'il repondait de nouveau une minute plus tard.

Ma premiere explication etait fausse et je l'ai verifiee avant de coder :
sshd -T dit usedns no, il n'y a pas de resolution inverse. Et la cause reste
INCONNUE — j'avais ecrase le journal du deploiement rate en relancant. Faute
de methode, pas de raisonnement.

Ce que le depot sait de ce symptome est deja dans le Makefile : a travers la
frontiere le TCP s'etablit par proxy SYN, et l'echec se lit « banner exchange »
meme quand l'hote n'est pas la. Le message accuse SSH pour un probleme
d'accessibilite.

Corrige sans pretendre connaitre la cause : ignore_unreachable sur le handler,
puis wait_for_connection qui EXIGE le retour (180 s). Si l'hote ne revient
pas, la tache suivante echoue franchement — on ne masque rien.

Regle pour moi : ne plus ecraser le journal d'un echec avant de l'avoir lu.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 11:55:41 -04:00

83 lines
2.8 KiB
YAML

---
- name: Exiger l'IP de l'autoritatif interne (PowerDNS)
ansible.builtin.assert:
that:
- client_unbound_dns_autoritatif | length > 0
fail_msg: "client_unbound_dns_autoritatif requis (aucun hôte serveur_powerdns actif ?)."
- name: Installer Unbound
ansible.builtin.apt:
name: "{{ client_unbound_paquets }}"
state: present
update_cache: true
cache_valid_time: 3600
- name: Déployer la configuration Unbound (stub-zone interne + récursion)
ansible.builtin.template:
src: setops.conf.j2
dest: /etc/unbound/unbound.conf.d/setops.conf
owner: root
group: root
mode: "0644"
notify: Redémarrer unbound
- name: Valider la configuration Unbound
ansible.builtin.command: unbound-checkconf
changed_when: false
when: not ansible_check_mode
- name: Activer et démarrer Unbound
ansible.builtin.systemd:
name: "{{ client_unbound_service }}"
enabled: true
state: started
when: not ansible_check_mode
- name: Appliquer les redémarrages Unbound avant toute validation/bascule
ansible.builtin.meta: flush_handlers
# Attendre une CONDITION — que l'hote reponde — et non une duree. Si la connexion a
# saute pendant le redemarrage, on la retablit ici ; sinon la tache passe aussitot.
- name: Exiger que l hote reponde avant de poursuivre
ansible.builtin.wait_for_connection:
timeout: "{{ client_unbound_attente_reconnexion }}"
sleep: 5
when: not ansible_check_mode
# --- Bascule du resolver : PROTÉGÉE + validée (ne casse jamais un nœud) ---
- name: Refuser la bascule du resolver sans confirmation explicite
ansible.builtin.assert:
that:
- client_unbound_confirm | bool
fail_msg: "Bascule refusée : définir client_unbound_confirm=true (avec client_unbound_apply=true)."
when: client_unbound_apply | bool
- name: Valider qu'Unbound résout AVANT de basculer (interne + Internet)
ansible.builtin.command: "dig @127.0.0.1 {{ item.nom }} {{ item.type }} +short"
register: client_unbound_validation
changed_when: false
failed_when: client_unbound_validation.stdout | trim == ''
loop:
- { nom: "{{ client_unbound_zone_interne }}", type: "SOA" }
- { nom: "deb.debian.org", type: "A" }
loop_control:
label: "{{ item.nom }} {{ item.type }}"
when:
- client_unbound_apply | bool
- client_unbound_confirm | bool
- not ansible_check_mode
- name: Basculer /etc/resolv.conf vers Unbound local (127.0.0.1)
ansible.builtin.copy:
dest: "{{ client_unbound_resolv_conf }}"
content: |
# Généré par Set-OPS (rôle client_unbound). Résolveur local Unbound.
search {{ client_unbound_zone_interne }}
nameserver 127.0.0.1
owner: root
group: root
mode: "0644"
when:
- client_unbound_apply | bool
- client_unbound_confirm | bool
- not ansible_check_mode