From 17f65efb18a4c221585b562417b8affe7754d661 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Wed, 24 Jun 2026 09:10:49 -0400 Subject: [PATCH] Decouplage moteur/instance Phase 2a : sortir le plan Les 5 registres (serveurs/applications/bases-donnees/domaines/nomenclature) quittent docs/ pour instance/plan/. Localisation : - scripts : variable d'env SETOPS_INSTANCE (defaut /instance) ; - roles/playbooks : variable setops_plan_dir (group_vars d'instance). docs/ ne garde que les guides .md + dependances-groupes.yml (moteur). .ansible-lint exclut instance/plan/ (registres de donnees). Non destructif : diff vide, ansible-lint 0 echec, include_vars via setops_plan_dir teste. (Phase 2b : l'inventaire.) Co-Authored-By: Claude Opus 4.8 --- .ansible-lint | 1 + CHANGELOG.md | 1 + {docs => instance/plan}/applications.yml | 0 {docs => instance/plan}/bases-donnees.yml | 0 {docs => instance/plan}/domaines.yml | 0 {docs => instance/plan}/nomenclature.yml | 0 {docs => instance/plan}/serveurs.yml | 0 inventories/lab/group_vars/all.yml | 3 +++ inventories/production/group_vars/all.yml | 3 +++ playbooks/groupes/serveur_web_dorsal.yml | 4 ++-- playbooks/groupes/serveur_web_frontal.yml | 4 ++-- roles/serveur_forgejo/tasks/main.yml | 2 +- roles/serveur_icinga/tasks/main.yml | 2 +- roles/serveur_keycloak/tasks/main.yml | 2 +- roles/serveur_nginx/tasks/main.yml | 4 ++-- roles/serveur_postgresql/tasks/main.yml | 2 +- scripts/applications.py | 9 ++++++--- scripts/bases_donnees.py | 7 +++++-- scripts/domaines.py | 7 +++++-- scripts/instancier.py | 9 ++++++--- scripts/inventory_gui.py | 11 ++++++----- scripts/serveurs.py | 7 +++++-- 22 files changed, 51 insertions(+), 27 deletions(-) rename {docs => instance/plan}/applications.yml (100%) rename {docs => instance/plan}/bases-donnees.yml (100%) rename {docs => instance/plan}/domaines.yml (100%) rename {docs => instance/plan}/nomenclature.yml (100%) rename {docs => instance/plan}/serveurs.yml (100%) diff --git a/.ansible-lint b/.ansible-lint index a7895d6..661f7b2 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -3,3 +3,4 @@ # genere par safe_dump. Les regles yaml d'ansible-lint ne s'y appliquent pas. exclude_paths: - docs/ + - instance/plan/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 546a5fc..b5edd3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2026-06-23 ### Modifié +- **Découpage moteur/instance — Phase 2a : sortir le plan dans `instance/plan/`.** Les 5 registres (`serveurs`, `applications`, `bases-donnees`, `domaines`, `nomenclature`) quittent `docs/` pour `instance/plan/`. Les scripts les localisent via **`SETOPS_INSTANCE`** (variable d'env, défaut `/instance`) ; les rôles/playbooks via **`setops_plan_dir`** (group_vars d'instance). `docs/` ne garde que les guides `.md` + `dependances-groupes.yml` (moteur). `.ansible-lint` exclut `instance/plan/` (registres de données). Non destructif : diff vide, `ansible-lint` 0 échec, `include_vars` via `setops_plan_dir` testé. *(Phase 2b : sortir l'inventaire ; Phase 3 : deux dépôts.)* - **Découpage moteur/instance — Phase 1b : neutraliser la marque `chezlepro`.** Les noms de fichiers gérés par les rôles (`99-chezlepro.conf`, `chezlepro_filter`, `chezlepro-bind.conf`, `/etc/redis/chezlepro.conf`, etc.) et les 14 templates correspondants passent à la marque neutre du moteur **`setops`** (`git mv` + références `src`/`dest`). Un loup ne déploie plus de fichiers marqués « chezlepro ». Cohérence `src ↔ template` vérifiée, `ansible-lint` 0 échec, diff vide. (Les README gardent leurs exemples ; génériciser plus tard.) - **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.)* diff --git a/docs/applications.yml b/instance/plan/applications.yml similarity index 100% rename from docs/applications.yml rename to instance/plan/applications.yml diff --git a/docs/bases-donnees.yml b/instance/plan/bases-donnees.yml similarity index 100% rename from docs/bases-donnees.yml rename to instance/plan/bases-donnees.yml diff --git a/docs/domaines.yml b/instance/plan/domaines.yml similarity index 100% rename from docs/domaines.yml rename to instance/plan/domaines.yml diff --git a/docs/nomenclature.yml b/instance/plan/nomenclature.yml similarity index 100% rename from docs/nomenclature.yml rename to instance/plan/nomenclature.yml diff --git a/docs/serveurs.yml b/instance/plan/serveurs.yml similarity index 100% rename from docs/serveurs.yml rename to instance/plan/serveurs.yml diff --git a/inventories/lab/group_vars/all.yml b/inventories/lab/group_vars/all.yml index df5d1f0..f7266f9 100644 --- a/inventories/lab/group_vars/all.yml +++ b/inventories/lab/group_vars/all.yml @@ -3,3 +3,6 @@ chezlepro_timezone: "America/Toronto" # Identite de l'instance : domaine DNS interne (un autre loup met le sien). domaine_interne: "chezlepro.internal" + +# Chemin du plan de l'instance (registres). Phase 3 : ajuster si moteur externe. +setops_plan_dir: "{{ playbook_dir }}/../../instance/plan" diff --git a/inventories/production/group_vars/all.yml b/inventories/production/group_vars/all.yml index 6502b86..b8319ed 100644 --- a/inventories/production/group_vars/all.yml +++ b/inventories/production/group_vars/all.yml @@ -4,3 +4,6 @@ # Identite de l'instance : domaine DNS interne (un autre loup met le sien). domaine_interne: "chezlepro.internal" + +# Chemin du plan de l'instance (registres). Phase 3 : ajuster si moteur externe. +setops_plan_dir: "{{ playbook_dir }}/../../instance/plan" diff --git a/playbooks/groupes/serveur_web_dorsal.yml b/playbooks/groupes/serveur_web_dorsal.yml index e35d4b0..7a72a61 100644 --- a/playbooks/groupes/serveur_web_dorsal.yml +++ b/playbooks/groupes/serveur_web_dorsal.yml @@ -19,8 +19,8 @@ ansible.builtin.include_vars: file: "{{ item }}" loop: - - "{{ playbook_dir }}/../../docs/applications.yml" - - "{{ playbook_dir }}/../../docs/bases-donnees.yml" + - "{{ setops_plan_dir }}/applications.yml" + - "{{ setops_plan_dir }}/bases-donnees.yml" - name: Determiner les applications instanciees sur cet hote ansible.builtin.set_fact: diff --git a/playbooks/groupes/serveur_web_frontal.yml b/playbooks/groupes/serveur_web_frontal.yml index 64c6fa3..7f70782 100644 --- a/playbooks/groupes/serveur_web_frontal.yml +++ b/playbooks/groupes/serveur_web_frontal.yml @@ -19,8 +19,8 @@ ansible.builtin.include_vars: file: "{{ item }}" loop: - - "{{ playbook_dir }}/../../docs/applications.yml" - - "{{ playbook_dir }}/../../docs/bases-donnees.yml" + - "{{ setops_plan_dir }}/applications.yml" + - "{{ setops_plan_dir }}/bases-donnees.yml" - name: Determiner les applications instanciees sur cet hote ansible.builtin.set_fact: diff --git a/roles/serveur_forgejo/tasks/main.yml b/roles/serveur_forgejo/tasks/main.yml index 6a45a24..2275b11 100644 --- a/roles/serveur_forgejo/tasks/main.yml +++ b/roles/serveur_forgejo/tasks/main.yml @@ -9,7 +9,7 @@ - name: Charger le registre des bases applicatives ansible.builtin.include_vars: - file: "{{ role_path }}/../../docs/bases-donnees.yml" + file: "{{ setops_plan_dir }}/bases-donnees.yml" - name: Resoudre l'entree de base Forgejo (par consommateur) ansible.builtin.set_fact: diff --git a/roles/serveur_icinga/tasks/main.yml b/roles/serveur_icinga/tasks/main.yml index 0eb5847..a4286fe 100644 --- a/roles/serveur_icinga/tasks/main.yml +++ b/roles/serveur_icinga/tasks/main.yml @@ -24,7 +24,7 @@ - name: Charger le registre des bases applicatives ansible.builtin.include_vars: - file: "{{ role_path }}/../../docs/bases-donnees.yml" + file: "{{ setops_plan_dir }}/bases-donnees.yml" - name: Resoudre l'entree de base Icinga DB (par consommateur) ansible.builtin.set_fact: diff --git a/roles/serveur_keycloak/tasks/main.yml b/roles/serveur_keycloak/tasks/main.yml index 969c7c1..61c38c1 100644 --- a/roles/serveur_keycloak/tasks/main.yml +++ b/roles/serveur_keycloak/tasks/main.yml @@ -7,7 +7,7 @@ - name: Charger le registre des bases applicatives ansible.builtin.include_vars: - file: "{{ role_path }}/../../docs/bases-donnees.yml" + file: "{{ setops_plan_dir }}/bases-donnees.yml" - name: Resoudre l'entree de base de donnees Keycloak (par consommateur) ansible.builtin.set_fact: diff --git a/roles/serveur_nginx/tasks/main.yml b/roles/serveur_nginx/tasks/main.yml index d5e304f..464302a 100644 --- a/roles/serveur_nginx/tasks/main.yml +++ b/roles/serveur_nginx/tasks/main.yml @@ -49,8 +49,8 @@ ansible.builtin.include_vars: file: "{{ item }}" loop: - - "{{ role_path }}/../../docs/applications.yml" - - "{{ role_path }}/../../docs/domaines.yml" + - "{{ setops_plan_dir }}/applications.yml" + - "{{ setops_plan_dir }}/domaines.yml" when: serveur_nginx_publier_expositions | bool - name: Lister les expositions destinees a cet edge diff --git a/roles/serveur_postgresql/tasks/main.yml b/roles/serveur_postgresql/tasks/main.yml index 40301b0..504d065 100644 --- a/roles/serveur_postgresql/tasks/main.yml +++ b/roles/serveur_postgresql/tasks/main.yml @@ -95,7 +95,7 @@ - name: Charger le registre des bases applicatives ansible.builtin.include_vars: - file: "{{ role_path }}/../../docs/bases-donnees.yml" + file: "{{ setops_plan_dir }}/bases-donnees.yml" failed_when: false - name: Determiner les serveurs BD nommes heberges par ce groupe diff --git a/scripts/applications.py b/scripts/applications.py index 3f305b0..8e24c76 100644 --- a/scripts/applications.py +++ b/scripts/applications.py @@ -3,6 +3,8 @@ from __future__ import annotations +import os + import argparse import sys from pathlib import Path @@ -20,9 +22,10 @@ from inventory_rules import ( ) RACINE = Path(__file__).resolve().parents[1] -FICHIER = RACINE / "docs/applications.yml" -FICHIER_BASES = RACINE / "docs/bases-donnees.yml" -FICHIER_DOMAINES = RACINE / "docs/domaines.yml" +INSTANCE = Path(os.environ.get("SETOPS_INSTANCE") or (RACINE / "instance")) +FICHIER = INSTANCE / "plan/applications.yml" +FICHIER_BASES = INSTANCE / "plan/bases-donnees.yml" +FICHIER_DOMAINES = INSTANCE / "plan/domaines.yml" INVENTAIRE = RACINE / "inventories/production/hosts.yml" # Groupes 'serveurs_*' qui sont des capacites de SOCLE (sur toutes les VM), diff --git a/scripts/bases_donnees.py b/scripts/bases_donnees.py index 626a45e..0c554ad 100644 --- a/scripts/bases_donnees.py +++ b/scripts/bases_donnees.py @@ -3,6 +3,8 @@ from __future__ import annotations +import os + import argparse import sys from pathlib import Path @@ -17,8 +19,9 @@ from inventory_rules import ( ) RACINE = Path(__file__).resolve().parents[1] -FICHIER = RACINE / "docs/bases-donnees.yml" -FICHIER_APPLICATIONS = RACINE / "docs/applications.yml" +INSTANCE = Path(os.environ.get("SETOPS_INSTANCE") or (RACINE / "instance")) +FICHIER = INSTANCE / "plan/bases-donnees.yml" +FICHIER_APPLICATIONS = INSTANCE / "plan/applications.yml" def ecrire(registre: dict) -> None: diff --git a/scripts/domaines.py b/scripts/domaines.py index 0467b47..abaf171 100644 --- a/scripts/domaines.py +++ b/scripts/domaines.py @@ -3,6 +3,8 @@ from __future__ import annotations +import os + import argparse import sys from pathlib import Path @@ -15,8 +17,9 @@ from inventory_rules import ( ) RACINE = Path(__file__).resolve().parents[1] -FICHIER = RACINE / "docs/domaines.yml" -FICHIER_APPLICATIONS = RACINE / "docs/applications.yml" +INSTANCE = Path(os.environ.get("SETOPS_INSTANCE") or (RACINE / "instance")) +FICHIER = INSTANCE / "plan/domaines.yml" +FICHIER_APPLICATIONS = INSTANCE / "plan/applications.yml" def lister(registre: dict, applications: dict) -> None: diff --git a/scripts/instancier.py b/scripts/instancier.py index fe41be8..2e71a6d 100644 --- a/scripts/instancier.py +++ b/scripts/instancier.py @@ -16,6 +16,8 @@ Derivation : from __future__ import annotations +import os + import json import subprocess import sys @@ -32,11 +34,12 @@ from inventory_rules import ( ) RACINE = Path(__file__).resolve().parents[1] +INSTANCE = Path(os.environ.get("SETOPS_INSTANCE") or (RACINE / "instance")) INVENTAIRE = RACINE / "inventories/production/hosts.yml" GENERE = RACINE / "inventories/production/hosts.genere.yml" -FICHIER_SERVEURS = RACINE / "docs/serveurs.yml" -FICHIER_APPLICATIONS = RACINE / "docs/applications.yml" -FICHIER_NOMENCLATURE = RACINE / "docs/nomenclature.yml" +FICHIER_SERVEURS = INSTANCE / "plan/serveurs.yml" +FICHIER_APPLICATIONS = INSTANCE / "plan/applications.yml" +FICHIER_NOMENCLATURE = INSTANCE / "plan/nomenclature.yml" GROUPES_SOCLE = ["serveur_debian", "serveur_durci"] PLACEMENT = [("noeud", "proxmox_noeud"), ("stockage", "proxmox_stockage"), diff --git a/scripts/inventory_gui.py b/scripts/inventory_gui.py index 201bfab..0a63bf0 100644 --- a/scripts/inventory_gui.py +++ b/scripts/inventory_gui.py @@ -37,15 +37,16 @@ from inventory_rules import ( ) RACINE = Path(__file__).resolve().parents[1] +INSTANCE = Path(os.environ.get("SETOPS_INSTANCE") or (RACINE / "instance")) INVENTAIRE_DEFAUT = RACINE / "inventories/production/hosts.yml" INVENTAIRE_PRODUCTION = (RACINE / "inventories/production/hosts.yml").resolve() DOSSIER_PLAYBOOKS_GROUPES = RACINE / "playbooks/groupes" FICHIER_DEPENDANCES = RACINE / "docs/dependances-groupes.yml" -FICHIER_NOMENCLATURE = RACINE / "docs/nomenclature.yml" -FICHIER_BASES = RACINE / "docs/bases-donnees.yml" -FICHIER_APPLICATIONS = RACINE / "docs/applications.yml" -FICHIER_DOMAINES = RACINE / "docs/domaines.yml" -FICHIER_SERVEURS = RACINE / "docs/serveurs.yml" +FICHIER_NOMENCLATURE = INSTANCE / "plan/nomenclature.yml" +FICHIER_BASES = INSTANCE / "plan/bases-donnees.yml" +FICHIER_APPLICATIONS = INSTANCE / "plan/applications.yml" +FICHIER_DOMAINES = INSTANCE / "plan/domaines.yml" +FICHIER_SERVEURS = INSTANCE / "plan/serveurs.yml" # Garde-fous des executions (verifier / deployer) depuis l'interface. JETON = secrets.token_urlsafe(18) diff --git a/scripts/serveurs.py b/scripts/serveurs.py index 6e05774..829fb96 100644 --- a/scripts/serveurs.py +++ b/scripts/serveurs.py @@ -8,6 +8,8 @@ viendra en Phase 3 (make instancier). from __future__ import annotations +import os + import argparse import sys from pathlib import Path @@ -24,8 +26,9 @@ from inventory_rules import ( ) RACINE = Path(__file__).resolve().parents[1] -FICHIER = RACINE / "docs/serveurs.yml" -FICHIER_NOMENCLATURE = RACINE / "docs/nomenclature.yml" +INSTANCE = Path(os.environ.get("SETOPS_INSTANCE") or (RACINE / "instance")) +FICHIER = INSTANCE / "plan/serveurs.yml" +FICHIER_NOMENCLATURE = INSTANCE / "plan/nomenclature.yml" INVENTAIRE = RACINE / "inventories/production/hosts.yml" # Champs de placement / dimensionnement NON derivables (proviennent du plan).