Rafraichir les chemins dans docs secondaires, README de roles, messages,
docstrings : inventories/ -> instance/inventories/, docs/<plan>.yml ->
instance/plan/<plan>.yml. Correction de chemins de playbooks perimes
(preexistants) dans CLAUDE.md/SOLUTION.md : vm_templates/..._prepare|
verify|cleanup -> modeles_vm/..._preparer|verifier|nettoyer, et
confirm_template_cleanup -> template_cleanup_confirm.
Valide : diff vide, ansible-lint 0 echec, make inventaire-verifier.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les fichiers geres par les roles (99-chezlepro.conf, chezlepro_filter,
chezlepro-bind.conf, /etc/redis/chezlepro.conf...) et les 14 templates
correspondants passent a la marque neutre du moteur 'setops' (git mv +
references src/dest). Un loup ne deploie plus de fichiers marques chezlepro.
Coherence src <-> template verifiee, ansible-lint 0 echec, diff vide,
syntax-check des playbooks de groupes OK. READMEs laisses (exemples).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
serveurs_* -> serveur_, clients_ -> client_, suffixes pluriels au
singulier (serveur_web_dorsal/frontal, client_metrique, client_journal).
Renommage par tokens exacts : repertoires de roles, playbooks de groupes,
group_vars, variables internes des roles (serveur_nginx_*, conformite
ansible-lint), groupes du plan, constantes de code, docs. Faux-amis
preserves (serveurs_bd, scripts/serveurs.py, fonctions Python). Groupes
d'etat gardes au pluriel (hotes_actifs/planifies, modeles_vm).
Valide : ansible-lint 0 echec (0 var-naming), diff vide de la generation,
node --check, tous les registres. Ajout de .ansible-lint excluant docs/
(registres de donnees, pas du contenu Ansible).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
L'application porte tous ses liens (groupe=capacite, hote=VM, port,
requiert, expose). L'exposition DNS quitte docs/domaines.yml et vit sur
l'application via 'expose' ; domaines.yml ne decrit plus que les zones.
- inventory_rules : expositions_des_applications + domaine_parent ;
valider_applications valide requiert / expose / port.
- serveurs_nginx derive ses vhosts des applications (expose + edge),
resolvant application -> hote -> IP (role + template reecrits).
- filter plugin : expose la nouvelle regle a Ansible.
- CLI : applications.py --port/--requiert/--expose ; domaines.py affiche
les expositions derivees des applications.
- GUI : champs Port/Requiert/Expose sur la fiche Application (persistes ;
corrige la perte de champs a la sauvegarde) ; l'API expose les domaines.
Le groupe n'est plus une cible de liaison, seulement une capacite.
Renommage nomenclature.domaines -> fonctions : Phase 1b. Generation de
l'inventaire depuis le plan : Phase 3.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
serveurs_nginx derive ses vhosts de docs/domaines.yml (bloc exposition) :
pour chaque exposition web ciblant cet edge, un server block est genere
(expositions.conf.j2). Amont = entree 'amont' explicite, sinon
http://<IP interne de la cible>:<port> resolu depuis l'inventaire. Une
exposition non resolvable (cible sans hote actif, ou sans port) est listee
mais non publiee.
- defaults : serveurs_nginx_groupe (edge cible), serveurs_nginx_publier_expositions.
- Les sites declares a la main coexistent.
- Ajout du port 3000 a l'exposition forge.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Modele:
- Chaque base porte un "consommateur" (le groupe applicatif qui l'utilise) et un
"usage" (principale/cache...). Une application peut avoir plusieurs bases.
- Le binding appli<->base n'est plus une convention de nom mais un champ gere.
Regles partagees (inventory_rules): consommateur requis a la validation;
helper bases_du_groupe(registre, groupe).
GUI (make inventaire-ui):
- Vue "Bases": menu deroulant Consommateur + champ Usage par base -> on fait les
connexions ici; plusieurs bases par appli supportees.
- Vue "Chaine" detaillee: chaque groupe affiche ses roles ET ses bases avec leur
chaine de connexion (appli -> base -> serveur de BD -> hote).
CLI (bases_donnees.py): ajouter-base --consommateur --usage; lister affiche
"base <- consommateur (usage): DSN".
Roles serveurs_keycloak / serveurs_forgejo / serveurs_icinga: resolution de leur
base par consommateur (groupe), plus de cle codee en dur.
Valide: ansible-lint (roles), node --check (JS), round-trips GUI et CLI,
multi-BD verifie (serveurs_web_dorsaux -> 2 bases), make inventaire-verifier.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Registre multi-serveurs (docs/bases-donnees.yml):
- Section serveurs_bd: serveurs de BD nommes (type/hote/port/groupe).
- Chaque base reference un serveur nomme; la chaine de connexion derivee fait
le lien appli <-> BD. L'hote n'est plus code en dur dans les roles applicatifs.
Regles partagees (scripts/inventory_rules.py):
- charger_bases_donnees, valider_bases, chaine_connexion (GUI et CLI s'appuient dessus).
GUI (make inventaire-ui):
- Vue "Bases": serveurs, bases et chaines de connexion (mot de passe masque),
gestion complete (ajout/edition/retrait), endpoint POST /api/bases (valide, jeton).
CLI (scripts/bases_donnees.py):
- lister/verifier/ajouter-serveur/ajouter-base/retirer-*; cibles make bases et
bases-verifier; registre valide dans make inventaire-verifier.
Roles migres: serveurs_postgresql (filtre par serveur nomme relie a son groupe),
serveurs_keycloak / serveurs_forgejo / serveurs_icinga (hote et port depuis le registre).
Valide: ansible-lint (roles migres), node --check (JS), round-trips GUI et CLI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>