Neutraliser le moteur pour partage public (100% neutre)

Suppression de toute trace Chezlepro de l'outil (roles, scripts, docs
publiques, exemples, LICENSE). Prouve par scan exhaustif : git grep vide
pour chezlepro, asgard/TrueNAS, supernet reel 10.1.x.

Corrige 5 defauts de genericite fonctionnels (motd, app.ini Forgejo,
organisation openldap, nom AC step-ca, et IP reelles codees en dur dans
les defaults de roles -> plage d'exemple 10.0.x). LICENSE -> Alliance
Boreale. Fichiers mainteneur + CHANGELOG conserves (par decision).

La separation moteur/instance tient : OPS-Chezlepro surcharge deja ses
vraies valeurs de topologie. Verifie : make verifier exit 0 (4 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-24 19:58:00 -04:00
parent f8e5e4d928
commit b775b7f99d
53 changed files with 126 additions and 125 deletions

View file

@ -5,6 +5,7 @@
### Modifié
- **Consolidation minimale post-diagnostic (ménage documentaire, sans risque).** Suite à une relecture à froid « auteur » de l'état réel du dépôt. (1) **En-tête généré rafraîchi** : `instance/inventories/production/hosts.yml` pointait encore vers l'ancienne source `docs/` ; régénéré via `instancier-appliquer` (diff sémantique **vide** — contenu inchangé, seul l'en-tête a bougé ; commité côté instance `OPS-Chezlepro`). (2) **`docs/catalogue-services.md`** : nouvelle section **« État d'implémentation des rôles »** qui distingue sans ambiguïté les rôles **implémentés** (validés *en tant que code*, **non éprouvés en prod**), les **échafaudages** (playbooks-ancres `debug` sans rôle : `serveur_nextcloud`, `serveur_collabora`, `client_supervision`, `serveur_web_frontal`, `serveur_web_dorsal`) et les **rôles-catégories inertes** (`applications`, `backup`, `database`, `identity`, `monitoring`, `proxmox`, `storage`, `web` — vestiges d'un regroupement par catégorie abandonné, l'architecture réelle étant plate `serveur_*`/`client_*`) ; colonnes « Rôle futur » → « Rôle ». (3) **`docs/vm-lifecycle.md` §8** : flux de déploiement réaligné sur le plan (`instancier-appliquer` puis `deployer`) au lieu de la commande supplantée `hote-ajouter`. Vérifié : `make verifier` (exit 0), `ansible-lint` 0 échec. **Non touché à dessein** : les références `instance/inventories/lab/` des docs de template sont **correctes** (contexte golden template, distinct de `production`) ; le bas du `README.md` (« Premier chantier »/« Principe ») est daté mais **exact** (template = socle), donc laissé tel quel pour éviter le churn.
- **`creer-vm` enfin piloté par le plan — couture « inventaire → création VM » fermée (étape 4 du diagnostic).** `make creer-vm HOTE=<hôte>` ne prend plus qu'**un argument** : il **lit VMID/IP/CIDR/passerelle/VLAN/stockage/disque/nœud directement dans l'inventaire généré** (comme `deployer` lit ses groupes) au lieu de les redemander à la main, et **n'écrit plus** dans l'inventaire (l'appel à `hote-ajouter` est supprimé — l'hôte est déjà présent via le plan). Repli sur le nœud par défaut de `config` si `proxmox_noeud` absent. Les 3 cibles legacy `hote-ajouter` / `hote-planifier` / `hote-groupes` (qui éditaient l'inventaire généré à la main — anti-pattern) sont **neutralisées** : refus explicite renvoyant vers `serveurs.yml` + `instancier-appliquer`. `aide` et docs (`README`, `QUICKSTART`, `procedure-template-debian13-proxmox`) alignées sur `creer-vm HOTE=…`. La chaîne déclarative est désormais **continue** : `plan → instancier-appliquer → creer-vm HOTE → (activer) → deployer HOTE`. Activation laissée **manuelle** (édit du plan, par décision). Vérifié : `make verifier` exit 0 (dont 4 tests unitaires), extraction testée sur l'inventaire réel (`data-01` avec nœud, `collab-01` sans nœud → repli), chemins de refus (HOTE vide, hôte absent, cibles legacy) exit 2. *(Clonage réel non exécuté : exige Proxmox — c'est la preuve VM, étape suivante.)*
- **Neutralisation complète pour partage public (« 100 % neutre »).** Préparation au don public du moteur : suppression de **toute** trace Chezlepro de l'**outil** (rôles, scripts, docs publiques, exemples, LICENSE) — prouvée par scan exhaustif (`git grep` revient **vide** pour `chezlepro`, pour `asgard`/`TrueNAS`, et pour le supernet réel `10.1.x`). Corrigés au passage **5 défauts de généricité fonctionnels** qui auraient déployé du Chezlepro chez tout hébergeur : `roles/motd/templates/motd.j2` (« Système Chezlepro » → `{{ domaine_interne | default('Set-OPS') }}`), `serveur_forgejo` (`APP_NAME`), `serveur_openldap` (organisation par défaut), `serveur_step_ca` (nom d'AC par défaut), et surtout les **IP réelles codées en dur dans les `defaults`** de plusieurs rôles (`db_host`, `loki_url`, `reseaux_autorises` → plage d'exemple `10.0.x`). Noms de tâches/playbooks et exemples de README généricisés ; marqueurs de fichiers gérés alignés sur `setops` (READMEs en retard) ; placeholder GUI neutralisé. **LICENSE : copyright → Alliance Boréale.** Fichiers **mainteneur** (`AGENTS.md`, `CLAUDE.md`, `SOLUTION.md`, doc Codex) et `CHANGELOG` conservés (couche gouvernance/historique — peuvent nommer Chezlepro, par décision). L'instance `OPS-Chezlepro` **surcharge déjà** ses vraies valeurs de topologie dans ses `group_vars` : la séparation moteur/instance tient, le changement des `defaults` ne casse pas Chezlepro (seule `client_journal_loki_url` reste à surcharger côté instance). Vérifié : `make verifier` exit 0 (4 tests), 42 fichiers, scans de fuite **vides**.
### Ajouté
- **Sous-commande `inventory_host.py parametres-proxmox --hote X`** : émet, machine-lisible (`SETOPS_*='valeur'`), les paramètres de clonage Proxmox d'un hôte lus dans l'inventaire généré ; refuse si l'hôte est absent ou s'il manque un champ requis (VMID/IP/CIDR/passerelle/VLAN). Consommée par `make creer-vm`. **Premier test stdlib du dépôt** `scripts/tests/test_inventory_host.py` (sans pytest) + cible **`make test`**, câblée dans `make verifier`.

View file

@ -220,7 +220,7 @@ If you develop a new program, and you want it to be of the greatest possible use
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
Set-OPS
Copyright (C) 2026 Chezlepro
Copyright (C) 2026 Alliance Boréale
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

View file

@ -99,7 +99,7 @@ aide:
@printf '%s\n' ' Creer une VM (VMID/IP/VLAN/passerelle lus dans le plan):'
@printf '%s\n' ' make creer-vm HOTE=web-frontal-01'
@printf '%s\n' ' Cloner seulement, sans passer par le plan:'
@printf '%s\n' ' make cloner-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1'
@printf '%s\n' ' make cloner-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.0.2.31 PASSERELLE=10.0.2.1'
@printf '%s\n' ' Configurer Proxmox et le Vault API:'
@printf '%s\n' ' make config'
@printf '%s\n' ''
@ -148,7 +148,7 @@ aide:
@printf '%s\n' ''
@printf '%s\n' 'Variables frequentes'
@printf '%s\n' ' HOTE=web-frontal-01 GROUPE=serveur_debian GROUPES="serveur_debian serveur_durci"'
@printf '%s\n' ' VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1'
@printf '%s\n' ' VMID=95301 VLAN=15 ADRESSE_IP=10.0.2.31 PASSERELLE=10.0.2.1'
@printf '%s\n' ' FICHIER_INVENTAIRE=$(SETOPS_INSTANCE)/inventories/production/hosts.yml FICHIER_DEPENDANCES=docs/dependances-groupes.yml CONFIRMER=true'
.PHONY: lint

View file

@ -2,7 +2,7 @@
**Set-OPS est un moteur Ansible générique** qui permet à un hébergeur de **construire et exploiter un écosystème numérique souverain** — DNS interne, AC/PKI, identité (LDAP + SSO), relais courriel, bases de données, observabilité, applications — sur sa propre grappe **Proxmox**, à partir d'un **plan déclaratif**.
Le dépôt est le **moteur** (générique, partageable). Chaque déploiement réel est une **instance** (le plan + l'inventaire d'un hébergeur, dans son propre dépôt). Chezlepro en est une ; tu crées la tienne à partir d'un **modèle prêt à déployer** (`exemples/modeles/`).
Le dépôt est le **moteur** (générique, partageable). Chaque déploiement réel est une **instance** (le plan + l'inventaire d'un hébergeur, dans son propre dépôt). Tu crées la tienne à partir d'un **modèle prêt à déployer** (`exemples/modeles/`).
> 👉 **Tu débarques avec une grappe Proxmox et tu veux monter ton écosystème ? Commence par [`QUICKSTART.md`](QUICKSTART.md).**
@ -12,7 +12,7 @@ Le dépôt est le **moteur** (générique, partageable). Chaque déploiement ré
## Mission (la vision derrière l'outil)
`Set-OPS` ne se limite plus à l'exploitation : il **définit et construit l'écosystème numérique souverain de Chezlepro Inc.** — une infrastructure interne auto-suffisante, sans dépendance SaaS, décrite en code et pilotée par des registres machine-lisibles qui font office de **source unique de vérité** (`instance/plan/serveurs.yml`, `instance/plan/applications.yml`, `instance/plan/bases-donnees.yml`, `instance/plan/domaines.yml`, `instance/plan/nomenclature.yml`, `docs/dependances-groupes.yml`).
`Set-OPS` ne se limite plus à l'exploitation : il **définit et construit un écosystème numérique souverain** — une infrastructure interne auto-suffisante, sans dépendance SaaS, décrite en code et pilotée par des registres machine-lisibles qui font office de **source unique de vérité** (`instance/plan/serveurs.yml`, `instance/plan/applications.yml`, `instance/plan/bases-donnees.yml`, `instance/plan/domaines.yml`, `instance/plan/nomenclature.yml`, `docs/dependances-groupes.yml`).
Piliers de l'écosystème :

View file

@ -1,6 +1,6 @@
# Architecture Set-OPS
Set-OPS définit et construit l'écosystème numérique souverain de Chezlepro. Il se
Set-OPS définit et construit l'écosystème numérique souverain. Il se
pilote par un **plan** : l'inventaire Ansible (`instance/inventories/production/hosts.yml`)
est **généré** depuis le plan, pas édité à la main.
@ -51,7 +51,7 @@ Les groupes structurels ou vides peuvent exister, mais un groupe assigné à une
## Cycle de vie VM
Le cycle de vie des VM Chezlepro est documenté dans :
Le cycle de vie des VM est documenté dans :
```text
docs/vm-lifecycle.md

View file

@ -1,4 +1,4 @@
# Catalogue des services Chezlepro
# Catalogue des services
Ce document fixe les noms de groupes et de playbooks pour les prochains services.

View file

@ -1,4 +1,4 @@
# DNS interne Chezlepro
# DNS interne
Le service DNS interne est la premiere capacite de plateforme.
@ -16,7 +16,7 @@ client_dns -> integration cliente DNS
La zone initiale est :
```text
chezlepro.internal
exemple.internal
```
Elle est definie dans :
@ -39,8 +39,8 @@ ansible_host defini
Exemple :
```text
web-frontal-01 ansible_host=10.1.15.31
-> web-frontal-01.chezlepro.internal A 10.1.15.31
web-frontal-01 ansible_host=10.0.2.31
-> web-frontal-01.exemple.internal A 10.0.2.31
```
Les enregistrements additionnels explicites sont dans `serveur_powerdns_records`.
@ -83,8 +83,8 @@ Les premiers checks utiles :
- service `pdns` actif ;
- port UDP/TCP 53 disponible ;
- SOA de `chezlepro.internal` resoluble ;
- enregistrement `ns1.chezlepro.internal` resoluble ;
- SOA de `exemple.internal` resoluble ;
- enregistrement `ns1.exemple.internal` resoluble ;
- enregistrements des hotes actifs presents ;
- serial de zone attendu ;
- latence de resolution.

View file

@ -2,7 +2,7 @@
## Objet
Ce document justifie les ajouts appliqués par Set-OPS à une installation Debian 13 minimale pour obtenir le golden template Proxmox de Chezlepro.
Ce document justifie les ajouts appliqués par Set-OPS à une installation Debian 13 minimale pour obtenir le golden template Proxmox.
Le template doit rester un socle commun, clonable et sécuritaire. Il ne doit pas devenir un serveur applicatif ni intégrer des dépendances propres à un rôle final.
@ -35,7 +35,7 @@ aucune donnée propre à un clone final
### Objectif
Le playbook `debian13_proxmox_preparer.yml` transforme une VM Debian 13 minimale en socle golden template Chezlepro.
Le playbook `debian13_proxmox_preparer.yml` transforme une VM Debian 13 minimale en socle golden template.
Il installe les composants communs, configure l'accès Ansible, applique le durcissement template-safe et prépare la VM pour cloud-init.
@ -61,7 +61,7 @@ VM destinée à devenir un template, pas un serveur de production
Vérifications utiles depuis le poste Ansible :
```bash
ssh ansible@10.1.99.99
ssh ansible@10.0.2.99
ansible -i instance/inventories/lab/hosts.yml modeles_vm -m ping
ansible -i instance/inventories/lab/hosts.yml modeles_vm -m setup
```
@ -194,7 +194,7 @@ nftables_socle
| `chrony` | Installe et active la synchronisation du temps. | Un temps correct est nécessaire pour TLS, journaux, audit, Kerberos/LDAP futur, monitoring et corrélation d'incidents. | La source NTP définitive peut être ajustée plus tard par inventaire. |
| `ssh_baseline` | Pose la base SSH : root interdit, clé publique obligatoire, mot de passe désactivé. | Force un accès administrateur par clé dès la construction du template. | Cloud-init doit avoir injecté le `ciuser` et sa clé avant Ansible. |
| `systemd_ssh_auto` | Désactive le comportement `systemd.ssh_auto` si demandé. | Évite une exposition SSH automatique via mécanismes transitoires non désirés dans un template serveur. | Ne remplace pas la politique SSH principale. |
| `motd` | Déploie un message d'accueil sobre. | Identifie le contexte Chezlepro et rappelle que la machine est gérée par Set-OPS. | Ne doit pas contenir d'information sensible. |
| `motd` | Déploie un message d'accueil sobre. | Identifie le contexte de l_instance et rappelle que la machine est gérée par Set-OPS. | Ne doit pas contenir d'information sensible. |
| `hardening_packages` | Installe les paquets de sécurité communs. | Fournit les briques nécessaires au durcissement sans configurer de service applicatif. | Les politiques strictes par rôle restent appliquées sur les clones. |
| `sysctl_durcissement` | Applique des paramètres noyau de sécurité. | Réduit des comportements réseau et noyau risqués avec des réglages standards pour serveur Linux. | Les réglages spécifiques à une charge de travail peuvent être ajustés par rôle. |
| `core_dumps` | Désactive les core dumps. | Limite le risque de fuite de secrets ou données sensibles dans des dumps mémoire. | Un serveur de debug peut réactiver un comportement adapté hors template. |

View file

@ -71,17 +71,17 @@ Les groupes restent fins et composables. La cohabitation se fait en associant pl
## Plan d'adressage interne
Réseau interne unique : `10.1.0.0/16`. Segmentation par fonction, un `/24` et un VLAN par catégorie, **3ᵉ octet = VLAN** (L2 alignée sur L3).
Réseau interne unique : `10.0.0.0/16`. Segmentation par fonction, un `/24` et un VLAN par catégorie, **3ᵉ octet = VLAN** (L2 alignée sur L3).
| Catégorie | VLAN | Sous-réseau | Passerelle |
| --- | --- | --- | --- |
| 1 — Fondations / infra | 11 | `10.1.11.0/24` | `10.1.11.1` |
| 2 — Identité | 12 | `10.1.12.0/24` | `10.1.12.1` |
| 3 — Données | 13 | `10.1.13.0/24` | `10.1.13.1` |
| 4 — Observabilité | 14 | `10.1.14.0/24` | `10.1.14.1` |
| 5 — Applications | 15 | `10.1.15.0/24` | `10.1.15.1` |
| 1 — Fondations / infra | 11 | `10.0.11.0/24` | `10.0.11.1` |
| 2 — Identité | 12 | `10.0.12.0/24` | `10.0.12.1` |
| 3 — Données | 13 | `10.0.13.0/24` | `10.0.13.1` |
| 4 — Observabilité | 14 | `10.0.14.0/24` | `10.0.14.1` |
| 5 — Applications | 15 | `10.0.15.0/24` | `10.0.15.1` |
Adresse d'hôte (4ᵉ octet) : **`service × 10 + NN`**. `.1` = passerelle ; `.2``.9` réservés. Exemple : `web-dorsal-01` (catégorie 5, service 4, NN 01) → `10.1.15.41`.
Adresse d'hôte (4ᵉ octet) : **`service × 10 + NN`**. `.1` = passerelle ; `.2``.9` réservés. Exemple : `web-dorsal-01` (catégorie 5, service 4, NN 01) → `10.0.15.41`.
Tout se dérive de la fonction de l'hôte, et la source unique machine-lisible est **`instance/plan/nomenclature.yml`** :
@ -89,14 +89,14 @@ Tout se dérive de la fonction de l'hôte, et la source unique machine-lisible e
hostname = <fonction>-<NN>
VMID = 9 · catégorie · service · NN
VLAN = catégorie.vlan
IP = 10.1.<vlan>.(service × 10 + NN)
IP = 10.0.<vlan>.(service × 10 + NN)
```
`make inventaire-ui` lit ce registre et **propose** automatiquement VMID, VLAN, IP et passerelle quand on nomme un hôte. La sécurité entre zones se fera par règles inter-zones (nftables / edge), pas par l'adressage.
Contrainte : `NN` de 01 à 09 par fonction (l'octet hôte reste dans le bloc du service). Au-delà, ouvrir une nouvelle fonction/service dans `instance/plan/nomenclature.yml`.
La segmentation `10.1.0.0/16` remplace l'ancienne plage d'essais `192.168.12.x`.
La segmentation `10.0.0.0/16` remplace l'ancienne plage d'essais `192.168.12.x`.
## Variables de provisioning d'hôte

View file

@ -46,7 +46,7 @@ Tous sous `docs/`, machine-lisibles, validés, consommés par le GUI, le CLI et
### Dérivations clés
- **Nommage/adressage** : tout part de la `fonction` de l'hôte (`web-frontal-03`).
`VMID = 9·catégorie·service·NN`, `VLAN = catégorie.vlan`,
`IP = 10.1.<vlan>.(service×10 + NN)`. Voir `docs/nomenclature-vm.md`.
`IP = 10.0.<vlan>.(service×10 + NN)`. Voir `docs/nomenclature-vm.md`.
- **DSN** (lien application↔base) : `<type>://<proprietaire>:<secret>@<hôte>:<port>/<base>`.
Une application reçoit les bases où `(portee=application ET consommateur=elle)`
OU `(portee=groupe ET consommateur=son groupe)` OU `(portee=hote ET consommateur=son hôte)`.
@ -157,13 +157,13 @@ C'est ainsi que le plan a été initialisé sans perte, avec diff vide vérifié
Le **moteur** (ce dépôt, `Set-OPS`) est générique et partageable ; il ne contient
aucune donnée d'instance. Une **instance** (le plan + l'inventaire d'un loup) vit
dans son **propre dépôt** (ex. `OPS-Chezlepro`).
dans son **propre dépôt** (ex. `OPS-monatelier`).
Le moteur localise l'instance via **`SETOPS_INSTANCE`** (défaut : `instance`). Deux
modèles :
- **Modèle A — dépôts frères** (en cours) : moteur et instance côte à côte ; un
symlink `instance -> ../OPS-Chezlepro` (gitignoré) fait que le défaut résout
symlink `instance -> ../OPS-monatelier` (gitignoré) fait que le défaut résout
l'instance sans configuration. Idéal quand on développe le moteur *et* l'instance.
- **Modèle B — moteur en sous-module** (futur, pour la meute) : l'instance épingle
une version du moteur ; `SETOPS_INSTANCE` pointe la racine de l'instance.
@ -172,7 +172,7 @@ Pour brancher une instance (modèle A) :
```bash
cd Set-OPS
ln -s ../OPS-Chezlepro instance # ou : export SETOPS_INSTANCE=/chemin/instance
ln -s ../OPS-monatelier instance # ou : export SETOPS_INSTANCE=/chemin/instance
make inventaire-verifier # lit l'instance via le symlink
```

View file

@ -18,7 +18,7 @@ docs/modeles_vm/debian13-proxmox.md
## 1. Objectif du modèle
Le modèle Debian 13 doit servir de base commune pour les futurs serveurs de Chezlepro Inc.
Le modèle Debian 13 doit servir de base commune pour les futurs serveurs de l_instance
Objectifs :
@ -92,13 +92,13 @@ Discard : selon stockage, seulement si pertinent
SSD emulation : oui si le stockage est réellement SSD/NVMe
```
Même si le stockage réel est sur TrueNAS iSCSI, le disque présenté à la VM doit rester :
Même si le stockage réel est sur un stockage réseau iSCSI, le disque présenté à la VM doit rester :
```text
SCSI via VirtIO SCSI single
```
Le choix SCSI ici concerne le bus virtuel vu par la VM, pas le protocole réel entre Proxmox et TrueNAS.
Le choix SCSI ici concerne le bus virtuel vu par la VM, pas le protocole réel entre Proxmox et le stockage.
### Taille du disque
@ -202,7 +202,7 @@ LVM
Le stockage réel contient déjà plusieurs couches :
```text
TrueNAS ZFS
stockage ZFS
→ zvol iSCSI
→ Proxmox
→ disque virtuel
@ -495,8 +495,8 @@ Exemple IP statique temporaire pour joindre la VM de modèle :
```bash
qm set 9000 --ciuser ansible
qm set 9000 --sshkeys ~/.ssh/id_ed25519.pub
qm set 9000 --ipconfig0 ip=10.1.99.99/24,gw=10.1.99.1
qm set 9000 --nameserver 10.1.99.1
qm set 9000 --ipconfig0 ip=10.0.99.99/24,gw=10.0.99.1
qm set 9000 --nameserver 10.0.99.1
```
Pour les clones, ces valeurs seront remplacées par l'identité réelle du serveur.
@ -561,7 +561,7 @@ reboot
## 19. SSH durci attendu
Le modèle Chezlepro suppose que Cloud-Init injecte le `ciuser` et sa clé publique avant la prise en charge par Ansible.
Le modèle suppose que Cloud-Init injecte le `ciuser` et sa clé publique avant la prise en charge par Ansible.
L'exigence immédiate est que l'accès par clé fonctionne pour `ansible`.
@ -768,7 +768,7 @@ Les paramètres par VM (VMID, IP, VLAN, passerelle) ne sont plus saisis à la ma
Après le premier démarrage, tester l'accès :
```bash
ssh ansible@10.1.15.31
ssh ansible@10.0.15.31
```
Ensuite appliquer la conformité Ansible :

View file

@ -1,6 +1,6 @@
# Cycle de vie des VM Chezlepro
# Cycle de vie des VM
Ce document décrit le cycle normal d'une VM Debian Chezlepro, depuis l'installation minimale jusqu'à la conformité continue par Ansible.
Ce document décrit le cycle normal d'une VM Debian, depuis l'installation minimale jusqu'à la conformité continue par Ansible.
## Vue d'ensemble
@ -35,7 +35,7 @@ aucun rôle applicatif
aucun secret
```
Cette VM n'est pas encore un golden template Chezlepro.
Cette VM n'est pas encore un golden template.
## 2. Goldenisation
@ -45,7 +45,7 @@ La goldenisation est faite par :
make preparer-modele
```
Ce playbook ajoute le socle Chezlepro commun au template :
Ce playbook ajoute le socle commun au template :
```text
paquets communs

View file

@ -12,5 +12,5 @@
domaine_interne: "acme.internal"
# Le reste de l'identite vit dans le PLAN de l'instance :
# - instance/plan/nomenclature.yml : supernet (ex. 10.1.0.0/16) + liste de fonctions
# - instance/plan/nomenclature.yml : supernet (ex. 10.0.0.0/16) + liste de fonctions
# - instance/plan/serveurs.yml / applications.yml / domaines.yml : le plan rempli

View file

@ -1,5 +1,5 @@
---
- name: Préparer le template Debian 13 Proxmox Chezlepro
- name: Préparer le template Debian 13 Proxmox
hosts: modeles_vm
become: true
gather_facts: true

View file

@ -1,5 +1,5 @@
---
- name: Vérifier le template Debian 13 Proxmox Chezlepro
- name: Vérifier le template Debian 13 Proxmox
hosts: modeles_vm
become: true
gather_facts: true

View file

@ -57,8 +57,8 @@ make creer-vm \
HOTE=web-frontal-01 \
VMID=95301 \
VLAN=15 \
ADRESSE_IP=10.1.15.31 \
PASSERELLE=10.1.15.1 \
ADRESSE_IP=10.0.15.31 \
PASSERELLE=10.0.15.1 \
GROUPES="serveur_debian serveur_durci"
```
@ -67,7 +67,7 @@ make creer-vm \
Le disque du clone hérite de la taille du modèle. Pour l'agrandir à la création, fournir explicitement une taille supérieure à celle du modèle :
```bash
make creer-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.1.15.31 PASSERELLE=10.1.15.1 TAILLE_DISQUE=64G GROUPES="serveur_debian serveur_durci"
make creer-vm HOTE=web-frontal-01 VMID=95301 VLAN=15 ADRESSE_IP=10.0.15.31 PASSERELLE=10.0.15.1 TAILLE_DISQUE=64G GROUPES="serveur_debian serveur_durci"
```
Proxmox ne permet pas de réduire un disque existant.

View file

@ -1,3 +1,3 @@
# applications
Rôles applications : services applicatifs Chezlepro.
Rôles applications : services applicatifs internes.

View file

@ -6,7 +6,7 @@
- audispd-plugins
state: present
- name: Déployer les règles auditd Chezlepro
- name: Déployer les règles auditd Set-OPS
ansible.builtin.template:
src: 99-setops.rules.j2
dest: /etc/audit/rules.d/99-setops.rules

View file

@ -15,7 +15,7 @@ visible dans Grafana (datasource Loki).
## Variables
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `client_journal_loki_url` | `http://10.1.14.11:3100/loki/api/v1/push` | Endpoint Loki (obs-01) |
| `client_journal_loki_url` | `http://10.0.14.11:3100/loki/api/v1/push` | Endpoint Loki (obs-01) |
## Notes / limites
- La **syntaxe de configuration Alloy évolue** entre versions ; la config fournie

View file

@ -7,7 +7,7 @@ client_journal_utilisateur: "alloy"
client_journal_config: "/etc/alloy/config.alloy"
# Point de collecte Loki (obs-01, serveur_loki, VLAN 14).
client_journal_loki_url: "http://10.1.14.11:3100/loki/api/v1/push"
client_journal_loki_url: "http://10.0.14.11:3100/loki/api/v1/push"
# Depot apt officiel Grafana (partage avec serveur_loki / serveur_grafana).
client_journal_depot_cle_url: "https://apt.grafana.com/gpg-full.key"

View file

@ -11,15 +11,15 @@ via l'annuaire central `serveur_openldap`, grâce à **SSSD** (NSS + PAM).
- `libpam-sss` active automatiquement le module PAM `sss`.
## Effet
Après ce rôle, les comptes de l'annuaire Chezlepro peuvent se connecter à l'hôte
Après ce rôle, les comptes de l'annuaire interne peuvent se connecter à l'hôte
(SSH, console) et leur home est créé à la première connexion. Couplé à `client_pki`
(identité machine), l'écosystème a une authentification **machines + utilisateurs** centralisée.
## Variables principales
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `client_ldap_uri` | `ldap://idm-01.chezlepro.internal` | URI de l'annuaire |
| `client_ldap_base_dn` | `dc=chezlepro,dc=internal` | Base de recherche |
| `client_ldap_uri` | `ldap://idm-01.exemple.internal` | URI de l'annuaire |
| `client_ldap_base_dn` | `dc=exemple,dc=internal` | Base de recherche |
| `client_ldap_bind_dn` | `""` (anonyme) | Compte de lecture (optionnel, mdp via Vault) |
| `client_ldap_tls_reqcert` | `never` | Validation TLS (→ `demand` avec LDAPS) |

View file

@ -14,7 +14,7 @@ automatiquement.
## « Chaque hôte authentifiable »
Après ce rôle, l'hôte possède une **identité machine** vérifiable : un certificat émis
par l'AC Chezlepro, renouvelé sans intervention. Les services peuvent l'utiliser pour
par l'AC interne, renouvelé sans intervention. Les services peuvent l'utiliser pour
du TLS / mTLS interne.
## Secrets requis (Vault)
@ -27,8 +27,8 @@ L'empreinte racine s'obtient sur l'AC (`step certificate fingerprint <root_ca.cr
## Variables principales
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `client_pki_ca_url` | `https://infra-pki-01.chezlepro.internal:8443` | URL de l'AC |
| `client_pki_provisioner` | `admin@chezlepro.internal` | Provisioner émetteur |
| `client_pki_ca_url` | `https://infra-pki-01.exemple.internal:8443` | URL de l'AC |
| `client_pki_provisioner` | `admin@exemple.internal` | Provisioner émetteur |
| `client_pki_nom_cert` | FQDN de l'hôte | Nom du certificat |
## Notes / sécurité

View file

@ -16,9 +16,9 @@ Tout courrier émis localement (`mail`, cron, scripts) est relayé vers `serveur
## Variables
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `client_smtp_relais` | `infra-mail-01.chezlepro.internal` | MTA relais |
| `client_smtp_relais` | `infra-mail-01.exemple.internal` | MTA relais |
| `client_smtp_port` | `25` | Port du relais |
| `client_smtp_from` | `<hostname>@chezlepro.internal` | Expéditeur par défaut |
| `client_smtp_from` | `<hostname>@exemple.internal` | Expéditeur par défaut |
| `client_smtp_tls` | `false` | TLS (→ `true` avec certificats step_ca) |
## Notes / limites

View file

@ -6,7 +6,7 @@
- cloud-guest-utils
state: present
- name: Déployer la configuration cloud-init Chezlepro
- name: Déployer la configuration cloud-init Set-OPS
ansible.builtin.template:
src: 99_setops.cfg.j2
dest: /etc/cloud/cloud.cfg.d/99_setops.cfg

View file

@ -12,7 +12,7 @@
group: root
mode: "0755"
- name: Déployer la jail SSH Chezlepro
- name: Déployer la jail SSH Set-OPS
ansible.builtin.template:
src: sshd-setops.local.j2
dest: /etc/fail2ban/jail.d/sshd-setops.local

View file

@ -7,7 +7,7 @@
group: root
mode: "0755"
- name: Déployer la configuration journald Chezlepro
- name: Déployer la configuration journald Set-OPS
ansible.builtin.template:
src: 99-setops.conf.j2
dest: /etc/systemd/journald.conf.d/99-setops.conf

View file

@ -1,5 +1,5 @@
---
- name: Déployer le MOTD Chezlepro
- name: Déployer le MOTD Set-OPS
ansible.builtin.template:
src: motd.j2
dest: /etc/motd

View file

@ -1,2 +1,2 @@
Système Chezlepro
Système {{ domaine_interne | default('Set-OPS') }}
Gestion : Set-OPS / Ansible

View file

@ -4,7 +4,7 @@
name: nftables
state: present
- name: Déployer la configuration nftables Chezlepro
- name: Déployer la configuration nftables Set-OPS
ansible.builtin.template:
src: nftables.conf.j2
dest: /etc/nftables.conf

View file

@ -21,8 +21,8 @@ vault_bd_forgejo: "..." # mot de passe BD (partage avec serveur_postgresql)
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `serveur_forgejo_version` | `10.0.0` | Version (à vérifier/bumper) |
| `serveur_forgejo_hostname` | `forge.chezlepro.internal` | Domaine (via nginx) |
| `serveur_forgejo_db_host` | `10.1.13.11` | data-01 |
| `serveur_forgejo_hostname` | `forge.exemple.internal` | Domaine (via nginx) |
| `serveur_forgejo_db_host` | `10.0.13.11` | data-01 |
## Notes / limites
- **Version** à confirmer sur forgejo.org/download ; l'URL suit le motif officiel des releases.

View file

@ -17,7 +17,7 @@ serveur_forgejo_http_port: 3000
# Base de donnees : resolue depuis le registre par le groupe consommateur.
serveur_forgejo_groupe: "serveur_forgejo"
serveur_forgejo_db_host: "10.1.13.11" # data-01
serveur_forgejo_db_host: "10.0.13.11" # data-01
# Relais courriel.
serveur_forgejo_smtp: "infra-mail-01.{{ domaine_interne }}"

View file

@ -1,5 +1,5 @@
; Gere par Set-OPS (role serveur_forgejo). Ne pas editer a la main.
APP_NAME = Forgejo Chezlepro
APP_NAME = Forgejo
RUN_USER = {{ serveur_forgejo_utilisateur }}
RUN_MODE = prod
WORK_PATH = {{ serveur_forgejo_data }}

View file

@ -10,7 +10,7 @@ au-dessus de Prometheus (métriques) et Loki (journaux).
- Inscriptions publiques désactivées.
## Publication
- Derrière `serveur_nginx` (TLS à l'edge) ; `GF_SERVER_ROOT_URL=https://grafana.chezlepro.internal/`.
- Derrière `serveur_nginx` (TLS à l'edge) ; `GF_SERVER_ROOT_URL=https://grafana.exemple.internal/`.
- Le site nginx se déclare côté `serveur_nginx`.
## Secret requis (Vault)
@ -21,7 +21,7 @@ serveur_grafana_admin_password: "{{ vault_grafana_admin }}"
## Variables principales
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `serveur_grafana_hostname` | `grafana.chezlepro.internal` | Domaine |
| `serveur_grafana_hostname` | `grafana.exemple.internal` | Domaine |
| `serveur_grafana_prometheus_url` | `http://localhost:9090` | Datasource Prometheus |
| `serveur_grafana_loki_url` | `http://localhost:3100` | Datasource Loki |

View file

@ -18,7 +18,7 @@ serveur_icinga_depot_source: >-
# Base Icinga DB : resolue depuis le registre par le groupe consommateur.
serveur_icinga_groupe: "serveur_icinga"
serveur_icinga_db_host: "10.1.13.11" # data-01 (serveur_postgresql)
serveur_icinga_db_host: "10.0.13.11" # data-01 (serveur_postgresql)
# Redis dedie a Icinga DB (paquet icingadb-redis).
serveur_icinga_redis_host: "localhost"

View file

@ -1,7 +1,7 @@
# serveur_keycloak
SSO / IAM **Keycloak** (distribution Quarkus) — hub d'authentification centralisée
(OIDC/SAML) pour les services Chezlepro.
(OIDC/SAML) pour les services internes.
## Rôle
- Installe un JRE, télécharge et extrait la distribution Keycloak dans `/opt/keycloak`.
@ -27,8 +27,8 @@ vault_bd_keycloak: "..." # mot de passe
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `serveur_keycloak_version` | `26.0.7` | Version (à vérifier/bumper sur keycloak.org/downloads) |
| `serveur_keycloak_hostname` | `keycloak.chezlepro.internal` | Hostname public (via nginx) |
| `serveur_keycloak_db_host` | `10.1.13.11` | IP de data-01 (serveur_postgresql) |
| `serveur_keycloak_hostname` | `keycloak.exemple.internal` | Hostname public (via nginx) |
| `serveur_keycloak_db_host` | `10.0.13.11` | IP de data-01 (serveur_postgresql) |
| `serveur_keycloak_admin_user` | `admin` | Admin bootstrap |
## Notes / limites

View file

@ -14,7 +14,7 @@ serveur_keycloak_hostname: "keycloak.{{ domaine_interne }}"
# Base de donnees : resolue depuis le registre par le groupe consommateur.
serveur_keycloak_groupe: "serveur_keycloak"
# IP interne du serveur PostgreSQL (data-01, cf. nomenclature).
serveur_keycloak_db_host: "10.1.13.11"
serveur_keycloak_db_host: "10.0.13.11"
# Secrets (Ansible Vault) — obligatoires.
serveur_keycloak_admin_user: "admin"

View file

@ -4,7 +4,7 @@ Installe et configure nginx comme **edge** interne : reverse proxy et terminaiso
## Rôle
- Installe `nginx` et `ssl-cert` (certificat auto-signé).
- Durcissement de base via `conf.d/99-chezlepro.conf` (`server_tokens off`, TLS 1.2/1.3, taille de corps).
- Durcissement de base via `conf.d/99-setops.conf` (`server_tokens off`, TLS 1.2/1.3, taille de corps).
- Publie des sites de reverse proxy déclarés dans `serveur_nginx_sites` (vide par défaut).
- **Valide la configuration (`nginx -t`) avant de recharger** (handler `Valider et recharger nginx`).
@ -27,8 +27,8 @@ Installe et configure nginx comme **edge** interne : reverse proxy et terminaiso
```yaml
serveur_nginx_sites:
- nom: forge
domaine: forge.chezlepro.internal
amont: "http://10.1.15.11:3000"
domaine: forge.exemple.internal
amont: "http://10.0.15.11:3000"
# certificat / cle optionnels (sinon snakeoil)
```

View file

@ -24,7 +24,7 @@ serveur_nginx_desactiver_defaut: false # retirer le site Debian par defaut
serveur_nginx_sites: []
# - nom: forge
# domaine: forge.{{ domaine_interne }}
# amont: "http://10.1.15.11:3000"
# amont: "http://10.0.15.11:3000"
# certificat: "/etc/ssl/.../forge.pem" # optionnel, sinon snakeoil
# cle: "/etc/ssl/.../forge.key"

View file

@ -10,8 +10,8 @@ et fédération applicative (Keycloak).
- Crée les unités organisationnelles de base (`ou=people`, `ou=groups`).
## Identité
- Domaine `chezlepro.internal` → base DN **`dc=chezlepro,dc=internal`** (dérivée).
- Admin : `cn=admin,dc=chezlepro,dc=internal`.
- Domaine `exemple.internal` → base DN **`dc=exemple,dc=internal`** (dérivée).
- Admin : `cn=admin,dc=exemple,dc=internal`.
## Secret requis (Vault)
```yaml
@ -23,8 +23,8 @@ refuse de s'exécuter (assertion explicite).
## Variables principales
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `serveur_openldap_domaine` | `chezlepro.internal` | Domaine → base DN |
| `serveur_openldap_organisation` | `Chezlepro Inc` | Organisation |
| `serveur_openldap_domaine` | `exemple.internal` | Domaine → base DN |
| `serveur_openldap_organisation` | `Exemple Inc` | Organisation |
| `serveur_openldap_ou` | `[people, groups]` | OU de base créées |
## Notes / limites

View file

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

View file

@ -5,14 +5,14 @@ Installe et configure PostgreSQL (paquet Debian 13) comme base relationnelle par
## Rôle
- Installe `postgresql`, `postgresql-contrib` et `python3-psycopg2`.
- Détecte le cluster installé par Debian (`/etc/postgresql/<version>/main`).
- Configure via un fichier `conf.d/99-chezlepro.conf` : `listen_addresses`, `port`, `password_encryption`.
- Configure via un fichier `conf.d/99-setops.conf` : `listen_addresses`, `port`, `password_encryption`.
- Gère `pg_hba.conf` : socket local en `peer` (administration), boucle locale et **réseaux internes autorisés** en `scram-sha-256`.
- Active et démarre le service.
- Provisionne optionnellement comptes et bases applicatifs (vides par défaut).
## Réseau et sécurité
- Écoute par défaut sur `127.0.0.1` et l'IP interne de l'hôte (`ansible_host`).
- `serveur_postgresql_reseaux_autorises` ouvre l'accès aux clients internes (défaut `10.1.0.0/16`).
- `serveur_postgresql_reseaux_autorises` ouvre l'accès aux clients internes (défaut `10.0.0.0/16`).
- Authentification `scram-sha-256` (jamais `md5`/`trust`).
- `pg_hba.conf` et la conf sont **entièrement gérés** par le rôle ; les modifications manuelles sont écrasées.
@ -22,7 +22,7 @@ Installe et configure PostgreSQL (paquet Debian 13) comme base relationnelle par
| `serveur_postgresql_version` | `""` (auto) | Version majeure du cluster |
| `serveur_postgresql_port` | `5432` | Port d'écoute |
| `serveur_postgresql_ecoute` | `127.0.0.1` + IP interne | `listen_addresses` |
| `serveur_postgresql_reseaux_autorises` | `["10.1.0.0/16"]` | Réseaux clients en `pg_hba` |
| `serveur_postgresql_reseaux_autorises` | `["10.0.0.0/16"]` | Réseaux clients en `pg_hba` |
| `serveur_postgresql_methode_auth` | `scram-sha-256` | Méthode d'authentification |
| `serveur_postgresql_parametres` | `{}` | Réglages additionnels |
| `serveur_postgresql_comptes` | `[]` | Comptes applicatifs (mot de passe via Vault) |

View file

@ -16,7 +16,7 @@ serveur_postgresql_ecoute:
- "127.0.0.1"
- "{{ ansible_host | default(ansible_default_ipv4.address, true) }}"
serveur_postgresql_reseaux_autorises:
- "10.1.0.0/16"
- "10.0.0.0/16"
serveur_postgresql_methode_auth: "scram-sha-256"
# Reglages additionnels (vide => valeurs par defaut de Debian).

View file

@ -37,7 +37,7 @@
group: postgres
mode: "0755"
- name: Deployer la configuration Chezlepro
- name: Deployer la configuration Set-OPS
ansible.builtin.template:
src: 99-setops.conf.j2
dest: "{{ serveur_postgresql_conf_dir }}/conf.d/99-setops.conf"

View file

@ -5,7 +5,7 @@ PostgreSQL.
## Rôle
- Installe `redis-server`.
- Déploie une **surcharge** `/etc/redis/chezlepro.conf` (incluse en fin de `redis.conf`,
- Déploie une **surcharge** `/etc/redis/setops.conf` (incluse en fin de `redis.conf`,
donc prioritaire) : écoute, `requirepass`, `maxmemory` + politique d'éviction.
- N'écrase pas le `redis.conf` du paquet (approche non destructive par `include`).

View file

@ -12,7 +12,7 @@
update_cache: true
cache_valid_time: 3600
- name: Deployer la surcharge de configuration Chezlepro
- name: Deployer la surcharge de configuration Set-OPS
ansible.builtin.template:
src: setops.conf.j2
dest: "{{ serveur_redis_config }}"

View file

@ -11,15 +11,15 @@ Relais SMTP sortant interne. **Implémenté avec Postfix** (fournit l'interface
## Sécurité
- `smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination` → pas de relais ouvert.
- `mynetworks` par défaut : boucle locale + `10.1.0.0/16`.
- `mynetworks` par défaut : boucle locale + `10.0.0.0/16`.
- N'héberge pas de boîtes (`mydestination` ne contient pas le domaine) : remise relayée.
- TLS opportuniste (`may`), certificat snakeoil par défaut.
## Variables principales
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `serveur_sendmail_domaine` | `chezlepro.internal` | `mydomain` / mailname |
| `serveur_sendmail_reseaux_autorises` | boucle + `10.1.0.0/16` | `mynetworks` (qui peut relayer) |
| `serveur_sendmail_domaine` | `exemple.internal` | `mydomain` / mailname |
| `serveur_sendmail_reseaux_autorises` | boucle + `10.0.0.0/16` | `mynetworks` (qui peut relayer) |
| `serveur_sendmail_smarthost` | `""` | Relais amont (vide = remise directe MX) |
| `serveur_sendmail_inet_interfaces` | `all` | Interfaces d'écoute |
| `serveur_sendmail_tls_cert` / `_cle` | snakeoil | Certificat TLS |

View file

@ -15,7 +15,7 @@ serveur_sendmail_nom_hote: "{{ ansible_fqdn | default(ansible_hostname) }}"
serveur_sendmail_reseaux_autorises:
- "127.0.0.0/8"
- "[::1]/128"
- "10.1.0.0/16"
- "10.0.0.0/16"
# Smarthost amont optionnel. Vide => remise directe (MX).
serveur_sendmail_smarthost: "" # ex. "[smtp.exemple.com]:587"

View file

@ -1,7 +1,7 @@
# serveur_step_ca
Autorité de certification interne **Smallstep step-ca** avec provisioner **ACME**,
pour émettre les certificats internes de Chezlepro (`client_pki` est le client ACME).
pour émettre les certificats internes (`client_pki` est le client ACME).
## Rôle
- Ajoute le **dépôt apt officiel Smallstep** (clé + source deb822) et installe `step-ca` + `step-cli`.
@ -24,10 +24,10 @@ les variables en clair référençant ces secrets dans `.../serveur_step_ca/main
## Variables principales
| Variable | Défaut | Rôle |
| --- | --- | --- |
| `serveur_step_ca_nom` | `Chezlepro Internal CA` | Nom de l'AC |
| `serveur_step_ca_nom` | `Set-OPS Internal CA` | Nom de l'AC |
| `serveur_step_ca_dns` | FQDN + IP | SAN/DNS du certificat de l'AC |
| `serveur_step_ca_adresse` | `:8443` | Adresse d'écoute |
| `serveur_step_ca_provisioner` | `admin@chezlepro.internal` | Provisioner JWK admin |
| `serveur_step_ca_provisioner` | `admin@exemple.internal` | Provisioner JWK admin |
| `serveur_step_ca_acme` | `true` | Ajoute un provisioner ACME |
## Notes

View file

@ -16,7 +16,7 @@ serveur_step_ca_steppath: "/etc/step-ca"
serveur_step_ca_service: "step-ca"
# Identite de l'AC.
serveur_step_ca_nom: "Chezlepro Internal CA"
serveur_step_ca_nom: "Set-OPS 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@{{ domaine_interne }}"

View file

@ -12,7 +12,7 @@
group: root
mode: "0755"
- name: Déployer la configuration SSH Chezlepro
- name: Déployer la configuration SSH Set-OPS
ansible.builtin.template:
src: 10-setops.conf.j2
dest: /etc/ssh/sshd_config.d/10-setops.conf

View file

@ -1,6 +1,6 @@
# web
Couche applicative web Chezlepro, distincte de l'edge `serveur_nginx`.
Couche applicative web, distincte de l'edge `serveur_nginx`.
- frontaux : présentation web (UI, rendu, assets), groupe `serveur_web_frontal` ;
- dorsaux : application web (API, traitement), groupe `serveur_web_dorsal`.

View file

@ -1041,7 +1041,7 @@ HTML = r"""<!doctype html>
<label class="champ"><span>Hôte (VM)</span><select onchange="definirApplication(${i}, 'hote', this.value)">${optHote(a.hote)}</select></label>
<label class="champ"><span>Port</span><input type="number" value="${echapper(a.port)}" placeholder="3000" oninput="definirApplication(${i}, 'port', this.value)"></label>
<label class="champ"><span>Requiert (applis)</span><input value="${echapper(a.requiert)}" placeholder="pg-principal, …" oninput="definirApplication(${i}, 'requiert', this.value)"></label>
<label class="champ"><span>Expose (FQDN)</span><input value="${echapper(a.expose)}" placeholder="forge.alliance-boreale.ca" oninput="definirApplication(${i}, 'expose', this.value)"></label>
<label class="champ"><span>Expose (FQDN)</span><input value="${echapper(a.expose)}" placeholder="forge.exemple.ca" oninput="definirApplication(${i}, 'expose', this.value)"></label>
<button type="button" class="danger" title="Retirer" onclick="retirerApplication(${i})"></button>
<div class="dsn">${resume}</div>
</div>`;
@ -1108,8 +1108,8 @@ HTML = r"""<!doctype html>
<label class="champ"><span>Serveur (fonction-NN)</span><input value="${echapper(s.nom)}" placeholder="web-frontal-03" oninput="definirServeur(${i}, 'nom', this.value)"></label>
<label class="champ"><span>Fonction</span><select onchange="definirServeur(${i}, 'fonction', this.value)">${optFonction(s.fonction)}</select></label>
<label class="champ"><span>État</span><select onchange="definirServeur(${i}, 'etat', this.value)">${optEtat(s.etat)}</select></label>
<label class="champ"><span>Nœud</span><input value="${echapper(s.noeud)}" placeholder="asgard" oninput="definirServeur(${i}, 'noeud', this.value)"></label>
<label class="champ"><span>Stockage</span><input value="${echapper(s.stockage)}" placeholder="TrueNAS" oninput="definirServeur(${i}, 'stockage', this.value)"></label>
<label class="champ"><span>Nœud</span><input value="${echapper(s.noeud)}" placeholder="noeud-1" oninput="definirServeur(${i}, 'noeud', this.value)"></label>
<label class="champ"><span>Stockage</span><input value="${echapper(s.stockage)}" placeholder="stockage-1" oninput="definirServeur(${i}, 'stockage', this.value)"></label>
<label class="champ"><span>Disque</span><input value="${echapper(s.disque)}" placeholder="16G" oninput="definirServeur(${i}, 'disque', this.value)"></label>
<label class="champ"><span>Mémoire</span><input type="number" value="${echapper(s.memoire)}" placeholder="2048" oninput="definirServeur(${i}, 'memoire', this.value)"></label>
<label class="champ"><span>Cœurs</span><input type="number" value="${echapper(s.coeurs)}" placeholder="2" oninput="definirServeur(${i}, 'coeurs', this.value)"></label>

View file

@ -20,26 +20,26 @@ def _inventaire_factice() -> dict:
"children": {
"hotes_planifies": {
"hosts": {
"data-01": {
"ansible_host": "10.1.13.11",
"app-01": {
"ansible_host": "10.0.2.11",
"ansible_user": "ansible",
"proxmox_cidr": 24,
"proxmox_coeurs": 4,
"proxmox_disque_taille": "160G",
"proxmox_memoire": 2048,
"proxmox_noeud": "asgard",
"proxmox_passerelle": "10.1.13.1",
"proxmox_stockage": "TrueNAS",
"proxmox_noeud": "noeud-a",
"proxmox_passerelle": "10.0.2.1",
"proxmox_stockage": "stockage-a",
"proxmox_vlan": 13,
"proxmox_vmid": 93101,
},
# collab-01 : sans proxmox_noeud (champ optionnel).
"collab-01": {
"ansible_host": "10.1.15.21",
# app-02 : sans proxmox_noeud (champ optionnel).
"app-02": {
"ansible_host": "10.0.2.21",
"proxmox_cidr": 24,
"proxmox_disque_taille": "16G",
"proxmox_passerelle": "10.1.15.1",
"proxmox_stockage": "TrueNAS",
"proxmox_passerelle": "10.0.2.1",
"proxmox_stockage": "stockage-a",
"proxmox_vlan": 15,
"proxmox_vmid": 95201,
},
@ -47,34 +47,34 @@ def _inventaire_factice() -> dict:
"incomplet-01": {
"proxmox_vmid": 99901,
"proxmox_cidr": 24,
"proxmox_passerelle": "10.1.99.1",
"proxmox_passerelle": "10.0.2.1",
"proxmox_vlan": 99,
},
}
},
"serveur_postgresql": {"hosts": {"data-01": {}}},
"serveur_postgresql": {"hosts": {"app-01": {}}},
}
}
}
def test_hote_complet_avec_noeud() -> None:
lignes = parametres_proxmox_hote(_inventaire_factice(), "data-01")
lignes = parametres_proxmox_hote(_inventaire_factice(), "app-01")
attendu = {
"SETOPS_VMID='93101'",
"SETOPS_IP='10.1.13.11'",
"SETOPS_IP='10.0.2.11'",
"SETOPS_CIDR='24'",
"SETOPS_PASSERELLE='10.1.13.1'",
"SETOPS_PASSERELLE='10.0.2.1'",
"SETOPS_VLAN='13'",
"SETOPS_STOCKAGE='TrueNAS'",
"SETOPS_STOCKAGE='stockage-a'",
"SETOPS_DISQUE='160G'",
"SETOPS_NOEUD='asgard'",
"SETOPS_NOEUD='noeud-a'",
}
assert set(lignes) == attendu, lignes
def test_hote_sans_noeud_emet_noeud_vide() -> None:
lignes = parametres_proxmox_hote(_inventaire_factice(), "collab-01")
lignes = parametres_proxmox_hote(_inventaire_factice(), "app-02")
assert "SETOPS_NOEUD=''" in lignes, lignes
assert "SETOPS_VMID='95201'" in lignes, lignes