Decouplage moteur/instance Phase 3 (modele A) : deux depots

Le contenu de instance/ part dans un depot d'instance dedie (OPS-Chezlepro).
Set-OPS devient le moteur pur (aucune donnee Chezlepro). L'instance est
montee via un symlink instance -> ../OPS-Chezlepro (gitignore) ; le defaut
SETOPS_INSTANCE=instance la resout sans config. Le moteur regenere
hosts.yml DANS le depot d'instance.

.ansible-lint exclut instance/. Valide : diff vide, ansible-lint 0 echec,
inventaire-verifier, instancier-appliquer. Modele A (freres) jusqu'a
preuve du concept ; modele B (sous-module) pour la meute ensuite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-24 09:49:49 -04:00
parent 3b7f3098f2
commit 780b1e6b24
32 changed files with 31 additions and 870 deletions

View file

@ -3,4 +3,4 @@
# genere par safe_dump. Les regles yaml d'ansible-lint ne s'y appliquent pas.
exclude_paths:
- docs/
- instance/plan/
- instance/

4
.gitignore vendored
View file

@ -1,6 +1,6 @@
*.retry
# Inventaire genere depuis le plan (artefact, make instancier ; pas une source).
instance/inventories/*/hosts.genere.yml
# Instance (plan + inventaire) : depot separe, monte ici par symlink (modele A).
/instance
.vault-pass
facts_cache/
.ansible/

View file

@ -3,6 +3,7 @@
## 2026-06-23
### Modifié
- **Découpage moteur/instance — Phase 3 (modèle A) : deux dépôts.** Le contenu de `instance/` (plan + inventaire) part dans un **dépôt d'instance dédié** (`OPS-Chezlepro` pour Chezlepro, sur la forge). `Set-OPS` devient le **moteur pur** (rôles, scripts, playbooks, guides, exemples). L'instance est **montée via un symlink** `instance -> ../OPS-Chezlepro` (gitignoré) : le défaut `SETOPS_INSTANCE=instance` la résout sans configuration. Le moteur lit le plan et **régénère `hosts.yml` dans le dépôt d'instance**. `.ansible-lint` exclut `instance/`. Validé : diff vide, `ansible-lint` 0 échec, `make inventaire-verifier`, `instancier-appliquer`. **Modèle A (dépôts frères)** retenu jusqu'à preuve du concept ; le **modèle B (moteur en sous-module)** pour la meute viendra ensuite. Le moteur ne contient plus aucune donnée Chezlepro.
- **Découpage moteur/instance — Phase 2b : sortir l'inventaire dans `instance/inventories/`.** L'inventaire (hôtes générés, `group_vars`, vault) quitte `inventories/` pour `instance/inventories/`. Suivent : `ansible.cfg`, le `Makefile` (`export SETOPS_INSTANCE ?= instance`, chemins dérivés), les scripts (`INSTANCE / "inventories/..."`), `config_proxmox.py`, `.gitignore`. Les docs primaires (`AGENTS.md`, `README.md`, `docs/plan-et-generation.md`, `docs/architecture-set-ops.md`) reflètent le layout `instance/`. Non destructif : diff vide, `ansible-lint` 0 échec, `make inventaire-verifier` OK. *(Docs secondaires à rafraîchir ; Phase 3 : deux dépôts.)*
- **Découpage moteur/instance — Phase 2a : sortir le plan dans `instance/plan/`.** Les 5 registres (`serveurs`, `applications`, `bases-donnees`, `domaines`, `nomenclature`) quittent `docs/` pour `instance/plan/`. Les scripts les localisent via **`SETOPS_INSTANCE`** (variable d'env, défaut `<dépôt>/instance`) ; les rôles/playbooks via **`setops_plan_dir`** (group_vars d'instance). `docs/` ne garde que les guides `.md` + `dependances-groupes.yml` (moteur). `.ansible-lint` exclut `instance/plan/` (registres de données). Non destructif : diff vide, `ansible-lint` 0 échec, `include_vars` via `setops_plan_dir` testé. *(Phase 2b : sortir l'inventaire ; Phase 3 : deux dépôts.)*
- **Découpage moteur/instance — Phase 1b : neutraliser la marque `chezlepro`.** Les noms de fichiers gérés par les rôles (`99-chezlepro.conf`, `chezlepro_filter`, `chezlepro-bind.conf`, `/etc/redis/chezlepro.conf`, etc.) et les 14 templates correspondants passent à la marque neutre du moteur **`setops`** (`git mv` + références `src`/`dest`). Un loup ne déploie plus de fichiers marqués « chezlepro ». Cohérence `src ↔ template` vérifiée, `ansible-lint` 0 échec, diff vide. (Les README gardent leurs exemples ; génériciser plus tard.)

View file

@ -150,3 +150,30 @@ make instancier # vérifier le diff vide
```
C'est ainsi que le plan a été initialisé sans perte, avec diff vide vérifié.
---
## 8. Moteur et instance : deux dépôts
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`).
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
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.
Pour brancher une instance (modèle A) :
```bash
cd Set-OPS
ln -s ../OPS-Chezlepro instance # ou : export SETOPS_INSTANCE=/chemin/instance
make inventaire-verifier # lit l'instance via le symlink
```
Le moteur écrit `hosts.yml` (généré) **dans le dépôt d'instance**, jamais dans le sien.

View file

@ -1,8 +0,0 @@
---
chezlepro_timezone: "America/Toronto"
# Identite de l'instance : domaine DNS interne (un autre loup met le sien).
domaine_interne: "chezlepro.internal"
# Chemin du plan de l'instance (registres). Phase 3 : ajuster si moteur externe.
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,58 +0,0 @@
---
# Variables de construction du golden template Debian 13 Proxmox.
sudo_ansible_admin_user: "ansible"
# SSH : cloud-init doit avoir injecté ciuser et clé publique avant Ansible.
ssh_baseline_password_authentication: "no"
ssh_baseline_permit_root_login: "no"
ssh_baseline_pubkey_authentication: "yes"
ssh_hardening_port: 22
ssh_hardening_password_authentication: "no"
ssh_hardening_permit_root_login: "no"
ssh_hardening_pubkey_authentication: "yes"
ssh_hardening_client_alive_interval: 300
ssh_hardening_client_alive_count_max: 2
ssh_hardening_max_auth_tries: 3
ssh_hardening_login_grace_time: "20s"
systemd_ssh_auto_disable: true
cloud_init_ssh_pwauth: false
cloud_init_manage_etc_hosts: true
cloud_init_disable_root: true
cloud_init_ssh_deletekeys: true
# Pare-feu : préparé mais non activé dans le template.
nftables_baseline_enabled: false
nftables_baseline_allow_ssh: true
nftables_baseline_allow_icmp: true
nftables_baseline_ssh_port: 22
nftables_baseline_input_policy: "drop"
nftables_baseline_forward_policy: "drop"
nftables_baseline_output_policy: "accept"
nftables_baseline_extra_tcp_ports: []
nftables_baseline_extra_udp_ports: []
fail2ban_ssh_enabled: true
fail2ban_ssh_port: 22
fail2ban_ssh_bantime: "1h"
fail2ban_ssh_findtime: "10m"
fail2ban_ssh_maxretry: 5
auditd_enabled: true
apparmor_enabled: true
sysctl_hardening_apply: true
core_dumps_disable: true
unattended_upgrades_enabled: true
unattended_upgrades_remove_unused_dependencies: true
unattended_upgrades_automatic_reboot: false
journald_system_max_use: "200M"
journald_runtime_max_use: "100M"
journald_max_retention_sec: "1month"
template_cleanup_confirm: false
template_cleanup_admin_user: "ansible"

View file

@ -1,8 +0,0 @@
---
# Copier ce fichier vers proxmox.vault.yml, puis le chiffrer avec :
# ansible-vault encrypt inventories/lab/group_vars/proxmox.vault.yml
#
# Ne jamais versionner proxmox.vault.yml.
proxmox_api_token_id: ""
proxmox_api_token_secret: ""

View file

@ -1,20 +0,0 @@
---
# Parametres non sensibles pour les operations Proxmox.
# Les secrets API doivent aller dans proxmox.vault.yml.
proxmox_api_host: asgard
proxmox_api_user: ansible@pve
proxmox_api_port: '8006'
proxmox_validate_certs: false
proxmox_clone_noeud: asgard
proxmox_clone_vmid_modele: 99999
proxmox_clone_source_nom: modeleChezlepro
proxmox_clone_stockage: TrueNAS
proxmox_clone_format: ''
proxmox_clone_complet: true
proxmox_clone_timeout: 600
proxmox_clone_disque: scsi0
proxmox_clone_interface: net0
proxmox_clone_pont: vmbr1
proxmox_clone_parefeu_interface: false
proxmox_clone_demarrer: true

View file

@ -1,23 +0,0 @@
all:
children:
modeles_vm:
hosts:
basiqueChezlepro:
ansible_host: 10.1.99.99
ansible_user: ansible
ansible_become: true
serveur_debian:
hosts: {}
serveur_durci:
hosts: {}
serveur_web_frontal:
hosts: {}
serveur_web_dorsal:
hosts: {}
hotes_proxmox:
hosts: {}

View file

@ -1,9 +0,0 @@
---
# Variables globales de production.
# Les politiques Debian communes sont dans group_vars/serveur_debian.yml.
# Identite de l'instance : domaine DNS interne (un autre loup met le sien).
domaine_interne: "chezlepro.internal"
# Chemin du plan de l'instance (registres). Phase 3 : ajuster si moteur externe.
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,11 +0,0 @@
---
# Variables de l'intégration cliente DNS.
client_dns_zone: "chezlepro.internal"
client_dns_search_domains:
- "{{ client_dns_zone }}"
# La modification du resolver est protegee. Activer ces deux variables seulement
# lorsque le serveur DNS interne et la zone ont ete verifies.
client_dns_apply: false
client_dns_confirm: false

View file

@ -1,8 +0,0 @@
---
# Conformite identite utilisateur cliente (hotes authentifiant via OpenLDAP).
client_ldap_uri: "ldap://idm-01.chezlepro.internal"
client_ldap_base_dn: "dc=chezlepro,dc=internal"
# Bind anonyme par defaut. Pour un compte de lecture dedie, definir ici
# client_ldap_bind_dn et client_ldap_bind_password ("{{ vault_ldap_sssd }}" via Vault).

View file

@ -1,11 +0,0 @@
---
# Conformite PKI cliente (tout hote devant une identite machine).
client_pki_ca_url: "https://infra-pki-01.chezlepro.internal:8443"
client_pki_provisioner: "admin@chezlepro.internal"
# Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel :
# client_pki_ca_fingerprint: "{{ vault_step_ca_fingerprint }}"
# client_pki_provisioner_password: "{{ vault_step_ca_provisioner_password }}"
# Le provisioner password est PARTAGE avec serveur_step_ca : le placer dans un
# vault partage (ex. group_vars/all/) lisible par les deux groupes.

View file

@ -1,5 +0,0 @@
---
# Conformite relais mail client (hotes relayant vers serveur_sendmail).
client_smtp_relais: "infra-mail-01.chezlepro.internal"
client_smtp_port: 25

View file

@ -1,54 +0,0 @@
---
# Variables de conformité communes aux VM Debian déployées.
sudo_ansible_admin_user: "ansible"
ssh_baseline_password_authentication: "no"
ssh_baseline_permit_root_login: "no"
ssh_baseline_pubkey_authentication: "yes"
ssh_hardening_port: 22
ssh_hardening_password_authentication: "no"
ssh_hardening_permit_root_login: "no"
ssh_hardening_pubkey_authentication: "yes"
ssh_hardening_client_alive_interval: 300
ssh_hardening_client_alive_count_max: 2
ssh_hardening_max_auth_tries: 3
ssh_hardening_login_grace_time: "20s"
systemd_ssh_auto_disable: true
cloud_init_ssh_pwauth: false
cloud_init_manage_etc_hosts: true
cloud_init_disable_root: true
cloud_init_ssh_deletekeys: true
# Pare-feu : ne pas activer globalement sans validation des règles par rôle.
nftables_baseline_enabled: false
nftables_baseline_allow_ssh: true
nftables_baseline_allow_icmp: true
nftables_baseline_ssh_port: 22
nftables_baseline_input_policy: "drop"
nftables_baseline_forward_policy: "drop"
nftables_baseline_output_policy: "accept"
nftables_baseline_extra_tcp_ports: []
nftables_baseline_extra_udp_ports: []
fail2ban_ssh_enabled: true
fail2ban_ssh_port: 22
fail2ban_ssh_bantime: "1h"
fail2ban_ssh_findtime: "10m"
fail2ban_ssh_maxretry: 5
auditd_enabled: true
apparmor_enabled: true
sysctl_hardening_apply: true
core_dumps_disable: true
unattended_upgrades_enabled: true
unattended_upgrades_remove_unused_dependencies: true
unattended_upgrades_automatic_reboot: false
journald_system_max_use: "200M"
journald_runtime_max_use: "100M"
journald_max_retention_sec: "1month"

View file

@ -1,9 +0,0 @@
---
# Conformite Forgejo (forge-01, VLAN 15).
serveur_forgejo_hostname: "forge.chezlepro.internal"
serveur_forgejo_db_host: "10.1.13.11" # data-01
# Secrets OBLIGATOIRES via Ansible Vault (vault partage pour vault_bd_forgejo) :
# serveur_forgejo_secret_key, serveur_forgejo_internal_token,
# serveur_forgejo_admin_password, vault_bd_forgejo

View file

@ -1,8 +0,0 @@
---
# Conformite Grafana (obs-01, VLAN 14).
serveur_grafana_hostname: "grafana.chezlepro.internal"
# Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel :
# serveur_grafana_admin_password: "{{ vault_grafana_admin }}"
# Convertir en dossier group_vars/serveur_grafana/ avec main.yml + vault.yml (chiffre).

View file

@ -1,8 +0,0 @@
---
# Conformite supervision Icinga (mon-01, VLAN 14).
serveur_icinga_db_host: "10.1.13.11" # data-01 (serveur_postgresql)
# Secret BD OBLIGATOIRE, a fournir via Ansible Vault (partage avec serveur_postgresql) :
# vault_bd_icingadb: "..."
# A placer dans un vault partage (ex. group_vars/all/) lisible par les deux groupes.

View file

@ -1,12 +0,0 @@
---
# Conformite Keycloak (idm-01, VLAN 12).
serveur_keycloak_hostname: "keycloak.chezlepro.internal"
serveur_keycloak_db_host: "10.1.13.11" # data-01 (serveur_postgresql)
# Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel :
# - serveur_keycloak_admin_password: "{{ vault_keycloak_admin }}" (admin bootstrap)
# - vault_bd_keycloak: "..." (mot de passe BD, partage avec serveur_postgresql)
# Convertir en dossier group_vars/serveur_keycloak/ avec main.yml (clair) + vault.yml (chiffre).
# Le secret BD (vault_bd_keycloak) doit etre lisible aussi par serveur_postgresql
# (placer dans un vault partage, ex. group_vars/all/).

View file

@ -1,9 +0,0 @@
---
# Conformite nginx / edge (infra-edge-01, VLAN 11).
# Sites de reverse proxy : a declarer ici quand un service web doit etre publie.
# L'amont pointe vers l'IP interne et le port du service (cf. nomenclature).
serveur_nginx_sites: []
# - nom: forge
# domaine: forge.chezlepro.internal
# amont: "http://10.1.15.11:3000"

View file

@ -1,11 +0,0 @@
---
# Conformite annuaire OpenLDAP (idm-01, VLAN 12).
serveur_openldap_domaine: "chezlepro.internal"
serveur_openldap_organisation: "Chezlepro Inc"
# Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel.
# Convertir en dossier group_vars/serveur_openldap/ avec :
# main.yml : serveur_openldap_admin_password: "{{ vault_openldap_admin }}"
# vault.yml : vault_openldap_admin: "..." (chiffre ansible-vault)
# Tant qu'il est absent, le role refuse de s'executer (assertion explicite).

View file

@ -1,10 +0,0 @@
---
# Conformite PostgreSQL (zone donnees, VLAN 13).
serveur_postgresql_reseaux_autorises:
- "10.1.0.0/16"
# Comptes et bases applicatifs : a declarer ici quand un service en a besoin,
# avec les mots de passe references depuis Ansible Vault (jamais en clair).
serveur_postgresql_comptes: []
serveur_postgresql_bases: []

View file

@ -1,13 +0,0 @@
---
# Variables du service DNS interne PowerDNS.
serveur_powerdns_zone: "chezlepro.internal"
serveur_powerdns_nameserver: "ns1"
serveur_powerdns_contact: "hostmaster.chezlepro.internal"
serveur_powerdns_serial: 2026062201
serveur_powerdns_inventory_groups:
- hotes_actifs
serveur_powerdns_records:
- name: "dns"
type: "CNAME"
value: "ns1.{{ serveur_powerdns_zone }}."

View file

@ -1,8 +0,0 @@
---
# Conformite Redis (data-01, VLAN 13).
serveur_redis_maxmemory: "256mb"
# Secret OBLIGATOIRE, a fournir via Ansible Vault avant tout deploiement reel :
# serveur_redis_password: "{{ vault_redis }}"
# Convertir en dossier group_vars/serveur_redis/ avec main.yml + vault.yml (chiffre).

View file

@ -1,11 +0,0 @@
---
# Conformite relais SMTP (infra-mail-01, VLAN 11).
serveur_sendmail_domaine: "chezlepro.internal"
serveur_sendmail_reseaux_autorises:
- "127.0.0.0/8"
- "[::1]/128"
- "10.1.0.0/16"
# Smarthost amont : vide = remise directe. A renseigner si relais externe requis.
serveur_sendmail_smarthost: ""

View file

@ -1,16 +0,0 @@
---
# Conformite AC interne step-ca (infra-pki-01, VLAN 11).
serveur_step_ca_nom: "Chezlepro Internal CA"
serveur_step_ca_adresse: ":8443"
serveur_step_ca_acme: true
# Secrets OBLIGATOIRES, a fournir via Ansible Vault avant tout deploiement reel.
# Convertir ce fichier en dossier group_vars/serveur_step_ca/ avec :
# main.yml (en clair) :
# serveur_step_ca_password: "{{ vault_step_ca_password }}"
# serveur_step_ca_provisioner_password: "{{ vault_step_ca_provisioner_password }}"
# vault.yml (chiffre ansible-vault) :
# vault_step_ca_password: "..."
# vault_step_ca_provisioner_password: "..."
# Tant qu'ils sont absents, le role refuse de s'executer (assertion explicite).

View file

@ -1,244 +0,0 @@
# Inventaire GENERE depuis le plan (make instancier / instancier-appliquer).
# NE PAS editer a la main : edite docs/serveurs.yml + docs/applications.yml.
# Source : docs/serveurs.yml + docs/applications.yml + docs/nomenclature.yml.
all:
children:
client_dns:
hosts:
collab-01: null
web-frontal-01: null
client_supervision:
hosts:
web-frontal-01: null
hotes_actifs:
hosts: {}
hotes_planifies:
hosts:
collab-01:
ansible_host: 10.1.15.21
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.15.1
proxmox_stockage: TrueNAS
proxmox_vlan: 15
proxmox_vmid: 95201
data-01:
ansible_host: 10.1.13.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_vlan: 13
proxmox_vmid: 93101
forge-01:
ansible_host: 10.1.15.11
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.15.1
proxmox_stockage: TrueNAS
proxmox_vlan: 15
proxmox_vmid: 95101
idm-01:
ansible_host: 10.1.12.11
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.12.1
proxmox_stockage: TrueNAS
proxmox_vlan: 12
proxmox_vmid: 92101
infra-dns-01:
ansible_host: 10.1.11.41
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.11.1
proxmox_stockage: TrueNAS
proxmox_vlan: 11
proxmox_vmid: 91401
infra-edge-01:
ansible_host: 10.1.11.21
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.11.1
proxmox_stockage: TrueNAS
proxmox_vlan: 11
proxmox_vmid: 91201
infra-mail-01:
ansible_host: 10.1.11.31
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.11.1
proxmox_stockage: TrueNAS
proxmox_vlan: 11
proxmox_vmid: 91301
infra-pki-01:
ansible_host: 10.1.11.11
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.11.1
proxmox_stockage: TrueNAS
proxmox_vlan: 11
proxmox_vmid: 91101
mon-01:
ansible_host: 10.1.14.41
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.14.1
proxmox_stockage: TrueNAS
proxmox_vlan: 14
proxmox_vmid: 94401
obs-01:
ansible_host: 10.1.14.11
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 4
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.14.1
proxmox_stockage: TrueNAS
proxmox_vlan: 14
proxmox_vmid: 94101
web-dorsal-01:
ansible_host: 10.1.15.41
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.15.1
proxmox_stockage: TrueNAS
proxmox_vlan: 15
proxmox_vmid: 95401
web-frontal-01:
ansible_host: 10.1.15.31
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.15.1
proxmox_stockage: TrueNAS
proxmox_vlan: 15
proxmox_vmid: 95301
web-frontal-02:
ansible_host: 10.1.15.32
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 2
proxmox_disque_taille: 16G
proxmox_memoire: 2048
proxmox_passerelle: 10.1.15.1
proxmox_stockage: TrueNAS
proxmox_vlan: 15
proxmox_vmid: 95302
modeles_vm:
hosts: {}
serveur_collabora:
hosts:
collab-01: null
serveur_debian:
hosts:
collab-01: null
data-01: null
forge-01: null
idm-01: null
infra-dns-01: null
infra-edge-01: null
infra-mail-01: null
infra-pki-01: null
mon-01: null
obs-01: null
web-dorsal-01: null
web-frontal-01: null
web-frontal-02: null
serveur_durci:
hosts:
collab-01: null
data-01: null
forge-01: null
idm-01: null
infra-dns-01: null
infra-edge-01: null
infra-mail-01: null
infra-pki-01: null
mon-01: null
obs-01: null
web-dorsal-01: null
web-frontal-01: null
web-frontal-02: null
serveur_forgejo:
hosts:
forge-01: null
serveur_grafana:
hosts:
obs-01: null
serveur_icinga:
hosts:
mon-01: null
serveur_keycloak:
hosts:
idm-01: null
serveur_loki:
hosts:
obs-01: null
serveur_nextcloud:
hosts:
collab-01: null
serveur_nginx:
hosts:
infra-edge-01: null
serveur_openldap:
hosts:
idm-01: null
serveur_postgresql:
hosts:
data-01: null
serveur_powerdns:
hosts:
infra-dns-01: null
serveur_prometheus:
hosts:
obs-01: null
serveur_redis:
hosts:
data-01: null
serveur_sendmail:
hosts:
infra-mail-01: null
serveur_step_ca:
hosts:
infra-pki-01: null
serveur_web_dorsal:
hosts:
web-dorsal-01: null
serveur_web_frontal:
hosts:
web-frontal-01: null
web-frontal-02: null

View file

@ -1,59 +0,0 @@
# Registre des applications Set-OPS (application = entite pivot).
# Edite par make inventaire-ui ou scripts/applications.py.
# Une VM peut porter plusieurs applications ; une base se lie a une application.
---
applications:
collabora:
groupe: serveur_collabora
hote: collab-01
nextcloud:
groupe: serveur_nextcloud
hote: collab-01
pg-principal:
groupe: serveur_postgresql
hote: data-01
redis:
groupe: serveur_redis
hote: data-01
forge:
groupe: serveur_forgejo
hote: forge-01
keycloak:
groupe: serveur_keycloak
hote: idm-01
openldap:
groupe: serveur_openldap
hote: idm-01
powerdns:
groupe: serveur_powerdns
hote: infra-dns-01
nginx:
groupe: serveur_nginx
hote: infra-edge-01
sendmail:
groupe: serveur_sendmail
hote: infra-mail-01
step_ca:
groupe: serveur_step_ca
hote: infra-pki-01
icinga:
groupe: serveur_icinga
hote: mon-01
grafana:
groupe: serveur_grafana
hote: obs-01
loki:
groupe: serveur_loki
hote: obs-01
prometheus:
groupe: serveur_prometheus
hote: obs-01
web_dorsaux:
groupe: serveur_web_dorsal
hote: web-dorsal-01
web_frontaux:
groupe: serveur_web_frontal
hote: web-frontal-01
web_frontaux-web-frontal-02:
groupe: serveur_web_frontal
hote: web-frontal-02

View file

@ -1,56 +0,0 @@
---
# Registre des bases de donnees applicatives Set-OPS.
#
# Niveaux :
# serveurs_bd : les serveurs de base de donnees (un ou plusieurs), nommes.
# "groupe" relie un serveur nomme au groupe Ansible qui l'heberge.
# bases_donnees: une base = un identifiant unique -> serveur, base, proprietaire, secret.
# consommateur : QUI utilise la base. Interprete selon "portee" :
# portee=application : consommateur = id d'une application (docs/applications.yml)
# portee=groupe : consommateur = groupe operationnel (base PARTAGEE)
# portee=hote : consommateur = hote de l'inventaire
# Defaut : groupe (retrocompatible).
# usage : etiquette libre (principale, partagee, ...). Une appli peut avoir
# plusieurs bases (portee/usage differents).
#
# Une application A (groupe G, hote H) recoit les bases ou :
# (portee=application ET consommateur=A) OU (portee=groupe ET consommateur=G)
# OU (portee=hote ET consommateur=H). Plusieurs DSN par application sont possibles.
#
# La chaine de connexion (DSN) se derive : <type>://<proprietaire>:<secret>@<hote>:<port>/<base>
# C'est le DSN qui lie la bonne instanciation d'application a sa base.
#
# "secret" nomme une variable Ansible Vault (jamais le mot de passe en clair).
serveurs_bd:
pg-principal:
type: postgres
hote: "10.1.13.11"
port: 5432
groupe: serveur_postgresql
bases_donnees:
keycloak:
serveur: pg-principal
base: keycloak
proprietaire: keycloak
secret: vault_bd_keycloak
consommateur: serveur_keycloak
portee: groupe
usage: principale
icingadb:
serveur: pg-principal
base: icingadb
proprietaire: icingadb
secret: vault_bd_icingadb
consommateur: serveur_icinga
portee: groupe
usage: principale
forgejo:
serveur: pg-principal
base: forgejo
proprietaire: forgejo
secret: vault_bd_forgejo
consommateur: serveur_forgejo
portee: groupe
usage: principale

View file

@ -1,33 +0,0 @@
---
# Registre des domaines publics Set-OPS (publication externe des hostnames).
#
# Modele d'autorite retenu : PRIMAIRE CACHE + SECONDAIRES.
# - Le primaire (PowerDNS, backend PostgreSQL + API) detient la zone faisant
# autorite mais N'EST PAS expose a Internet (NOTIFY + AXFR seulement).
# - Les "secondaires" sont la face publique : ce sont eux dans les NS + la glue
# chez le registraire. Ils tirent la zone du primaire (AXFR authentifie TSIG).
#
# Ce registre ne decrit que les DOMAINES (zones). Le binding nom-public <-> service
# vit desormais sur l'APPLICATION : chaque application declare `expose: [FQDN...]`
# dans docs/applications.yml. nginx, la zone publique et ACME derivent les
# expositions depuis les applications (regle expositions_des_applications).
#
# Champs par domaine :
# autorite : primaire-cache | auto-heberge | delegue
# edge : groupe Ansible qui porte l'IP publique de facade (reverse proxy)
# secondaires : NS publics (FQDN) faisant face a Internet (a renseigner)
# dnssec : signature de la zone (jalon ulterieur ; false au depart)
# ttl : TTL par defaut de la zone
# mail : mx / spf / dmarc (lies a serveur_sendmail) ; vides si pas de mail
domaines_publics:
alliance-boreale.ca:
autorite: primaire-cache
edge: serveur_nginx
secondaires: [] # FQDN des NS publics secondaires - a renseigner
dnssec: false # jalon ulterieur (DS chez le registraire d'abord)
ttl: 3600
mail:
mx: []
spf: ""
dmarc: ""

View file

@ -1,42 +0,0 @@
---
# Nomenclature Set-OPS : source unique pour hostnames, VMID, VLAN et adressage.
#
# Derivations (tout part de la FONCTION de l'hote ; "domaine" est reserve au DNS) :
# hostname = <fonction>-<NN> ex. web-frontal-03
# VMID = 9 . categorie . service . NN ex. 9 5 3 03 -> 95303
# VLAN = categorie.vlan ex. 15
# IP = <prefixe_sous_reseau>.(service*10 + NN) ex. 10.1.15.33
# passerelle / CIDR : voir la categorie
#
# Contrainte : NN va de 01 a 09 par fonction (l'octet hote = service*10 + NN
# reste dans le bloc du service). Au-dela, ouvrir une nouvelle fonction ou service.
supernet: "10.1.0.0/16"
cidr_hote: 24
reservations:
passerelle: 1 # .1 = passerelle de chaque /24
reserve_min: 2 # .2 a .9 reserves (reseau, HA, futur)
reserve_max: 9
categories:
1: { libelle: "Fondations / infra", vlan: 11, sous_reseau: "10.1.11.0/24", passerelle: "10.1.11.1" }
2: { libelle: "Identite", vlan: 12, sous_reseau: "10.1.12.0/24", passerelle: "10.1.12.1" }
3: { libelle: "Donnees", vlan: 13, sous_reseau: "10.1.13.0/24", passerelle: "10.1.13.1" }
4: { libelle: "Observabilite", vlan: 14, sous_reseau: "10.1.14.0/24", passerelle: "10.1.14.1" }
5: { libelle: "Applications", vlan: 15, sous_reseau: "10.1.15.0/24", passerelle: "10.1.15.1" }
9: { libelle: "Modeles / essais", vlan: 99, sous_reseau: "10.1.99.0/24", passerelle: "10.1.99.1" }
fonctions:
infra-pki: { categorie: 1, service: 1 }
infra-edge: { categorie: 1, service: 2 }
infra-mail: { categorie: 1, service: 3 }
infra-dns: { categorie: 1, service: 4 }
idm: { categorie: 2, service: 1 }
data: { categorie: 3, service: 1 }
obs: { categorie: 4, service: 1 }
mon: { categorie: 4, service: 4 }
forge: { categorie: 5, service: 1 }
collab: { categorie: 5, service: 2 }
web-frontal: { categorie: 5, service: 3 }
web-dorsal: { categorie: 5, service: 4 }

View file

@ -1,103 +0,0 @@
# Registre des serveurs (VM) du plan Set-OPS.
# Bootstrape depuis l'inventaire (make serveurs-bootstrap). L'inventaire
# reste autorite en Phase 2 ; VMID/IP/VLAN/passerelle sont DERIVES de la
# fonction via docs/nomenclature.yml (non stockes ici).
---
serveurs:
collab-01:
fonction: collab
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
integrations:
- client_dns
data-01:
fonction: data
etat: planifie
noeud: asgard
stockage: TrueNAS
disque: 160G
memoire: 2048
coeurs: 4
forge-01:
fonction: forge
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
idm-01:
fonction: idm
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
infra-dns-01:
fonction: infra-dns
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
infra-edge-01:
fonction: infra-edge
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
infra-mail-01:
fonction: infra-mail
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
infra-pki-01:
fonction: infra-pki
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
mon-01:
fonction: mon
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
obs-01:
fonction: obs
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 4
web-dorsal-01:
fonction: web-dorsal
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
web-frontal-01:
fonction: web-frontal
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2
integrations:
- client_dns
- client_supervision
web-frontal-02:
fonction: web-frontal
etat: planifie
stockage: TrueNAS
disque: 16G
memoire: 2048
coeurs: 2