Mise au point de l'exploitant : la frontiere n'a pas de service DNS actif et gere. Un
Unbound y tourne — il repondait, ce qui m'a induit en erreur — mais un processus n'est pas
un service. La delegation de zone que j'y avais posee est retiree.
Et le site a son propre DNS : `dns_amorcage` pointait encore sur la frontiere, valeur d'un
moment ou site-dns-01 n'existait pas. Elle vaut desormais 10.0.3.51.
Deux defauts revelés au passage :
- devis_opnsense lisait encore underlay.machines(), vide depuis le deplacement du plan.
Il proposait de RETIRER 36 objets — tous les alias et regles du site. Aucune preuve ne
couvre ce devis : c'est le plan avant application qui l'a attrape.
- le socle defaisait la bascule de client_resolveur a chaque passage. Sa garde ne
protegeait que l'hote du resolveur (127.0.0.1). Invisible chez un tenant, ou
dns_amorcage vaut l'adresse du resolveur : la coincidence masquait le defaut. Ca ne
s'est vu qu'en retirant la regle de pare-feu — les cinq machines ont perdu la
resolution d'un coup.
L'amorcage ne s'applique plus que si rien de sense n'est en place. Verifie : socle
`changed=0`, les cinq machines restent sur 10.0.3.51.
42 preuves vertes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
89 lines
3.9 KiB
YAML
89 lines
3.9 KiB
YAML
---
|
|
- name: Appliquer le groupe serveur_debian
|
|
hosts: serveur_debian
|
|
become: true
|
|
# Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs
|
|
# minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute
|
|
# tache apt du play en herite, y compris celles des roles inclus.
|
|
module_defaults:
|
|
ansible.builtin.apt:
|
|
lock_timeout: 300
|
|
|
|
gather_facts: true
|
|
|
|
pre_tasks:
|
|
- name: Vérifier que la cible est Debian
|
|
ansible.builtin.assert:
|
|
that:
|
|
- ansible_facts.distribution == "Debian"
|
|
fail_msg: "Ce playbook est prévu pour Debian."
|
|
|
|
# Résolveur d'AMORÇAGE, posé avant `common_packages` — donc avant le premier `apt`.
|
|
# Sans lui, le déploiement échoue avant d'avoir commencé : le gabarit doré transporte
|
|
# un `/etc/resolv.conf` figé, et le `dns-nameservers` écrit par cloud-init reste sans
|
|
# effet faute de `resolvconf` (qu'on ne peut pas installer sans résolution — la boucle
|
|
# se referme). Mesuré le 2026-08-06 sur deux VM neuves.
|
|
#
|
|
# PASSAGE DE RELAIS : `client_resolveur` reprend ce fichier plus tard pour le basculer
|
|
# vers `127.0.0.1`. La garde ci-dessous le respecte — sans elle, chaque déploiement
|
|
# défairait la bascule, et deux rôles se disputeraient le même fichier sans fin.
|
|
- name: Lire le résolveur en place
|
|
ansible.builtin.slurp:
|
|
src: /etc/resolv.conf
|
|
register: serveur_debian_resolv_actuel
|
|
failed_when: false
|
|
changed_when: false
|
|
|
|
- name: Poser le résolveur d'amorçage (avant tout apt)
|
|
ansible.builtin.copy:
|
|
dest: /etc/resolv.conf
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
content: |
|
|
# Géré par Set-OPS — résolveur d'amorçage (intrant `dns_amorcage`).
|
|
# Remplacé par `client_resolveur` lorsqu'il bascule vers le résolveur local.
|
|
{% for serveur in dns_amorcage.split(',') if serveur | trim %}
|
|
nameserver {{ serveur | trim }}
|
|
{% endfor %}
|
|
# L'AMORÇAGE NE DOIT PAS DÉFAIRE CE QUI EST DÉJÀ EN PLACE (2026-08-25).
|
|
#
|
|
# La garde ne protégeait que l'hôte du résolveur lui-même (`127.0.0.1`). Partout
|
|
# ailleurs, le socle réécrivait `/etc/resolv.conf` avec `dns_amorcage` — donc
|
|
# **défaisait la bascule** de `client_resolveur` à chaque passage.
|
|
#
|
|
# Ça ne s'était jamais vu chez un tenant : `dns_amorcage` y vaut l'adresse du
|
|
# résolveur du tenant, si bien que réécrire remettait la même valeur. La
|
|
# coïncidence masquait le défaut.
|
|
#
|
|
# Sur le site, les deux ont divergé quelques heures — l'amorçage pointait encore sur
|
|
# la frontière alors que `client_resolveur` avait basculé les machines sur
|
|
# `site-dns-01`. Chaque déploiement du socle les ramenait en arrière, en silence, et
|
|
# ça ne s'est vu qu'en retirant la règle de pare-feu vers la frontière : les cinq
|
|
# machines ont alors perdu la résolution d'un coup.
|
|
#
|
|
# On ne pose donc l'amorçage que si rien de sensé n'est déjà là : ni la loopback, ni
|
|
# un résolveur déclaré de cet écosystème.
|
|
vars:
|
|
serveur_debian_resolv_texte: >-
|
|
{{ serveur_debian_resolv_actuel.content | default('') | b64decode | string }}
|
|
serveur_debian_resolveurs_declares: >-
|
|
{{ (groups['serveur_resolveur'] | default([]))
|
|
| map('extract', hostvars, 'ansible_host') | select | list }}
|
|
when:
|
|
- dns_amorcage is defined
|
|
- dns_amorcage | string | length > 0
|
|
- "'127.0.0.1' not in serveur_debian_resolv_texte"
|
|
- serveur_debian_resolveurs_declares
|
|
| select('in', serveur_debian_resolv_texte) | list | length == 0
|
|
|
|
roles:
|
|
- common_packages
|
|
- hosts_statiques
|
|
- qemu_guest_agent
|
|
- cloud_init
|
|
- sudo_ansible
|
|
- chrony
|
|
- ssh_baseline
|
|
- systemd_ssh_auto
|
|
- motd
|