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:
parent
867e2f8cdc
commit
4037eafb63
7 changed files with 207 additions and 109 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue