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:
parent
c61db907c9
commit
2abe3c86c8
17 changed files with 46 additions and 21 deletions
|
|
@ -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).
|
||||
|
|
|
|||
16
exemples/instance.exemple.yml
Normal file
16
exemples/instance.exemple.yml
Normal 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
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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: []
|
||||
|
|
|
|||
|
|
@ -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: ""
|
||||
|
|
|
|||
|
|
@ -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) }}"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
|
|||
|
|
@ -31,4 +31,4 @@ ENABLED = true
|
|||
PROTOCOL = smtp
|
||||
SMTP_ADDR = {{ serveur_forgejo_smtp }}
|
||||
SMTP_PORT = 25
|
||||
FROM = forge@chezlepro.internal
|
||||
FROM = forge@{{ domaine_interne }}
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 }}"
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) }}"
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Reference in a new issue