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:
parent
3b7f3098f2
commit
780b1e6b24
32 changed files with 31 additions and 870 deletions
|
|
@ -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
4
.gitignore
vendored
|
|
@ -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/
|
||||
|
|
|
|||
|
|
@ -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.)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
@ -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"
|
||||
|
|
@ -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: ""
|
||||
|
|
@ -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
|
||||
|
|
@ -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: {}
|
||||
|
|
@ -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"
|
||||
|
|
@ -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
|
||||
|
|
@ -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).
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
|
|
@ -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
|
||||
|
|
@ -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).
|
||||
|
|
@ -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.
|
||||
|
|
@ -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/).
|
||||
|
|
@ -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"
|
||||
|
|
@ -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).
|
||||
|
|
@ -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: []
|
||||
|
|
@ -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 }}."
|
||||
|
|
@ -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).
|
||||
|
|
@ -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: ""
|
||||
|
|
@ -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).
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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: ""
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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
|
||||
Reference in a new issue