Decouplage moteur/instance Phase 1 : delier les roles du domaine

Variable d'identite d'instance domaine_interne (group_vars/all.yml). Les
13 roles qui codaient chezlepro.internal en dur utilisent {{ domaine_interne }} ;
base_dn LDAP et domaine court derives (dc=acme,dc=local pour un autre loup).

Comportement identique pour Chezlepro (domaine_interne: chezlepro.internal),
mais le moteur devient generique -- premiere brique pour partager l'outil
a la meute. Ajout exemples/instance.exemple.yml.

Non destructif : diff de generation vide, ansible-lint 0 echec, base_dn
derive == ancien code en dur (verifie).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-24 08:12:48 -04:00
parent c61db907c9
commit 2abe3c86c8
17 changed files with 46 additions and 21 deletions

View file

@ -2,6 +2,9 @@
## 2026-06-23
### Modifié
- **Découpage moteur/instance — Phase 1 : délier les rôles du domaine Chezlepro.** Introduction d'une variable d'identité d'instance **`domaine_interne`** (dans `inventories/*/group_vars/all.yml`). Les 13 rôles qui codaient `chezlepro.internal` en dur (zones DNS, FQDN, relais SMTP, AC, etc.) utilisent désormais `{{ domaine_interne }}` ; le `base_dn` LDAP et le domaine court sont **dérivés** (`dc={{ domaine_interne.split('.') | join(',dc=') }}` → `dc=chezlepro,dc=internal`, ou `dc=acme,dc=local` pour un autre loup). Comportement **identique** pour Chezlepro (qui pose `domaine_interne: chezlepro.internal`), mais le moteur devient générique — première brique pour partager l'outil à la meute (`docs/positionnement.md`). Ajout d'`exemples/instance.exemple.yml`. Non destructif : diff de génération vide, `ansible-lint` 0 échec. *(La marque `chezlepro` sur les noms de fichiers gérés — `99-chezlepro.conf`, `chezlepro_filter` — sera neutralisée en Phase 1b ; sortie du plan en Phase 2 ; deux dépôts en Phase 3.)*
### Ajouté
- **`docs/positionnement.md` — décision de positionnement vs l'existant.** Acte que le cœur de Set-OPS (plan déclaratif → génération d'inventaire) recoupe **NetBox/Nautobot** (+ `nb_inventory`), le GUI d'exécution recoupe **AWX/Semaphore**, le « la définition instancie la flotte » recoupe **NixOS+Colmena / Terraform**, et le modèle application-pivot recoupe **Backstage**. Décision en vigueur : on **garde** le plan de contrôle maison (souverain, bien dimensionné pour ~13 VM) mais on **gèle son périmètre** ; seuils explicites d'adoption de l'outil mûr (RBAC/audit → AWX ; IPAM/source de vérité partagée → NetBox). Règle ancrée dans `AGENTS.md`.
- **Documentation — passe complète (le dépôt « dit ce qu'il fait »).** Nouveau guide central **`docs/plan-et-generation.md`** : le modèle (entités + liens), les registres et leurs schémas, la référence des commandes `make`/CLI et des vues GUI, le flux « éditer le plan → `instancier` → appliquer », les garde-fous. `AGENTS.md` gagne la section « Le plan et la génération de l'inventaire » (règle d'or : `hosts.yml` est généré, ne pas l'éditer). `README.md` : section « Le plan : on édite, l'inventaire se génère » + remplacement du flux legacy `hote-planifier`/`ajouter` par le flux par le plan. Rafraîchissement de `docs/architecture-set-ops.md` (entités du plan), `docs/nomenclature-vm.md` et `docs/catalogue-services.md` ; correction de la terminologie **domaine → fonction** dans la prose (collision avec le DNS levée jusque dans la doc).

View file

@ -0,0 +1,16 @@
---
# Identite d'une INSTANCE Set-OPS (un loup / un client).
#
# Ces variables distinguent une instance d'une autre. Le MOTEUR (roles, scripts,
# generateur) est generique ; c'est ici qu'on dit "qui on est". A placer dans
# inventories/<env>/group_vars/all.yml de l'instance.
#
# Voir docs/plan-et-generation.md et docs/positionnement.md.
# Domaine DNS interne de l'instance. Les roles en derivent zones, FQDN, base DN
# LDAP, expediteurs courriel, etc. (ex. dc=acme,dc=local pour acme.local).
domaine_interne: "acme.internal"
# Le reste de l'identite vit dans le PLAN de l'instance :
# - docs/nomenclature.yml : supernet (ex. 10.1.0.0/16) + liste de fonctions
# - docs/serveurs.yml / applications.yml / domaines.yml : le plan rempli

View file

@ -1,2 +1,5 @@
---
chezlepro_timezone: "America/Toronto"
# Identite de l'instance : domaine DNS interne (un autre loup met le sien).
domaine_interne: "chezlepro.internal"

View file

@ -1,3 +1,6 @@
---
# Variables globales de production.
# Les politiques Debian communes sont dans group_vars/serveur_debian.yml.
# Identite de l'instance : domaine DNS interne (un autre loup met le sien).
domaine_interne: "chezlepro.internal"

View file

@ -1,7 +1,7 @@
---
client_dns_apply: false
client_dns_confirm: false
client_dns_zone: "chezlepro.internal"
client_dns_zone: "{{ domaine_interne }}"
client_dns_search_domains:
- "{{ client_dns_zone }}"
client_dns_nameservers: []

View file

@ -8,9 +8,9 @@ client_ldap_paquets:
client_ldap_service: "sssd"
client_ldap_domaine: "chezlepro"
client_ldap_uri: "ldap://idm-01.chezlepro.internal"
client_ldap_base_dn: "dc=chezlepro,dc=internal"
client_ldap_domaine: "{{ domaine_interne.split('.') | first }}"
client_ldap_uri: "ldap://idm-01.{{ domaine_interne }}"
client_ldap_base_dn: "dc={{ domaine_interne.split('.') | join(',dc=') }}"
# Bind de lecture. Vide => bind anonyme (lecture publique de l'annuaire).
client_ldap_bind_dn: ""

View file

@ -5,8 +5,8 @@ client_pki_paquets:
client_pki_steppath: "/etc/step"
# AC interne (serveur_step_ca / infra-pki-01).
client_pki_ca_url: "https://infra-pki-01.chezlepro.internal:8443"
client_pki_provisioner: "admin@chezlepro.internal"
client_pki_ca_url: "https://infra-pki-01.{{ domaine_interne }}:8443"
client_pki_provisioner: "admin@{{ domaine_interne }}"
# Identite de l'hote.
client_pki_nom_cert: "{{ ansible_fqdn | default(ansible_hostname) }}"

View file

@ -4,9 +4,9 @@ client_smtp_paquets:
- msmtp
- msmtp-mta # fournit /usr/sbin/sendmail
client_smtp_relais: "infra-mail-01.chezlepro.internal"
client_smtp_relais: "infra-mail-01.{{ domaine_interne }}"
client_smtp_port: 25
client_smtp_from: "{{ ansible_hostname }}@chezlepro.internal"
client_smtp_from: "{{ ansible_hostname }}@{{ domaine_interne }}"
# TLS : off sur le reseau interne pour l'instant ; on avec certificats step_ca.
client_smtp_tls: false

View file

@ -12,7 +12,7 @@ serveur_forgejo_config: "/etc/forgejo/app.ini"
serveur_forgejo_service: "forgejo"
# Publication (derriere serveur_nginx, TLS a l'edge).
serveur_forgejo_hostname: "forge.chezlepro.internal"
serveur_forgejo_hostname: "forge.{{ domaine_interne }}"
serveur_forgejo_http_port: 3000
# Base de donnees : resolue depuis le registre par le groupe consommateur.
@ -20,11 +20,11 @@ serveur_forgejo_groupe: "serveur_forgejo"
serveur_forgejo_db_host: "10.1.13.11" # data-01
# Relais courriel.
serveur_forgejo_smtp: "infra-mail-01.chezlepro.internal"
serveur_forgejo_smtp: "infra-mail-01.{{ domaine_interne }}"
# Secrets OBLIGATOIRES (Ansible Vault).
serveur_forgejo_secret_key: "" # {{ vault_forgejo_secret_key }}
serveur_forgejo_internal_token: "" # {{ vault_forgejo_internal_token }}
serveur_forgejo_admin_user: "forgejo-admin"
serveur_forgejo_admin_email: "admin@chezlepro.internal"
serveur_forgejo_admin_email: "admin@{{ domaine_interne }}"
serveur_forgejo_admin_password: "" # {{ vault_forgejo_admin }}

View file

@ -31,4 +31,4 @@ ENABLED = true
PROTOCOL = smtp
SMTP_ADDR = {{ serveur_forgejo_smtp }}
SMTP_PORT = 25
FROM = forge@chezlepro.internal
FROM = forge@{{ domaine_interne }}

View file

@ -6,7 +6,7 @@ serveur_grafana_service: "grafana-server"
serveur_grafana_port: 3000
# Publication (derriere serveur_nginx, TLS termine a l'edge).
serveur_grafana_hostname: "grafana.chezlepro.internal"
serveur_grafana_hostname: "grafana.{{ domaine_interne }}"
serveur_grafana_root_url: "https://{{ serveur_grafana_hostname }}/"
# Datasources (Prometheus + Loki, co-localises sur obs-01).

View file

@ -9,7 +9,7 @@ serveur_keycloak_utilisateur: "keycloak"
serveur_keycloak_service: "keycloak"
# Publication (derriere serveur_nginx, TLS termine a l'edge).
serveur_keycloak_hostname: "keycloak.chezlepro.internal"
serveur_keycloak_hostname: "keycloak.{{ domaine_interne }}"
# Base de donnees : resolue depuis le registre par le groupe consommateur.
serveur_keycloak_groupe: "serveur_keycloak"

View file

@ -23,7 +23,7 @@ serveur_nginx_desactiver_defaut: false # retirer le site Debian par defaut
# S'AJOUTENT aux vhosts derives automatiquement de docs/domaines.yml.
serveur_nginx_sites: []
# - nom: forge
# domaine: forge.chezlepro.internal
# domaine: forge.{{ domaine_interne }}
# amont: "http://10.1.15.11:3000"
# certificat: "/etc/ssl/.../forge.pem" # optionnel, sinon snakeoil
# cle: "/etc/ssl/.../forge.key"

View file

@ -7,9 +7,9 @@ serveur_openldap_paquets:
serveur_openldap_service: "slapd"
# Identite de l'annuaire.
serveur_openldap_domaine: "chezlepro.internal"
serveur_openldap_domaine: "{{ domaine_interne }}"
serveur_openldap_organisation: "Chezlepro Inc"
# Base DN derivee du domaine : chezlepro.internal -> dc=chezlepro,dc=internal
# Base DN derivee du domaine : {{ domaine_interne }} -> dc=chezlepro,dc=internal
serveur_openldap_base_dn: "dc={{ serveur_openldap_domaine.split('.') | join(',dc=') }}"
serveur_openldap_admin_dn: "cn=admin,{{ serveur_openldap_base_dn }}"

View file

@ -8,9 +8,9 @@ serveur_powerdns_packages:
serveur_powerdns_service_name: "pdns"
serveur_powerdns_zone_directory: "/etc/powerdns/zones"
serveur_powerdns_bind_config: "/etc/powerdns/bindbackend.conf"
serveur_powerdns_zone: "chezlepro.internal"
serveur_powerdns_zone: "{{ domaine_interne }}"
serveur_powerdns_nameserver: "ns1"
serveur_powerdns_contact: "hostmaster.chezlepro.internal"
serveur_powerdns_contact: "hostmaster.{{ domaine_interne }}"
serveur_powerdns_ttl: 3600
serveur_powerdns_serial: 2026062201
serveur_powerdns_soa_refresh: 3600

View file

@ -7,7 +7,7 @@ serveur_sendmail_packages:
serveur_sendmail_service_name: "postfix"
# Identite.
serveur_sendmail_domaine: "chezlepro.internal"
serveur_sendmail_domaine: "{{ domaine_interne }}"
serveur_sendmail_origine: "$mydomain"
serveur_sendmail_nom_hote: "{{ ansible_fqdn | default(ansible_hostname) }}"

View file

@ -19,7 +19,7 @@ serveur_step_ca_service: "step-ca"
serveur_step_ca_nom: "Chezlepro Internal CA"
serveur_step_ca_dns: "{{ ansible_fqdn | default(ansible_hostname) }},{{ ansible_host | default('127.0.0.1') }}"
serveur_step_ca_adresse: ":8443"
serveur_step_ca_provisioner: "admin@chezlepro.internal"
serveur_step_ca_provisioner: "admin@{{ domaine_interne }}"
serveur_step_ca_acme: true
# Secrets (Ansible Vault) — obligatoires pour l'initialisation.