diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eccd9a..780451a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ## 2026-06-30 ### Ajouté +- **Doc `docs/multi-instances.md`** : cadrage « un moteur, N écosystèmes » — l'instance + comme dépôt autonome, la bascule, l'isolation, et le socle multi-tenant. - **Bascule d'instance (`make instance-utiliser NOM=…`).** Repointe le symlink `instance` vers un autre dépôt d'instance (prod ↔ bac à sable) ; `make instance-courante` affiche l'instance montée. Permet d'exploiter plusieurs diff --git a/docs/multi-instances.md b/docs/multi-instances.md new file mode 100644 index 0000000..8ed4bad --- /dev/null +++ b/docs/multi-instances.md @@ -0,0 +1,94 @@ +# Multi-instances — un moteur, N écosystèmes + +Set-OPS sépare **le moteur** (ce dépôt : rôles, playbooks, scripts, GUI) de **l'instance** +(un dépôt distinct : le plan d'un écosystème + son inventaire généré + ses secrets). Un +seul moteur pilote **autant d'instances que voulu**. + +> « lab vs prod » n'est qu'un cas particulier : ce sont **deux instances**. Le même +> mécanisme sert un **bac à sable**, une **production**, ou les **écosystèmes de +> plusieurs tenants** — c'est le socle multi-tenant souverain. + +## Une instance = un écosystème autonome + +Chaque instance est un dépôt séparé, monté dans le moteur par symlink (`instance →`). +Elle possède **tout ce qui lui est propre** : + +``` +/ +├── plan/ ← la « méta-classe » (cf. meta-classe.md) +│ ├── nomenclature.yml réseau, VLAN, fonctions +│ ├── serveurs.yml VM = fonction + état + overrides +│ ├── applications.yml +│ ├── bases-donnees.yml +│ └── domaines.yml +└── inventories/principal/ ← un seul inventaire par instance + ├── hosts.yml généré (make instancier-appliquer) + └── group_vars/ + ├── all/ + │ ├── 00-instance.yml setops_plan_dir, setops_production + │ ├── 10-intrants.yml identité (domaine_interne, fuseau) + │ └── vault.yml 🔒 voûte UNIQUE de l'instance (chiffrée) + ├── proxmox.yml cible Proxmox de l'instance + └── modeles_vm.yml construction du golden template +``` + +Isolation **totale** entre instances : plan, inventaire, **voûte**, **identité** +(`domaine_interne`), réseau (`supernet`) et **cible Proxmox** distincts. Une instance +ne peut pas toucher l'infra d'une autre. + +## Choisir l'instance active + +Le moteur lit la variable `SETOPS_INSTANCE` (par défaut le symlink `instance`). + +```bash +make instance-courante # quelle instance est montée ? +make instance-utiliser NOM=OPS-Chezlepro # bascule sur la production +make instance-utiliser NOM=OPS-Chezlepro-lab # bascule sur le bac à sable +``` + +Sans toucher au symlink (utile en CI ou pour du parallèle) : + +```bash +make inventaire-ui SETOPS_INSTANCE=../OPS-ClientX +# ou viser un inventaire précis : +make deployer SETOPS_INVENTAIRE=../OPS-ClientX/inventories/principal/hosts.yml HOTE=… +``` + +L'inventaire est détecté de façon **rétro-compatible** : `principal` > `production` > +`lab` (les anciennes instances à double inventaire continuent de marcher). + +## `setops_production` — un attribut, pas une catégorie + +Le déploiement réel est permis sur **toute instance** (un bac à sable déploie sur *son* +infra). Le drapeau `setops_production` (dans `group_vars/all/`) ne **bloque** rien : il +marque la PRODUCTION pour exiger une **confirmation renforcée** au déploiement (badge +rouge « PROD », bouton Déployer rouge, re-saisie du nom d'hôte). Une instance bac à +sable met `false` et affiche « bac à sable ». + +## Créer une nouvelle instance + +1. Créer un dépôt d'instance frère de `Set-OPS-public/` (ex. `../OPS-ClientX`), avec la + structure ci-dessus. Le plus simple : copier un modèle de `exemples/modeles/` ou + l'instance bac à sable comme point de départ. +2. Régler l'identité (`10-intrants.yml` : domaine **distinct**), le réseau + (`nomenclature.yml` : `supernet` **distinct**) et la cible Proxmox (`proxmox.yml`). +3. Créer la voûte unique depuis le gabarit (cf. [`config-proxmox.md`](config-proxmox.md)) : + `cp exemples/vault.exemple.yml …/group_vars/all/vault.yml` puis `ansible-vault encrypt`. +4. `make instance-utiliser NOM=OPS-ClientX` puis `make instancier-appliquer`, + `make inventaire-ui`. + +## Multi-tenant + +Chaque **tenant** est simplement une instance de plus. Un client = +`make instance-utiliser NOM=OPS-`, tout son écosystème instancié par le même +moteur, isolé. C'est la base concrète de la **portabilité des tenants**. + +> Garde-fou de positionnement : si le nombre d'instances explose, le besoin d'un +> **registre** (lister/choisir, IPAM, secrets centralisés) relève d'outils établis +> (NetBox, AWX, un coffre type Vault HashiCorp) **à adopter aux seuils**, pas à +> réimplémenter dans le moteur. Cf. [`positionnement.md`](positionnement.md). + +## Voir aussi +- [`meta-classe.md`](meta-classe.md) — le plan d'une instance instancie sa flotte. +- [`config-proxmox.md`](config-proxmox.md) — voûte unique + cible Proxmox par instance. +- [`intrants-communs.md`](intrants-communs.md) — intrants de base d'une instance.