diff --git a/exemples/modeles/integral/README.md b/exemples/modeles/integral/README.md index c33e984..8b2f666 100644 --- a/exemples/modeles/integral/README.md +++ b/exemples/modeles/integral/README.md @@ -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-` (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-`) 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. diff --git a/exemples/modeles/integral/inventories/production/group_vars/all.yml b/exemples/modeles/integral/inventories/production/group_vars/all.yml index 92ed206..742162d 100644 --- a/exemples/modeles/integral/inventories/production/group_vars/all.yml +++ b/exemples/modeles/integral/inventories/production/group_vars/all.yml @@ -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" diff --git a/exemples/modeles/integral/plan/applications.yml b/exemples/modeles/integral/plan/applications.yml index 66105a9..0e0a50b 100644 --- a/exemples/modeles/integral/plan/applications.yml +++ b/exemples/modeles/integral/plan/applications.yml @@ -1,57 +1,76 @@ +# MODÈLE integral — applications (application = entité pivot). +# Adapter les FQDN d'exposition à VOTRE domaine interne. --- applications: - step_ca: - groupe: serveur_step_ca - hote: infra-pki-01 - nginx: - groupe: serveur_nginx - hote: infra-edge-01 - sendmail: - groupe: serveur_postfix + dovecot: + groupe: serveur_dovecot hote: infra-mail-01 - powerdns: - groupe: serveur_powerdns - hote: infra-dns-01 + postfix: + groupe: serveur_postfix + hote: edge-mta-01 + liens: + - vers: dovecot + role: mailstore + - vers: rspamd + role: milter + rspamd: + groupe: serveur_rspamd + hote: edge-mta-01 postgresql: groupe: serveur_postgresql - hote: data-01 - port: 5432 + hote: data-sql-01 redis: groupe: serveur_redis - hote: data-01 - openldap: - groupe: serveur_openldap - hote: idm-01 + hote: data-sql-01 + backup: + groupe: serveur_backup + hote: backup-01 keycloak: groupe: serveur_keycloak - hote: idm-01 + hote: id-sso-01 port: 8080 expose: - - auth.exemple.ca - forgejo: - groupe: serveur_forgejo - hote: forge-01 - port: 3000 - expose: - - forge.exemple.ca - prometheus: - groupe: serveur_prometheus - hote: obs-01 + - keycloak.exemple.internal loki: groupe: serveur_loki hote: obs-01 + prometheus: + groupe: serveur_prometheus + hote: obs-01 grafana: groupe: serveur_grafana hote: obs-01 port: 3000 expose: - - grafana.exemple.ca + - grafana.exemple.internal + forgejo: + groupe: serveur_forgejo + hote: forge-01 + port: 3000 + expose: + - forge.exemple.internal icinga: groupe: serveur_icinga - hote: mon-01 - web_frontal: - groupe: serveur_web_frontal - hote: web-frontal-01 - web_dorsal: - groupe: serveur_web_dorsal - hote: web-dorsal-01 + hote: sup-01 + icingaweb2: + groupe: serveur_icingaweb2 + hote: sup-01 + port: 8080 + oauth2_proxy: + 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 diff --git a/exemples/modeles/integral/plan/bases-donnees.yml b/exemples/modeles/integral/plan/bases-donnees.yml index a816f74..d5ad529 100644 --- a/exemples/modeles/integral/plan/bases-donnees.yml +++ b/exemples/modeles/integral/plan/bases-donnees.yml @@ -1,13 +1,14 @@ +# MODÈLE integral — bases de données. 'secret' nomme une variable Ansible Vault. --- serveurs_bd: - pg-principal: + sql-01: type: postgres - hote: 10.10.13.11 + hote: data-sql-01 port: 5432 groupe: serveur_postgresql bases_donnees: keycloak: - serveur: pg-principal + serveur: sql-01 base: keycloak proprietaire: keycloak secret: vault_bd_keycloak @@ -15,7 +16,7 @@ bases_donnees: portee: groupe usage: principale forgejo: - serveur: pg-principal + serveur: sql-01 base: forgejo proprietaire: forgejo secret: vault_bd_forgejo @@ -23,7 +24,7 @@ bases_donnees: portee: groupe usage: principale icingadb: - serveur: pg-principal + serveur: sql-01 base: icingadb proprietaire: icingadb secret: vault_bd_icingadb diff --git a/exemples/modeles/integral/plan/domaines.yml b/exemples/modeles/integral/plan/domaines.yml index 367ea72..fb80929 100644 --- a/exemples/modeles/integral/plan/domaines.yml +++ b/exemples/modeles/integral/plan/domaines.yml @@ -1,7 +1,15 @@ --- +# MODÈLE integral — domaines. Adapter à VOS domaines public/interne. domaines_publics: exemple.ca: autorite: primaire-cache edge: serveur_nginx secondaires: [] 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 diff --git a/exemples/modeles/integral/plan/nomenclature.yml b/exemples/modeles/integral/plan/nomenclature.yml index 45f4c60..9d11f00 100644 --- a/exemples/modeles/integral/plan/nomenclature.yml +++ b/exemples/modeles/integral/plan/nomenclature.yml @@ -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-, 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 reservations: passerelle: 1 reserve_min: 2 reserve_max: 9 +# 6 ZONES de sécurité, un /24 + VLAN chacune (VLAN = 3e octet), dans 10.(10+index).16.0/20. categories: 1: - libelle: Fondations - vlan: 11 - sous_reseau: 10.10.11.0/24 - passerelle: 10.10.11.1 + libelle: Frontiere + vlan: 16 + sous_reseau: 10.11.16.0/24 + passerelle: 10.11.16.1 2: libelle: Identite - vlan: 12 - sous_reseau: 10.10.12.0/24 - passerelle: 10.10.12.1 + vlan: 17 + sous_reseau: 10.11.17.0/24 + passerelle: 10.11.17.1 3: libelle: Donnees - vlan: 13 - sous_reseau: 10.10.13.0/24 - passerelle: 10.10.13.1 + vlan: 18 + sous_reseau: 10.11.18.0/24 + passerelle: 10.11.18.1 4: - libelle: Observabilite - vlan: 14 - sous_reseau: 10.10.14.0/24 - passerelle: 10.10.14.1 + libelle: Services-infra + vlan: 19 + sous_reseau: 10.11.19.0/24 + passerelle: 10.11.19.1 5: + libelle: Observabilite + vlan: 20 + sous_reseau: 10.11.20.0/24 + passerelle: 10.11.20.1 + 6: libelle: Applications - vlan: 15 - sous_reseau: 10.10.15.0/24 - passerelle: 10.10.15.1 + vlan: 21 + sous_reseau: 10.11.21.0/24 + passerelle: 10.11.21.1 fonctions: - data: - categorie: 3 - service: 1 - forge: - categorie: 5 - service: 1 - idm: - categorie: 2 - service: 1 - infra-dns: - categorie: 1 - service: 4 - infra-edge: - categorie: 1 - service: 2 - infra-mail: - categorie: 1 - service: 3 - 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 + # Zone 1 — Frontière + infra-edge: { categorie: 1, service: 1 } + edge-mta: { categorie: 1, service: 2 } + # Zone 2 — Identité + id-ldap: { categorie: 2, service: 1 } + id-sso: { categorie: 2, service: 2 } + # Zone 3 — Données + data-sql: { categorie: 3, service: 1 } + sauvegarde: { categorie: 3, service: 2 } + # Zone 4 — Services-infra + infra-dns: { categorie: 4, service: 1 } + infra-pki: { categorie: 4, service: 2 } + infra-mail: { categorie: 4, service: 3 } + # Zone 5 — Observabilité + obs: { categorie: 5, service: 1 } + sup: { categorie: 5, service: 2 } + # Zone 6 — Applications + forge: { categorie: 6, service: 1 } diff --git a/exemples/modeles/integral/plan/serveurs.yml b/exemples/modeles/integral/plan/serveurs.yml index 6e038f3..abd28b4 100644 --- a/exemples/modeles/integral/plan/serveurs.yml +++ b/exemples/modeles/integral/plan/serveurs.yml @@ -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: infra-pki-01: fonction: infra-pki etat: planifie + disque: 32G + integrations: + - client_backup infra-edge-01: fonction: infra-edge etat: planifie + integrations: + - client_pki infra-mail-01: fonction: infra-mail etat: planifie + integrations: + - client_pki + - client_backup infra-dns-01: fonction: infra-dns etat: planifie - data-01: - fonction: data + disque: 40G + integrations: + - client_pki + id-ldap-01: + fonction: id-ldap etat: planifie - idm-01: - fonction: idm + integrations: + - client_pki + - client_backup + - client_metrique + - client_journal + - client_smtp + id-sso-01: + fonction: id-sso etat: planifie - forge-01: - fonction: forge + integrations: + - client_pki + data-sql-01: + fonction: data-sql 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: fonction: obs etat: planifie - mon-01: - fonction: mon + integrations: + - client_pki + - client_metrique + - client_journal + - client_smtp + sup-01: + fonction: sup etat: planifie - web-frontal-01: - fonction: web-frontal - etat: planifie - web-dorsal-01: - fonction: web-dorsal + integrations: + - client_pki + forge-01: + fonction: forge etat: planifie + integrations: + - client_pki + - client_backup + - client_metrique + - client_journal + - client_smtp