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
|
## 2026-06-30
|
||||||
|
|
||||||
### Ajouté
|
### 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 :
|
- **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`
|
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`,
|
(`{index}{catégorie}{service}{séq}`). Convention : `supernet = 10.(10+index).0.0/16`,
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
---
|
---
|
||||||
groupes:
|
groupes:
|
||||||
client_dns:
|
client_dns:
|
||||||
requiert_groupes_actifs:
|
requiert_groupes_actifs: []
|
||||||
- serveur_powerdns
|
raison: "Dependance molle : la resolution interne repose d'abord sur le plancher
|
||||||
raison: "Les resolvers clients ne doivent pas pointer vers un service DNS absent."
|
/etc/hosts (role hosts_statiques du socle). client_dns ne configure un resolver
|
||||||
surveillance: "Verifier resolution interne et disponibilite du service DNS."
|
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:
|
client_pki:
|
||||||
requiert_groupes_actifs:
|
requiert_groupes_actifs:
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,13 @@
|
||||||
|
|
||||||
Le service DNS interne est la premiere capacite de plateforme.
|
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
|
## Groupes
|
||||||
|
|
||||||
```text
|
```text
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
roles:
|
roles:
|
||||||
- common_packages
|
- common_packages
|
||||||
|
- hosts_statiques
|
||||||
- qemu_guest_agent
|
- qemu_guest_agent
|
||||||
- cloud_init
|
- cloud_init
|
||||||
- sudo_ansible
|
- sudo_ansible
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,12 @@
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
- name: Vérifier qu'au moins un serveur DNS interne est connu
|
- name: Sans DNS interne, s'appuyer sur le plancher /etc/hosts (résolution garantie)
|
||||||
ansible.builtin.assert:
|
ansible.builtin.debug:
|
||||||
that:
|
msg: >-
|
||||||
- client_dns_effective_nameservers | length > 0
|
Aucun serveur DNS interne déclaré : la résolution interne repose sur le
|
||||||
fail_msg: "Aucun serveur DNS interne disponible pour client_dns."
|
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
|
- name: Installer les outils de diagnostic DNS
|
||||||
ansible.builtin.apt:
|
ansible.builtin.apt:
|
||||||
|
|
@ -26,19 +27,24 @@
|
||||||
update_cache: true
|
update_cache: true
|
||||||
cache_valid_time: 3600
|
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
|
- name: Valider la zone DNS interne sur le serveur primaire
|
||||||
ansible.builtin.command:
|
ansible.builtin.command:
|
||||||
cmd: "dig @{{ client_dns_effective_nameservers[0] }} {{ client_dns_zone }} SOA +short"
|
cmd: "dig @{{ client_dns_effective_nameservers[0] }} {{ client_dns_zone }} SOA +short"
|
||||||
register: client_dns_soa_check
|
register: client_dns_soa_check
|
||||||
changed_when: false
|
changed_when: false
|
||||||
failed_when: client_dns_soa_check.stdout | trim == ""
|
failed_when: client_dns_soa_check.stdout | trim == ""
|
||||||
|
when: client_dns_effective_nameservers | length > 0
|
||||||
|
|
||||||
- name: Refuser la modification DNS sans confirmation explicite
|
- name: Refuser la modification DNS sans confirmation explicite
|
||||||
ansible.builtin.assert:
|
ansible.builtin.assert:
|
||||||
that:
|
that:
|
||||||
- client_dns_confirm | bool
|
- client_dns_confirm | bool
|
||||||
fail_msg: "Modification DNS refusee: definir client_dns_confirm=true pour modifier le resolver."
|
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
|
- name: Configurer le resolver client
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|
@ -51,6 +57,7 @@
|
||||||
when:
|
when:
|
||||||
- client_dns_apply | bool
|
- client_dns_apply | bool
|
||||||
- client_dns_confirm | bool
|
- client_dns_confirm | bool
|
||||||
|
- client_dns_effective_nameservers | length > 0
|
||||||
|
|
||||||
- name: Valider la résolution du nom local dans la zone interne
|
- name: Valider la résolution du nom local dans la zone interne
|
||||||
ansible.builtin.command:
|
ansible.builtin.command:
|
||||||
|
|
@ -58,4 +65,6 @@
|
||||||
register: client_dns_host_check
|
register: client_dns_host_check
|
||||||
changed_when: false
|
changed_when: false
|
||||||
failed_when: client_dns_host_check.stdout | trim == ""
|
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