Set-OPS-Public/roles/client_resolveur/tasks/main.yml
Daniel Allaire db2d6f6bf0 resolveur : un par tenant, et non plus un par machine
Mesure avant de decider : ~21 Mo de RSS par VM pour 28 a 189 requetes servies.
Le gain de cache est negligeable ; ce qu'on recupere, c'est un demon au lieu de
cinq et un endroit a regarder au lieu de cinq.

Pas sur la frontiere : un resolveur de SITE devrait connaitre la zone interne de
chaque tenant, et un tenant dont le resolveur vit chez l'hebergeur ne peut plus
s'emanciper avec. La recursion est generique, la zone interne ne l'est pas.

L'autoritatif se replie sur 127.0.0.1:5300 -- derive de la colocalisation, pas
declare a la main. Son port devient `derive` dans meta/flux.yml : les deux lient
53 mais sur des adresses differentes.

Deux pieges. Unbound refuse d'interroger une loopback par defaut : sans lever
do-not-query-localhost, toute la zone rendait SERVFAIL. Et le plancher
/etc/hosts MASQUAIT la panne -- getent repondait, dig disait SERVFAIL. La tache
de validation du role avait raison contre moi.

client_unbound n'installant plus Unbound, son nom mentait : client_resolveur.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 16:59:34 -04:00

75 lines
2.9 KiB
YAML

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