From b2d087356c47f42b3b8efa66a5258cd98c78a1f8 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sun, 23 Aug 2026 11:58:10 -0400 Subject: [PATCH] poste d'exploitation : patient 0 sait lire son propre genome Fonction `ops` en zone Services-infra, machine ops-01 (10.29.19.41, VMID 129404101). Sans client_backup : le poste ne detient aucun etat propre, tout ce qu'il porte se recompose depuis la forge. Ajoute aussi le group_vars serveur_nginx qui manquait -- sans lui, l'edge publiait la forge derriere un certificat auto-signe. Co-Authored-By: Claude Opus 5 --- .../production/group_vars/all/10-intrants.yml | 17 +++++++++++++++- .../production/group_vars/serveur_nginx.yml | 20 +++++++++++++++++++ inventories/production/hosts.yml | 20 +++++++++++++++++++ plan/applications.yml | 1 + plan/nomenclature.yml | 4 ++++ plan/serveurs.yml | 4 ++++ 6 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 inventories/production/group_vars/serveur_nginx.yml diff --git a/inventories/production/group_vars/all/10-intrants.yml b/inventories/production/group_vars/all/10-intrants.yml index c130788..445230d 100644 --- a/inventories/production/group_vars/all/10-intrants.yml +++ b/inventories/production/group_vars/all/10-intrants.yml @@ -33,4 +33,19 @@ organisation: Alliance Boréale # qu'on amorce — une adresse en @genese.internal serait un piege parfait. amorcage_acces_courriel: sysadmin@chezlepro.ca -setops_plan_dir: "{{ playbook_dir }}/../../instance/plan" +# LE PLAN SUIT L'INVENTAIRE, PAS LE SYMLINK (2026-08-23). +# +# La valeur precedente etait `{{ playbook_dir }}/../../instance/plan` : le lien +# `instance` du moteur, en dur. Tout role lisant le plan lisait donc celui de +# l'instance POINTEE PAR LE LIEN, et non celle qu'on deploie. +# +# CE QUE CA A DONNE. En deployant patient 0 avec `SETOPS_INSTANCE`, le plancher +# /etc/hosts de `ops-01` a recu les FQDN de CHEZLEPRO -- auth.chezlepro.internal, +# forge.chezlepro.internal... -- pointes sur l'edge de patient 0. Un ecosysteme +# annoncait les noms d'un autre. Neuf roles lisent cette variable ; le plancher est +# simplement celui qui l'a rendu visible. +# +# `inventory_dir` est le dossier de l'inventaire REELLEMENT charge. Le plan qui a +# engendre cet inventaire est son voisin : les deux ne peuvent plus se contredire, +# et l'expression reste juste qu'on passe par le symlink ou par SETOPS_INSTANCE. +setops_plan_dir: "{{ inventory_dir }}/../../plan" diff --git a/inventories/production/group_vars/serveur_nginx.yml b/inventories/production/group_vars/serveur_nginx.yml new file mode 100644 index 0000000..610da76 --- /dev/null +++ b/inventories/production/group_vars/serveur_nginx.yml @@ -0,0 +1,20 @@ +--- +# L'EDGE DOIT PORTER LES NOMS QU'IL PUBLIE (2026-08-23). +# +# Sans ce fichier, `client_pki` n'emet le certificat de l'edge qu'avec ses propres noms +# (`infra-edge-01.genese.internal`), et nginx retombe sur le certificat auto-signe de +# Debian pour tout FQDN expose. Le service repond, la page s'affiche apres un +# avertissement — et rien ne signale la panne. C'est ce qui s'est passe ici : la forge de +# patient 0 etait publiee derriere un `ssl-cert-snakeoil.pem`, et `git clone` a ete le +# premier a refuser, a juste titre. +# +# `sans_exposition` est derive du plan (les `expose:` des applications). +client_pki_sans: >- + {{ ([ansible_fqdn | default(ansible_hostname), ansible_hostname, ansible_host] + + (sans_exposition | default([]))) + | select | unique | list }} +serveur_nginx_certificat: "/etc/step/certs/{{ ansible_fqdn | default(ansible_hostname) }}.crt" +serveur_nginx_cle: "/etc/step/certs/{{ ansible_fqdn | default(ansible_hostname) }}.key" +# Un cert renouvele sur disque reste PERIME en memoire tant que nginx n'a pas recharge. +client_pki_reload_services: + - nginx diff --git a/inventories/production/hosts.yml b/inventories/production/hosts.yml index f921bfe..461de2e 100644 --- a/inventories/production/hosts.yml +++ b/inventories/production/hosts.yml @@ -13,11 +13,13 @@ all: infra-dns-01: null infra-edge-01: null infra-pki-01: null + ops-01: null client_unbound: hosts: forge-01: null infra-edge-01: null infra-pki-01: null + ops-01: null hotes_actifs: hosts: forge-01: @@ -74,6 +76,19 @@ all: proxmox_vlan: 1294 proxmox_vmid: 129402101 setops_supernet: 10.29.0.0/16 + ops-01: + ansible_host: 10.29.19.41 + ansible_user: ansible + proxmox_cidr: 24 + proxmox_coeurs: 2 + proxmox_disque_taille: 20G + proxmox_etiquette_vlan: '' + proxmox_memoire: 3072 + proxmox_passerelle: 10.29.19.1 + proxmox_pont: t29serv + proxmox_vlan: 1294 + proxmox_vmid: 129404101 + setops_supernet: 10.29.0.0/16 hotes_planifies: hosts: {} modeles_vm: @@ -84,18 +99,23 @@ all: infra-dns-01: null infra-edge-01: null infra-pki-01: null + ops-01: null serveur_durci: hosts: forge-01: null infra-dns-01: null infra-edge-01: null infra-pki-01: null + ops-01: null serveur_forgejo: hosts: forge-01: null serveur_nginx: hosts: infra-edge-01: null + serveur_ops: + hosts: + ops-01: null serveur_powerdns: hosts: infra-dns-01: null diff --git a/plan/applications.yml b/plan/applications.yml index 5d4180f..6e8e340 100644 --- a/plan/applications.yml +++ b/plan/applications.yml @@ -4,3 +4,4 @@ applications: nginx: { groupe: serveur_nginx, hote: infra-edge-01 } powerdns: { groupe: serveur_powerdns, hote: infra-dns-01 } forgejo: { groupe: serveur_forgejo, hote: forge-01, port: 3000, expose: [forge.genese.internal] } + ops: { groupe: serveur_ops, hote: ops-01 } diff --git a/plan/nomenclature.yml b/plan/nomenclature.yml index 1622a50..0a78083 100644 --- a/plan/nomenclature.yml +++ b/plan/nomenclature.yml @@ -38,3 +38,7 @@ fonctions: infra-dns: { categorie: 4, service: 1 } infra-edge: { categorie: 1, service: 1 } infra-pki: { categorie: 4, service: 2 } + # LE POSTE D'EXPLOITATION. Zone Services-infra : il ne sert personne, mais il est + # l'infrastructure de l'infrastructure — la machine par laquelle l'ecosysteme se + # reconstruit sans dependre du poste de son mainteneur. + ops: { categorie: 4, service: 4 } diff --git a/plan/serveurs.yml b/plan/serveurs.yml index 2226f3d..4ba9ddd 100644 --- a/plan/serveurs.yml +++ b/plan/serveurs.yml @@ -14,3 +14,7 @@ serveurs: # LA MACHINE QUI PORTE LE GENOME. Son disque n'est pas celui du modele : elle # hebergera les depots de TOUS les ecosystemes de la lignee, pas seulement les siens. forge-01: { fonction: forge, etat: actif, disque: 80G, integrations: [client_backup] } + # Le poste d'exploitation ne detient AUCUN etat propre : tout ce qu'il porte se + # recompose depuis la forge. Il n'a donc pas de `client_backup` — le sauvegarder + # serait sauvegarder une copie de ce qui est deja sauvegarde ailleurs. + ops-01: { fonction: ops, etat: actif, disque: 20G }