diff --git a/CHANGELOG.md b/CHANGELOG.md index 46e0be4..587f6eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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`, diff --git a/docs/dependances-groupes.yml b/docs/dependances-groupes.yml index efd8101..32d35d1 100644 --- a/docs/dependances-groupes.yml +++ b/docs/dependances-groupes.yml @@ -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: diff --git a/docs/dns-interne.md b/docs/dns-interne.md index 9b5bc20..845bd36 100644 --- a/docs/dns-interne.md +++ b/docs/dns-interne.md @@ -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 diff --git a/playbooks/groupes/serveur_debian.yml b/playbooks/groupes/serveur_debian.yml index e3f51c7..dba9bc3 100644 --- a/playbooks/groupes/serveur_debian.yml +++ b/playbooks/groupes/serveur_debian.yml @@ -13,6 +13,7 @@ roles: - common_packages + - hosts_statiques - qemu_guest_agent - cloud_init - sudo_ansible diff --git a/roles/client_dns/tasks/main.yml b/roles/client_dns/tasks/main.yml index 917f208..dbf9547 100644 --- a/roles/client_dns/tasks/main.yml +++ b/roles/client_dns/tasks/main.yml @@ -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 diff --git a/roles/hosts_statiques/defaults/main.yml b/roles/hosts_statiques/defaults/main.yml new file mode 100644 index 0000000..f63ee06 --- /dev/null +++ b/roles/hosts_statiques/defaults/main.yml @@ -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('') }}" diff --git a/roles/hosts_statiques/tasks/main.yml b/roles/hosts_statiques/tasks/main.yml new file mode 100644 index 0000000..0c02055 --- /dev/null +++ b/roles/hosts_statiques/tasks/main.yml @@ -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 diff --git a/roles/hosts_statiques/templates/hosts.j2 b/roles/hosts_statiques/templates/hosts.j2 new file mode 100644 index 0000000..169cc48 --- /dev/null +++ b/roles/hosts_statiques/templates/hosts.j2 @@ -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 %}