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:
parent
6df94fd713
commit
a9a1493440
8 changed files with 61 additions and 11 deletions
|
|
@ -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`,
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
roles:
|
||||
- common_packages
|
||||
- hosts_statiques
|
||||
- qemu_guest_agent
|
||||
- cloud_init
|
||||
- sudo_ansible
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
5
roles/hosts_statiques/defaults/main.yml
Normal file
5
roles/hosts_statiques/defaults/main.yml
Normal 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('') }}"
|
||||
9
roles/hosts_statiques/tasks/main.yml
Normal file
9
roles/hosts_statiques/tasks/main.yml
Normal 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
|
||||
12
roles/hosts_statiques/templates/hosts.j2
Normal file
12
roles/hosts_statiques/templates/hosts.j2
Normal 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 %}
|
||||
Loading…
Reference in a new issue