Plancher de résolution /etc/hosts (indépendant du DNS)

Nouveau rôle de socle hosts_statiques (dans serveur_debian) : génère
/etc/hosts sur chaque VM depuis l'inventaire. L'écosystème se résout par
nom même DNS éteint, et le bootstrap ne dépend plus du DNS. client_dns
rendu tolérant (inerte sans DNS interne) ; dépendance client_dns→powerdns
passée molle. PowerDNS devient une commodité (zone/externe).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-30 18:05:42 -04:00
parent 6df94fd713
commit a9a1493440
8 changed files with 61 additions and 11 deletions

View file

@ -3,6 +3,12 @@
## 2026-06-30
### Ajouté
- **Plancher de résolution `/etc/hosts` (indépendant du DNS).** Nouveau rôle de socle
`hosts_statiques` (dans `serveur_debian`) : génère `/etc/hosts` sur **chaque** VM
depuis l'inventaire (nom + FQDN interne → IP réelle). Tout l'écosystème se résout
par nom **même serveur DNS éteint**, et le bootstrap ne dépend plus du DNS. PowerDNS
devient une **commodité** (zone/externe/dynamique) ; `client_dns` est rendu tolérant
(inerte si aucun DNS interne) et sa dépendance à `serveur_powerdns` passe **molle**.
- **Adressage fédéré : index d'instance.** Le VMID n'est plus codé `9CSNN` en dur :
il prend le préfixe d'un `index` déclaré en tête de `plan/nomenclature.yml`
(`{index}{catégorie}{service}{séq}`). Convention : `supernet = 10.(10+index).0.0/16`,

View file

@ -1,10 +1,11 @@
---
groupes:
client_dns:
requiert_groupes_actifs:
- serveur_powerdns
raison: "Les resolvers clients ne doivent pas pointer vers un service DNS absent."
surveillance: "Verifier resolution interne et disponibilite du service DNS."
requiert_groupes_actifs: []
raison: "Dependance molle : la resolution interne repose d'abord sur le plancher
/etc/hosts (role hosts_statiques du socle). client_dns ne configure un resolver
que si un DNS interne existe ; sinon il est inerte. Aucun prerequis bloquant."
surveillance: "Verifier /etc/hosts a jour ; DNS interne optionnel (externe/dynamique)."
client_pki:
requiert_groupes_actifs:

View file

@ -2,6 +2,13 @@
Le service DNS interne est la premiere capacite de plateforme.
> **Plancher de resolution independant du DNS.** Le socle (`hosts_statiques`, dans
> `serveur_debian`) genere `/etc/hosts` sur **chaque** VM depuis l'inventaire : tout
> l'ecosysteme se resout par nom **meme serveur DNS eteint** (et au bootstrap, avant
> que PowerDNS ne soit la). PowerDNS devient une **commodite** (zone, externe,
> dynamique), plus un point de defaillance : la dependance `client_dns -> powerdns`
> est **molle** (client_dns est inerte si aucun DNS interne n'existe).
## Groupes
```text

View file

@ -13,6 +13,7 @@
roles:
- common_packages
- hosts_statiques
- qemu_guest_agent
- cloud_init
- sudo_ansible

View file

@ -13,11 +13,12 @@
)
}}
- name: Vérifier qu'au moins un serveur DNS interne est connu
ansible.builtin.assert:
that:
- client_dns_effective_nameservers | length > 0
fail_msg: "Aucun serveur DNS interne disponible pour client_dns."
- name: Sans DNS interne, s'appuyer sur le plancher /etc/hosts (résolution garantie)
ansible.builtin.debug:
msg: >-
Aucun serveur DNS interne déclaré : la résolution interne repose sur le
plancher /etc/hosts (rôle hosts_statiques). Configuration du resolver ignorée.
when: client_dns_effective_nameservers | length == 0
- name: Installer les outils de diagnostic DNS
ansible.builtin.apt:
@ -26,19 +27,24 @@
update_cache: true
cache_valid_time: 3600
# Les tâches ci-dessous ne s'exécutent que si un DNS interne existe.
# Sinon /etc/hosts (socle) assure déjà la résolution interne : dépendance molle.
- name: Valider la zone DNS interne sur le serveur primaire
ansible.builtin.command:
cmd: "dig @{{ client_dns_effective_nameservers[0] }} {{ client_dns_zone }} SOA +short"
register: client_dns_soa_check
changed_when: false
failed_when: client_dns_soa_check.stdout | trim == ""
when: client_dns_effective_nameservers | length > 0
- name: Refuser la modification DNS sans confirmation explicite
ansible.builtin.assert:
that:
- client_dns_confirm | bool
fail_msg: "Modification DNS refusee: definir client_dns_confirm=true pour modifier le resolver."
when: client_dns_apply | bool
when:
- client_dns_apply | bool
- client_dns_effective_nameservers | length > 0
- name: Configurer le resolver client
ansible.builtin.template:
@ -51,6 +57,7 @@
when:
- client_dns_apply | bool
- client_dns_confirm | bool
- client_dns_effective_nameservers | length > 0
- name: Valider la résolution du nom local dans la zone interne
ansible.builtin.command:
@ -58,4 +65,6 @@
register: client_dns_host_check
changed_when: false
failed_when: client_dns_host_check.stdout | trim == ""
when: ansible_host is defined
when:
- ansible_host is defined
- client_dns_effective_nameservers | length > 0

View file

@ -0,0 +1,5 @@
---
# Plancher de résolution : /etc/hosts généré depuis l'inventaire, indépendant du
# serveur DNS. Permet à tout l'écosystème de se résoudre par nom même DNS éteint.
hosts_statiques_actif: true
hosts_statiques_domaine: "{{ domaine_interne | default('') }}"

View file

@ -0,0 +1,9 @@
---
- name: Générer /etc/hosts depuis l'inventaire (plancher de résolution, indépendant du DNS)
ansible.builtin.template:
src: hosts.j2
dest: /etc/hosts
owner: root
group: root
mode: "0644"
when: hosts_statiques_actif | bool

View file

@ -0,0 +1,12 @@
# /etc/hosts — GÉNÉRÉ par Set-OPS (rôle hosts_statiques) depuis l'inventaire.
# Plancher de résolution interne, indépendant du serveur DNS. NE PAS éditer à la main.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# --- Écosystème (dérivé du plan ; chaque hôte → son IP réelle) ---
{% set fleet = (groups.get('hotes_actifs', []) + groups.get('hotes_planifies', [])) | unique | sort %}
{% for h in fleet if hostvars[h].ansible_host is defined %}
{{ "%-15s" | format(hostvars[h].ansible_host) }} {{ h }}{{ (' ' ~ h ~ '.' ~ hosts_statiques_domaine) if hosts_statiques_domaine else '' }}
{% endfor %}