diff --git a/.ansible-lint b/.ansible-lint index 661f7b2..f54ebb3 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -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/ diff --git a/.gitignore b/.gitignore index fc01250..511e838 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fb9f7a..dfccfcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 `/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.) diff --git a/docs/plan-et-generation.md b/docs/plan-et-generation.md index 1d884a9..78cf74f 100644 --- a/docs/plan-et-generation.md +++ b/docs/plan-et-generation.md @@ -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. diff --git a/instance/inventories/lab/group_vars/all.yml b/instance/inventories/lab/group_vars/all.yml deleted file mode 100644 index f7266f9..0000000 --- a/instance/inventories/lab/group_vars/all.yml +++ /dev/null @@ -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" diff --git a/instance/inventories/lab/group_vars/modeles_vm.yml b/instance/inventories/lab/group_vars/modeles_vm.yml deleted file mode 100644 index e67b06c..0000000 --- a/instance/inventories/lab/group_vars/modeles_vm.yml +++ /dev/null @@ -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" diff --git a/instance/inventories/lab/group_vars/proxmox.vault.yml.example b/instance/inventories/lab/group_vars/proxmox.vault.yml.example deleted file mode 100644 index f148047..0000000 --- a/instance/inventories/lab/group_vars/proxmox.vault.yml.example +++ /dev/null @@ -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: "" diff --git a/instance/inventories/lab/group_vars/proxmox.yml b/instance/inventories/lab/group_vars/proxmox.yml deleted file mode 100644 index d90ccab..0000000 --- a/instance/inventories/lab/group_vars/proxmox.yml +++ /dev/null @@ -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 diff --git a/instance/inventories/lab/hosts.yml b/instance/inventories/lab/hosts.yml deleted file mode 100644 index bfae9d5..0000000 --- a/instance/inventories/lab/hosts.yml +++ /dev/null @@ -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: {} diff --git a/instance/inventories/production/group_vars/all.yml b/instance/inventories/production/group_vars/all.yml deleted file mode 100644 index b8319ed..0000000 --- a/instance/inventories/production/group_vars/all.yml +++ /dev/null @@ -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" diff --git a/instance/inventories/production/group_vars/client_dns.yml b/instance/inventories/production/group_vars/client_dns.yml deleted file mode 100644 index e532da0..0000000 --- a/instance/inventories/production/group_vars/client_dns.yml +++ /dev/null @@ -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 diff --git a/instance/inventories/production/group_vars/client_ldap.yml b/instance/inventories/production/group_vars/client_ldap.yml deleted file mode 100644 index b6ee976..0000000 --- a/instance/inventories/production/group_vars/client_ldap.yml +++ /dev/null @@ -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). diff --git a/instance/inventories/production/group_vars/client_pki.yml b/instance/inventories/production/group_vars/client_pki.yml deleted file mode 100644 index 472a99a..0000000 --- a/instance/inventories/production/group_vars/client_pki.yml +++ /dev/null @@ -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. diff --git a/instance/inventories/production/group_vars/client_smtp.yml b/instance/inventories/production/group_vars/client_smtp.yml deleted file mode 100644 index 494156d..0000000 --- a/instance/inventories/production/group_vars/client_smtp.yml +++ /dev/null @@ -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 diff --git a/instance/inventories/production/group_vars/serveur_debian.yml b/instance/inventories/production/group_vars/serveur_debian.yml deleted file mode 100644 index 09350df..0000000 --- a/instance/inventories/production/group_vars/serveur_debian.yml +++ /dev/null @@ -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" diff --git a/instance/inventories/production/group_vars/serveur_forgejo.yml b/instance/inventories/production/group_vars/serveur_forgejo.yml deleted file mode 100644 index 4fbbfb4..0000000 --- a/instance/inventories/production/group_vars/serveur_forgejo.yml +++ /dev/null @@ -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 diff --git a/instance/inventories/production/group_vars/serveur_grafana.yml b/instance/inventories/production/group_vars/serveur_grafana.yml deleted file mode 100644 index b083a02..0000000 --- a/instance/inventories/production/group_vars/serveur_grafana.yml +++ /dev/null @@ -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). diff --git a/instance/inventories/production/group_vars/serveur_icinga.yml b/instance/inventories/production/group_vars/serveur_icinga.yml deleted file mode 100644 index b45cab7..0000000 --- a/instance/inventories/production/group_vars/serveur_icinga.yml +++ /dev/null @@ -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. diff --git a/instance/inventories/production/group_vars/serveur_keycloak.yml b/instance/inventories/production/group_vars/serveur_keycloak.yml deleted file mode 100644 index c8b62c4..0000000 --- a/instance/inventories/production/group_vars/serveur_keycloak.yml +++ /dev/null @@ -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/). diff --git a/instance/inventories/production/group_vars/serveur_nginx.yml b/instance/inventories/production/group_vars/serveur_nginx.yml deleted file mode 100644 index 641b98c..0000000 --- a/instance/inventories/production/group_vars/serveur_nginx.yml +++ /dev/null @@ -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" diff --git a/instance/inventories/production/group_vars/serveur_openldap.yml b/instance/inventories/production/group_vars/serveur_openldap.yml deleted file mode 100644 index a3951c1..0000000 --- a/instance/inventories/production/group_vars/serveur_openldap.yml +++ /dev/null @@ -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). diff --git a/instance/inventories/production/group_vars/serveur_postgresql.yml b/instance/inventories/production/group_vars/serveur_postgresql.yml deleted file mode 100644 index ff574d9..0000000 --- a/instance/inventories/production/group_vars/serveur_postgresql.yml +++ /dev/null @@ -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: [] diff --git a/instance/inventories/production/group_vars/serveur_powerdns.yml b/instance/inventories/production/group_vars/serveur_powerdns.yml deleted file mode 100644 index 2dd5377..0000000 --- a/instance/inventories/production/group_vars/serveur_powerdns.yml +++ /dev/null @@ -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 }}." diff --git a/instance/inventories/production/group_vars/serveur_redis.yml b/instance/inventories/production/group_vars/serveur_redis.yml deleted file mode 100644 index 7e9dadb..0000000 --- a/instance/inventories/production/group_vars/serveur_redis.yml +++ /dev/null @@ -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). diff --git a/instance/inventories/production/group_vars/serveur_sendmail.yml b/instance/inventories/production/group_vars/serveur_sendmail.yml deleted file mode 100644 index 8e5ff44..0000000 --- a/instance/inventories/production/group_vars/serveur_sendmail.yml +++ /dev/null @@ -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: "" diff --git a/instance/inventories/production/group_vars/serveur_step_ca.yml b/instance/inventories/production/group_vars/serveur_step_ca.yml deleted file mode 100644 index a5247c4..0000000 --- a/instance/inventories/production/group_vars/serveur_step_ca.yml +++ /dev/null @@ -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). diff --git a/instance/inventories/production/hosts.yml b/instance/inventories/production/hosts.yml deleted file mode 100644 index 4c964dc..0000000 --- a/instance/inventories/production/hosts.yml +++ /dev/null @@ -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 diff --git a/instance/plan/applications.yml b/instance/plan/applications.yml deleted file mode 100644 index 355dee8..0000000 --- a/instance/plan/applications.yml +++ /dev/null @@ -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 diff --git a/instance/plan/bases-donnees.yml b/instance/plan/bases-donnees.yml deleted file mode 100644 index a87dbf3..0000000 --- a/instance/plan/bases-donnees.yml +++ /dev/null @@ -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 : ://:@:/ -# 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 diff --git a/instance/plan/domaines.yml b/instance/plan/domaines.yml deleted file mode 100644 index 1cda97e..0000000 --- a/instance/plan/domaines.yml +++ /dev/null @@ -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: "" diff --git a/instance/plan/nomenclature.yml b/instance/plan/nomenclature.yml deleted file mode 100644 index 49a53dd..0000000 --- a/instance/plan/nomenclature.yml +++ /dev/null @@ -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 = - ex. web-frontal-03 -# VMID = 9 . categorie . service . NN ex. 9 5 3 03 -> 95303 -# VLAN = categorie.vlan ex. 15 -# IP = .(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 } diff --git a/instance/plan/serveurs.yml b/instance/plan/serveurs.yml deleted file mode 100644 index a2a7e3b..0000000 --- a/instance/plan/serveurs.yml +++ /dev/null @@ -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