Modèle integral rafraîchi : 6 zones, fonctions éprouvées, VMID ip-miroir, nouveaux intrants

Régénéré depuis le cas prouvé (Technolibre/lab), rendu générique (exemple.internal,
index à remplacer). 12 VM en 6 zones de sécurité, vmid_schema: ip-miroir, intrants
fuseau_horaire/organisation/identite_realm. Prouvé (dérivation + valider_serveurs).
README réécrit (tableau des zones, procédure d'instanciation).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-05 01:04:29 -04:00
parent 867e2f8cdc
commit 4037eafb63
7 changed files with 207 additions and 109 deletions

View file

@ -1,5 +1,27 @@
# Modele : integral # Modèle : integral
Ecosysteme integral (services implementes) : socle + donnees + identite + forge + observabilite + web. Écosystème souverain **complet et éprouvé** — le socle de référence pour un nouveau tenant.
11 VM. Renseignez `domaine_interne`, `plan/domaines.yml` et `plan/nomenclature.yml` (supernet), puis generez (voir `exemples/modeles/README.md`). **12 VM** réparties en **6 zones de sécurité** (un /24 + VLAN chacune) :
| Zone | VLAN | Fonctions |
|---|---|---|
| Frontière | 16 | infra-edge (nginx), edge-mta (Postfix/rspamd) |
| Identité | 17 | id-ldap (OpenLDAP), id-sso (Keycloak) |
| Données | 18 | data-sql (PostgreSQL/Redis), sauvegarde (restic) |
| Services-infra | 19 | infra-dns (PowerDNS), infra-pki (step-ca), infra-mail (Dovecot) |
| Observabilité | 20 | obs (Prometheus/Loki/Grafana), sup (Icinga + BPM) |
| Applications | 21 | forge (Forgejo) |
## Pour instancier un tenant
1. Copier ce dépôt-modèle vers `OPS-<votre-tenant>` (dépôt d'instance autonome).
2. Adapter :
- `plan/nomenclature.yml` : **`index`** (identifiant unique du tenant → préfixe VMID + supernet `10.(10+index).0.0/16`) et les `sous_reseau`/`passerelle` des 6 zones.
- `inventories/production/group_vars/all.yml` : `domaine_interne`, `fuseau_horaire`, `organisation`, `identite_realm`.
- `plan/domaines.yml` et les FQDN d'`expose` dans `plan/applications.yml`.
3. Pointer le sélecteur (`instance → OPS-<tenant>`) puis `make instancier`.
## Dérivations automatiques
Le nom d'un serveur (`data-sql-01`) + la nomenclature suffisent : **VMID, IP, VLAN, passerelle** sont dérivés — rien à saisir. Le VMID suit le schéma **`ip-miroir`** (9 chiffres `I·VVV·HHH·NN` = index·VLAN·octet-hôte·séquence : il *contient* l'IP + le tenant).
Voir `exemples/modeles/README.md` pour le mécanisme général.

View file

@ -1,3 +1,8 @@
--- ---
domaine_interne: "exemple.internal" # <- VOTRE domaine DNS interne # MODÈLE integral — intrants d'identité de l'instance. À adapter à VOTRE tenant.
domaine_interne: "exemple.internal" # <- VOTRE domaine DNS interne (.internal)
fuseau_horaire: "America/Toronto" # <- fuseau de l'organisation
organisation: "Exemple" # <- nom (annuaire LDAP, certificats)
identite_realm: "exemple" # <- realm SSO Keycloak de ce tenant
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan" setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,57 +1,76 @@
# MODÈLE integral — applications (application = entité pivot).
# Adapter les FQDN d'exposition à VOTRE domaine interne.
--- ---
applications: applications:
step_ca: dovecot:
groupe: serveur_step_ca groupe: serveur_dovecot
hote: infra-pki-01
nginx:
groupe: serveur_nginx
hote: infra-edge-01
sendmail:
groupe: serveur_postfix
hote: infra-mail-01 hote: infra-mail-01
powerdns: postfix:
groupe: serveur_powerdns groupe: serveur_postfix
hote: infra-dns-01 hote: edge-mta-01
liens:
- vers: dovecot
role: mailstore
- vers: rspamd
role: milter
rspamd:
groupe: serveur_rspamd
hote: edge-mta-01
postgresql: postgresql:
groupe: serveur_postgresql groupe: serveur_postgresql
hote: data-01 hote: data-sql-01
port: 5432
redis: redis:
groupe: serveur_redis groupe: serveur_redis
hote: data-01 hote: data-sql-01
openldap: backup:
groupe: serveur_openldap groupe: serveur_backup
hote: idm-01 hote: backup-01
keycloak: keycloak:
groupe: serveur_keycloak groupe: serveur_keycloak
hote: idm-01 hote: id-sso-01
port: 8080 port: 8080
expose: expose:
- auth.exemple.ca - keycloak.exemple.internal
forgejo:
groupe: serveur_forgejo
hote: forge-01
port: 3000
expose:
- forge.exemple.ca
prometheus:
groupe: serveur_prometheus
hote: obs-01
loki: loki:
groupe: serveur_loki groupe: serveur_loki
hote: obs-01 hote: obs-01
prometheus:
groupe: serveur_prometheus
hote: obs-01
grafana: grafana:
groupe: serveur_grafana groupe: serveur_grafana
hote: obs-01 hote: obs-01
port: 3000 port: 3000
expose: expose:
- grafana.exemple.ca - grafana.exemple.internal
forgejo:
groupe: serveur_forgejo
hote: forge-01
port: 3000
expose:
- forge.exemple.internal
icinga: icinga:
groupe: serveur_icinga groupe: serveur_icinga
hote: mon-01 hote: sup-01
web_frontal: icingaweb2:
groupe: serveur_web_frontal groupe: serveur_icingaweb2
hote: web-frontal-01 hote: sup-01
web_dorsal: port: 8080
groupe: serveur_web_dorsal oauth2_proxy:
hote: web-dorsal-01 groupe: serveur_oauth2_proxy
hote: sup-01
port: 4180
expose:
- icinga.exemple.internal
openldap:
groupe: serveur_openldap
hote: id-ldap-01
step_ca:
groupe: serveur_step_ca
hote: infra-pki-01
nginx:
groupe: serveur_nginx
hote: infra-edge-01
powerdns:
groupe: serveur_powerdns
hote: infra-dns-01

View file

@ -1,13 +1,14 @@
# MODÈLE integral — bases de données. 'secret' nomme une variable Ansible Vault.
--- ---
serveurs_bd: serveurs_bd:
pg-principal: sql-01:
type: postgres type: postgres
hote: 10.10.13.11 hote: data-sql-01
port: 5432 port: 5432
groupe: serveur_postgresql groupe: serveur_postgresql
bases_donnees: bases_donnees:
keycloak: keycloak:
serveur: pg-principal serveur: sql-01
base: keycloak base: keycloak
proprietaire: keycloak proprietaire: keycloak
secret: vault_bd_keycloak secret: vault_bd_keycloak
@ -15,7 +16,7 @@ bases_donnees:
portee: groupe portee: groupe
usage: principale usage: principale
forgejo: forgejo:
serveur: pg-principal serveur: sql-01
base: forgejo base: forgejo
proprietaire: forgejo proprietaire: forgejo
secret: vault_bd_forgejo secret: vault_bd_forgejo
@ -23,7 +24,7 @@ bases_donnees:
portee: groupe portee: groupe
usage: principale usage: principale
icingadb: icingadb:
serveur: pg-principal serveur: sql-01
base: icingadb base: icingadb
proprietaire: icingadb proprietaire: icingadb
secret: vault_bd_icingadb secret: vault_bd_icingadb

View file

@ -1,7 +1,15 @@
--- ---
# MODÈLE integral — domaines. Adapter à VOS domaines public/interne.
domaines_publics: domaines_publics:
exemple.ca: exemple.ca:
autorite: primaire-cache autorite: primaire-cache
edge: serveur_nginx edge: serveur_nginx
secondaires: [] secondaires: []
dnssec: false dnssec: false
# Domaine interne : parent des expositions derrière l'edge nginx interne.
# Utiliser .internal (et non .local, réservé au mDNS).
exemple.internal:
autorite: interne
edge: serveur_nginx
secondaires: []
dnssec: false

View file

@ -1,67 +1,68 @@
--- ---
supernet: 10.10.0.0/16 # MODÈLE « integral » — écosystème souverain COMPLET (12 VM).
# Copier ce dépôt-modèle vers OPS-<votre-tenant>, puis adapter index / supernet / domaine.
#
# index : identifiant UNIQUE du tenant dans la fédération (1, 2, 3…).
# Détermine le préfixe VMID (schéma ip-miroir) et le supernet 10.(10+index).0.0/16.
# ⚠️ REMPLACER par l'index de VOTRE tenant (évite toute collision IP/VMID).
# vmid_schema: ip-miroir → VMID 9 chiffres I·VVV·HHH·NN (index·VLAN·octet-hôte·séquence) :
# le VMID contient littéralement l'IP + le tenant. Lecture directe.
index: 1
supernet: 10.11.0.0/16
vmid_schema: ip-miroir
cidr_hote: 24 cidr_hote: 24
reservations: reservations:
passerelle: 1 passerelle: 1
reserve_min: 2 reserve_min: 2
reserve_max: 9 reserve_max: 9
# 6 ZONES de sécurité, un /24 + VLAN chacune (VLAN = 3e octet), dans 10.(10+index).16.0/20.
categories: categories:
1: 1:
libelle: Fondations libelle: Frontiere
vlan: 11 vlan: 16
sous_reseau: 10.10.11.0/24 sous_reseau: 10.11.16.0/24
passerelle: 10.10.11.1 passerelle: 10.11.16.1
2: 2:
libelle: Identite libelle: Identite
vlan: 12 vlan: 17
sous_reseau: 10.10.12.0/24 sous_reseau: 10.11.17.0/24
passerelle: 10.10.12.1 passerelle: 10.11.17.1
3: 3:
libelle: Donnees libelle: Donnees
vlan: 13 vlan: 18
sous_reseau: 10.10.13.0/24 sous_reseau: 10.11.18.0/24
passerelle: 10.10.13.1 passerelle: 10.11.18.1
4: 4:
libelle: Observabilite libelle: Services-infra
vlan: 14 vlan: 19
sous_reseau: 10.10.14.0/24 sous_reseau: 10.11.19.0/24
passerelle: 10.10.14.1 passerelle: 10.11.19.1
5: 5:
libelle: Observabilite
vlan: 20
sous_reseau: 10.11.20.0/24
passerelle: 10.11.20.1
6:
libelle: Applications libelle: Applications
vlan: 15 vlan: 21
sous_reseau: 10.10.15.0/24 sous_reseau: 10.11.21.0/24
passerelle: 10.10.15.1 passerelle: 10.11.21.1
fonctions: fonctions:
data: # Zone 1 — Frontière
categorie: 3 infra-edge: { categorie: 1, service: 1 }
service: 1 edge-mta: { categorie: 1, service: 2 }
forge: # Zone 2 — Identité
categorie: 5 id-ldap: { categorie: 2, service: 1 }
service: 1 id-sso: { categorie: 2, service: 2 }
idm: # Zone 3 — Données
categorie: 2 data-sql: { categorie: 3, service: 1 }
service: 1 sauvegarde: { categorie: 3, service: 2 }
infra-dns: # Zone 4 — Services-infra
categorie: 1 infra-dns: { categorie: 4, service: 1 }
service: 4 infra-pki: { categorie: 4, service: 2 }
infra-edge: infra-mail: { categorie: 4, service: 3 }
categorie: 1 # Zone 5 — Observabilité
service: 2 obs: { categorie: 5, service: 1 }
infra-mail: sup: { categorie: 5, service: 2 }
categorie: 1 # Zone 6 — Applications
service: 3 forge: { categorie: 6, service: 1 }
infra-pki:
categorie: 1
service: 1
mon:
categorie: 4
service: 4
obs:
categorie: 4
service: 1
web-dorsal:
categorie: 5
service: 4
web-frontal:
categorie: 5
service: 3

View file

@ -1,35 +1,77 @@
# MODÈLE integral — registre des serveurs (12 VM). etat: planifie (template).
# VMID/IP/VLAN/passerelle DERIVES de la fonction via plan/nomenclature.yml.
--- ---
serveurs: serveurs:
infra-pki-01: infra-pki-01:
fonction: infra-pki fonction: infra-pki
etat: planifie etat: planifie
disque: 32G
integrations:
- client_backup
infra-edge-01: infra-edge-01:
fonction: infra-edge fonction: infra-edge
etat: planifie etat: planifie
integrations:
- client_pki
infra-mail-01: infra-mail-01:
fonction: infra-mail fonction: infra-mail
etat: planifie etat: planifie
integrations:
- client_pki
- client_backup
infra-dns-01: infra-dns-01:
fonction: infra-dns fonction: infra-dns
etat: planifie etat: planifie
data-01: disque: 40G
fonction: data integrations:
- client_pki
id-ldap-01:
fonction: id-ldap
etat: planifie etat: planifie
idm-01: integrations:
fonction: idm - client_pki
- client_backup
- client_metrique
- client_journal
- client_smtp
id-sso-01:
fonction: id-sso
etat: planifie etat: planifie
forge-01: integrations:
fonction: forge - client_pki
data-sql-01:
fonction: data-sql
etat: planifie etat: planifie
integrations:
- client_pki
- client_unbound
- client_backup
- client_metrique
- client_journal
- client_smtp
backup-01:
fonction: sauvegarde
etat: planifie
disque: 64G
obs-01: obs-01:
fonction: obs fonction: obs
etat: planifie etat: planifie
mon-01: integrations:
fonction: mon - client_pki
- client_metrique
- client_journal
- client_smtp
sup-01:
fonction: sup
etat: planifie etat: planifie
web-frontal-01: integrations:
fonction: web-frontal - client_pki
etat: planifie forge-01:
web-dorsal-01: fonction: forge
fonction: web-dorsal
etat: planifie etat: planifie
integrations:
- client_pki
- client_backup
- client_metrique
- client_journal
- client_smtp