From cc6026641f637f8ae962ecd9901f23f6222300c4 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Fri, 7 Aug 2026 16:22:38 -0400 Subject: [PATCH] empreintes muettes, courses de premier demarrage, collision de noms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quatre meta/empreinte.yml declaraient leurs valeurs A LA RACINE, sans la cle `setops_empreinte:` : collabora, nextcloud, web_dorsal, web_frontal. Le lecteur les voyait vides et rendait {0,0,0} — en silence. collab-01 s'est retrouvee avec 1 coeur / 1 Go pour porter Nextcloud ET Collabora, et a cesse de repondre en SSH faute de memoire. Corrigee : 4c/5632Mo. Une garde refuse desormais cette forme. Un fichier qui existe mais ne dit rien est pire qu'un fichier absent : le repli aurait donne des valeurs sensees. Deux courses de premier demarrage : - le clone rend la main avant que son .conf existe -> attente active sur l'API ; - le verrou dpkg frappait hors de `common_packages` -> `lock_timeout` pose en module_defaults sur les 30 playbooks de groupe, une declaration au lieu de 30. Au passage, j'ai failli livrer pire que le defaut : une URL coupee avec `>-` inserait une ESPACE en son milieu. Le lint passait, la requete non. Enfin : `proxmox_kvm` identifie une VM par son NOM. Une VM heritee homonyme lui a fait rapporter `ok` sans rien cloner — un deploiement peut donc PARAITRE reussi alors qu'aucune VM n'existe. Touche D-37 directement. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 50 ++++++++++++++++++++ playbooks/groupes/client_backup.yml | 7 +++ playbooks/groupes/client_journal.yml | 7 +++ playbooks/groupes/client_metrique.yml | 7 +++ playbooks/groupes/client_pki.yml | 7 +++ playbooks/groupes/client_smtp.yml | 7 +++ playbooks/groupes/client_unbound.yml | 7 +++ playbooks/groupes/serveur_backup.yml | 7 +++ playbooks/groupes/serveur_collabora.yml | 7 +++ playbooks/groupes/serveur_debian.yml | 7 +++ playbooks/groupes/serveur_dovecot.yml | 7 +++ playbooks/groupes/serveur_durci.yml | 7 +++ playbooks/groupes/serveur_forgejo.yml | 7 +++ playbooks/groupes/serveur_grafana.yml | 7 +++ playbooks/groupes/serveur_icinga.yml | 7 +++ playbooks/groupes/serveur_icingaweb2.yml | 7 +++ playbooks/groupes/serveur_keycloak.yml | 7 +++ playbooks/groupes/serveur_loki.yml | 7 +++ playbooks/groupes/serveur_nextcloud.yml | 7 +++ playbooks/groupes/serveur_nginx.yml | 7 +++ playbooks/groupes/serveur_oauth2_proxy.yml | 7 +++ playbooks/groupes/serveur_openldap.yml | 7 +++ playbooks/groupes/serveur_postfix.yml | 7 +++ playbooks/groupes/serveur_postgresql.yml | 7 +++ playbooks/groupes/serveur_powerdns.yml | 7 +++ playbooks/groupes/serveur_prometheus.yml | 7 +++ playbooks/groupes/serveur_redis.yml | 7 +++ playbooks/groupes/serveur_rspamd.yml | 7 +++ playbooks/groupes/serveur_step_ca.yml | 7 +++ playbooks/groupes/serveur_web_dorsal.yml | 7 +++ playbooks/groupes/serveur_web_frontal.yml | 7 +++ playbooks/proxmox/cloner_vm_debian.yml | 24 ++++++++++ roles/serveur_collabora/meta/empreinte.yml | 17 +++++-- roles/serveur_nextcloud/meta/empreinte.yml | 17 +++++-- roles/serveur_web_dorsal/meta/empreinte.yml | 17 +++++-- roles/serveur_web_frontal/meta/empreinte.yml | 17 +++++-- scripts/inventory_rules.py | 12 +++++ 37 files changed, 344 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65f03cf..9546e39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,56 @@ ## 2026-08-06 — le chemin nord-sud devient dérivable +### Quatre empreintes muettes — et une VM qui en est morte + +`collab-01` a cessé de répondre en SSH. Le symptôme ressemblait à un problème réseau ; la +cause était un fichier YAML mal formé depuis des semaines. + +**Quatre `meta/empreinte.yml` déclaraient leurs valeurs à la racine**, sans la clé +`setops_empreinte:` : collabora, nextcloud, web_dorsal, web_frontal. `charger_empreinte_role` +les lisait comme vides et rendait `{0,0,0}` — **en silence**. Les VM concernées recevaient le +minimum du socle. + +`collab-01` s'est donc retrouvée avec **1 cœur / 1 Go** pour porter Nextcloud *et* Collabora. +L'installation de PHP 8.4, nginx et Redis a épuisé la mémoire, et sshd n'a plus pu forker. +Après correction : **4 cœurs / 5 632 Mo**. `web-dorsal-01` passe de 1024 à 2048 Mo. + +**Un fichier qui existe mais ne dit rien est pire qu'un fichier absent** : le repli aurait +donné des valeurs sensées. Une garde refuse désormais cette forme, en nommant le fichier — et +elle distingue « pas d'empreinte » de « empreinte illisible », qui n'appellent pas la même +réponse. + +Les deux VM ont été redimensionnées à chaud (arrêt propre, `config PUT`, redémarrage). Elles +sont dans la couche `apps` — la dernière — donc rien ne dépendait d'elles. + +### Deux courses de premier démarrage, corrigées à la racine + +**Le clone rend la main avant que sa configuration existe.** Sur un stockage lent, `qm clone` +retourne et le `.conf` n'est pas encore écrit ; la tâche suivante échouait sur +« Configuration file … does not exist ». Une attente active interroge l'API jusqu'à 150 s. + +Au passage, j'ai failli livrer pire que le défaut : pour raccourcir une ligne trop longue, je +l'avais coupée avec `>-` — qui replie les retours en **espaces**, insérant une espace au milieu +de l'URL. Le lint passait, la requête aurait échoué. L'URL est assemblée dans une variable. + +**Le verrou dpkg frappait hors de `common_packages`.** J'y avais mis `lock_timeout` hier, mais +chaque autre rôle installant des paquets restait exposé — `serveur_nextcloud` en a fait les +frais. Il est désormais posé en `module_defaults` sur les **30 playbooks de groupe** : toute +tâche `apt` du play en hérite, y compris celles des rôles inclus. Une déclaration au lieu de +trente. + +### Une collision de noms qui rapportait `ok` + +`web-frontal-01` ne se créait pas : une VM héritée portait déjà ce nom (`911401`, arrêtée, +adressage `192.168.15.x` de l'ancien monde). **`proxmox_kvm` identifie par le nom, l'a trouvée, +et a rapporté `ok` sans rien cloner.** + +C'est plus grave que l'échec : un déploiement peut *paraître* réussi alors qu'aucune VM n'a été +créée. Ça touche directement D-37 — les noms courts sont volontairement identiques d'un tenant +à l'autre, et un parc hérité qui partage un nom crée exactement cette collision silencieuse. +La VM héritée a été renommée. + + ### `resoudre_idp` — le nom inventé était dans **quatre** rôles `forge-01` a échoué sur `serveur_forgejo_oidc_discovery`, qui pointait diff --git a/playbooks/groupes/client_backup.yml b/playbooks/groupes/client_backup.yml index 73a5b62..60affba 100644 --- a/playbooks/groupes/client_backup.yml +++ b/playbooks/groupes/client_backup.yml @@ -2,6 +2,13 @@ - name: Appliquer l'intégration client_backup hosts: client_backup become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true roles: - client_backup diff --git a/playbooks/groupes/client_journal.yml b/playbooks/groupes/client_journal.yml index 6e8b30b..a23b254 100644 --- a/playbooks/groupes/client_journal.yml +++ b/playbooks/groupes/client_journal.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe client_journal hosts: client_journal become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/client_metrique.yml b/playbooks/groupes/client_metrique.yml index 5060135..60e2e47 100644 --- a/playbooks/groupes/client_metrique.yml +++ b/playbooks/groupes/client_metrique.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe client_metrique hosts: client_metrique become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/client_pki.yml b/playbooks/groupes/client_pki.yml index 2b568d8..62994b2 100644 --- a/playbooks/groupes/client_pki.yml +++ b/playbooks/groupes/client_pki.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe client_pki hosts: client_pki become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/client_smtp.yml b/playbooks/groupes/client_smtp.yml index 9f2a771..cdce25e 100644 --- a/playbooks/groupes/client_smtp.yml +++ b/playbooks/groupes/client_smtp.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe client_smtp hosts: client_smtp become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/client_unbound.yml b/playbooks/groupes/client_unbound.yml index 8a3ff1f..80e284b 100644 --- a/playbooks/groupes/client_unbound.yml +++ b/playbooks/groupes/client_unbound.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe client_unbound hosts: client_unbound become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_backup.yml b/playbooks/groupes/serveur_backup.yml index dcb05ab..45b8104 100644 --- a/playbooks/groupes/serveur_backup.yml +++ b/playbooks/groupes/serveur_backup.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_backup hosts: serveur_backup become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true roles: - serveur_backup diff --git a/playbooks/groupes/serveur_collabora.yml b/playbooks/groupes/serveur_collabora.yml index fad4c49..bd3862c 100644 --- a/playbooks/groupes/serveur_collabora.yml +++ b/playbooks/groupes/serveur_collabora.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_collabora hosts: serveur_collabora become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_debian.yml b/playbooks/groupes/serveur_debian.yml index 89915eb..93a53d1 100644 --- a/playbooks/groupes/serveur_debian.yml +++ b/playbooks/groupes/serveur_debian.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_debian hosts: serveur_debian become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_dovecot.yml b/playbooks/groupes/serveur_dovecot.yml index c101eee..6238cc6 100644 --- a/playbooks/groupes/serveur_dovecot.yml +++ b/playbooks/groupes/serveur_dovecot.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_dovecot hosts: serveur_dovecot become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_durci.yml b/playbooks/groupes/serveur_durci.yml index 49f5ab0..e3077cc 100644 --- a/playbooks/groupes/serveur_durci.yml +++ b/playbooks/groupes/serveur_durci.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_durci hosts: serveur_durci become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_forgejo.yml b/playbooks/groupes/serveur_forgejo.yml index 8151193..2a40253 100644 --- a/playbooks/groupes/serveur_forgejo.yml +++ b/playbooks/groupes/serveur_forgejo.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_forgejo hosts: serveur_forgejo become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_grafana.yml b/playbooks/groupes/serveur_grafana.yml index f424761..cab3595 100644 --- a/playbooks/groupes/serveur_grafana.yml +++ b/playbooks/groupes/serveur_grafana.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_grafana hosts: serveur_grafana become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_icinga.yml b/playbooks/groupes/serveur_icinga.yml index badb998..7e2c53f 100644 --- a/playbooks/groupes/serveur_icinga.yml +++ b/playbooks/groupes/serveur_icinga.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_icinga hosts: serveur_icinga become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_icingaweb2.yml b/playbooks/groupes/serveur_icingaweb2.yml index e629826..0a2bac5 100644 --- a/playbooks/groupes/serveur_icingaweb2.yml +++ b/playbooks/groupes/serveur_icingaweb2.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_icingaweb2 hosts: serveur_icingaweb2 become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_keycloak.yml b/playbooks/groupes/serveur_keycloak.yml index ff4a9fe..f842cbe 100644 --- a/playbooks/groupes/serveur_keycloak.yml +++ b/playbooks/groupes/serveur_keycloak.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_keycloak hosts: serveur_keycloak become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_loki.yml b/playbooks/groupes/serveur_loki.yml index a13733f..daecc80 100644 --- a/playbooks/groupes/serveur_loki.yml +++ b/playbooks/groupes/serveur_loki.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_loki hosts: serveur_loki become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_nextcloud.yml b/playbooks/groupes/serveur_nextcloud.yml index aba9211..ce75e16 100644 --- a/playbooks/groupes/serveur_nextcloud.yml +++ b/playbooks/groupes/serveur_nextcloud.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_nextcloud hosts: serveur_nextcloud become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_nginx.yml b/playbooks/groupes/serveur_nginx.yml index 0f961c4..ac716a7 100644 --- a/playbooks/groupes/serveur_nginx.yml +++ b/playbooks/groupes/serveur_nginx.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_nginx hosts: serveur_nginx become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_oauth2_proxy.yml b/playbooks/groupes/serveur_oauth2_proxy.yml index 0bc1f3d..b1ca6f5 100644 --- a/playbooks/groupes/serveur_oauth2_proxy.yml +++ b/playbooks/groupes/serveur_oauth2_proxy.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_oauth2_proxy hosts: serveur_oauth2_proxy become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: - name: Vérifier que la cible est Debian diff --git a/playbooks/groupes/serveur_openldap.yml b/playbooks/groupes/serveur_openldap.yml index 67ea6e6..f446574 100644 --- a/playbooks/groupes/serveur_openldap.yml +++ b/playbooks/groupes/serveur_openldap.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_openldap hosts: serveur_openldap become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_postfix.yml b/playbooks/groupes/serveur_postfix.yml index 650a8fa..2113e25 100644 --- a/playbooks/groupes/serveur_postfix.yml +++ b/playbooks/groupes/serveur_postfix.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_postfix hosts: serveur_postfix become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_postgresql.yml b/playbooks/groupes/serveur_postgresql.yml index c8491e2..b7f3238 100644 --- a/playbooks/groupes/serveur_postgresql.yml +++ b/playbooks/groupes/serveur_postgresql.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_postgresql hosts: serveur_postgresql become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_powerdns.yml b/playbooks/groupes/serveur_powerdns.yml index c1bea7f..f380c13 100644 --- a/playbooks/groupes/serveur_powerdns.yml +++ b/playbooks/groupes/serveur_powerdns.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_powerdns hosts: serveur_powerdns become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_prometheus.yml b/playbooks/groupes/serveur_prometheus.yml index eeb1ea2..f62825d 100644 --- a/playbooks/groupes/serveur_prometheus.yml +++ b/playbooks/groupes/serveur_prometheus.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_prometheus hosts: serveur_prometheus become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_redis.yml b/playbooks/groupes/serveur_redis.yml index cfa33e9..78d3a81 100644 --- a/playbooks/groupes/serveur_redis.yml +++ b/playbooks/groupes/serveur_redis.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_redis hosts: serveur_redis become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_rspamd.yml b/playbooks/groupes/serveur_rspamd.yml index 834d9bf..4f23e04 100644 --- a/playbooks/groupes/serveur_rspamd.yml +++ b/playbooks/groupes/serveur_rspamd.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_rspamd hosts: serveur_rspamd become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_step_ca.yml b/playbooks/groupes/serveur_step_ca.yml index a8af81c..2e7c228 100644 --- a/playbooks/groupes/serveur_step_ca.yml +++ b/playbooks/groupes/serveur_step_ca.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_step_ca hosts: serveur_step_ca become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_web_dorsal.yml b/playbooks/groupes/serveur_web_dorsal.yml index c790481..146471a 100644 --- a/playbooks/groupes/serveur_web_dorsal.yml +++ b/playbooks/groupes/serveur_web_dorsal.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_web_dorsal hosts: serveur_web_dorsal become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/groupes/serveur_web_frontal.yml b/playbooks/groupes/serveur_web_frontal.yml index 691d3df..c80b554 100644 --- a/playbooks/groupes/serveur_web_frontal.yml +++ b/playbooks/groupes/serveur_web_frontal.yml @@ -2,6 +2,13 @@ - name: Appliquer le groupe serveur_web_frontal hosts: serveur_web_frontal become: true + # Le verrou dpkg est tenu par les maj automatiques de Debian, par vagues, plusieurs + # minutes apres le premier demarrage. Pose ICI plutot que dans chaque role : toute + # tache apt du play en herite, y compris celles des roles inclus. + module_defaults: + ansible.builtin.apt: + lock_timeout: 300 + gather_facts: true pre_tasks: diff --git a/playbooks/proxmox/cloner_vm_debian.yml b/playbooks/proxmox/cloner_vm_debian.yml index 05414c7..4919826 100644 --- a/playbooks/proxmox/cloner_vm_debian.yml +++ b/playbooks/proxmox/cloner_vm_debian.yml @@ -183,6 +183,30 @@ # L'API de CLONAGE ignore `cores` et `memory` : le clone herite du gabarit, et le # plan est contredit sans un mot. Mesure du 2026-08-06 : plan 1 coeur / 1024 Mo, # VM creee avec 2 / 2048 — ceux du gabarit. Il faut donc les reposer APRES le clone. + # Le clone COMPLET rend la main avant que sa configuration ne soit ecrite : sur + # un stockage lent, `qm clone` retourne, et le `.conf` n'existe pas encore. La + # tache suivante echouait alors sur « Configuration file ... does not exist ». + # Observe deux fois sur quinze clones (2026-08-07) — une course, pas un hasard. + - name: Attendre que la configuration du clone existe + vars: + # Assemblee dans une variable : un `>-` replie les retours en ESPACES, ce qui + # inserait une espace au milieu de l'URL. Le lint passait, la requete non. + proxmox_api_racine: "https://{{ proxmox_api_host_effectif }}:{{ proxmox_api_port_effectif | default(8006, true) }}" + ansible.builtin.uri: + url: "{{ proxmox_api_racine }}/api2/json/nodes/{{ proxmox_clone_noeud }}/qemu/{{ proxmox_clone_vmid | int }}/config" + method: GET + headers: + Authorization: >- + PVEAPIToken={{ proxmox_api_user_effectif }}!{{ proxmox_api_token_id_effectif }}={{ proxmox_api_token_secret_effectif }} + validate_certs: "{{ proxmox_validate_certs | default(false) | bool }}" + status_code: 200 + register: proxmox_clone_conf + until: proxmox_clone_conf.status == 200 + retries: 30 + delay: 5 + changed_when: false + no_log: true + - name: Appliquer le gabarit de calcul du plan (le clonage ne le fait pas) community.general.proxmox_kvm: api_host: "{{ proxmox_api_host_effectif }}" diff --git a/roles/serveur_collabora/meta/empreinte.yml b/roles/serveur_collabora/meta/empreinte.yml index adda7b0..ca9aaeb 100644 --- a/roles/serveur_collabora/meta/empreinte.yml +++ b/roles/serveur_collabora/meta/empreinte.yml @@ -1,6 +1,13 @@ --- -# Empreinte de dimensionnement (propriété du rôle). Collabora exécute des cœurs -# LibreOffice à la demande : mémoire notable, image conteneur ~1.5 Go. -coeurs: 2 -memoire_mo: 2048 -disque_go: 10 +# Empreinte ressources du logiciel — dimensionnement VM derive (scripts/instancier.py). +# Sommee au socle SE + marge pour estimer coeurs/RAM/disque de la VM hote. +# Override possible par hote dans le plan (serveurs.yml: coeurs/memoire/disque). +# +# LA CLE `setops_empreinte:` EST OBLIGATOIRE. Declarees a la racine, ces valeurs +# etaient lues comme absentes : `charger_empreinte_role` rendait {0,0,0} et la VM +# recevait le MINIMUM. collab-01 s'est retrouvee avec 1 coeur / 1 Go pour porter +# Nextcloud ET Collabora — elle a cesse de repondre en SSH (2026-08-07). +setops_empreinte: + coeurs: 2 + memoire_mo: 2048 + disque_go: 10 diff --git a/roles/serveur_nextcloud/meta/empreinte.yml b/roles/serveur_nextcloud/meta/empreinte.yml index 58475c0..998ff37 100644 --- a/roles/serveur_nextcloud/meta/empreinte.yml +++ b/roles/serveur_nextcloud/meta/empreinte.yml @@ -1,6 +1,13 @@ --- -# Empreinte de dimensionnement du logiciel (propriété du rôle). Additionnée au socle SE -# par scripts/inventory_rules.py. Nextcloud + PHP-FPM : mémoire modérée, disque data croissant. -coeurs: 2 -memoire_mo: 2048 -disque_go: 20 +# Empreinte ressources du logiciel — dimensionnement VM derive (scripts/instancier.py). +# Sommee au socle SE + marge pour estimer coeurs/RAM/disque de la VM hote. +# Override possible par hote dans le plan (serveurs.yml: coeurs/memoire/disque). +# +# LA CLE `setops_empreinte:` EST OBLIGATOIRE. Declarees a la racine, ces valeurs +# etaient lues comme absentes : `charger_empreinte_role` rendait {0,0,0} et la VM +# recevait le MINIMUM. collab-01 s'est retrouvee avec 1 coeur / 1 Go pour porter +# Nextcloud ET Collabora — elle a cesse de repondre en SSH (2026-08-07). +setops_empreinte: + coeurs: 2 + memoire_mo: 2048 + disque_go: 20 diff --git a/roles/serveur_web_dorsal/meta/empreinte.yml b/roles/serveur_web_dorsal/meta/empreinte.yml index e4e2601..832711d 100644 --- a/roles/serveur_web_dorsal/meta/empreinte.yml +++ b/roles/serveur_web_dorsal/meta/empreinte.yml @@ -1,6 +1,13 @@ --- -# Empreinte de dimensionnement (propriete du role). Webapp dynamique (runtime -# Python/Node + service) : memoire moderee. Ajuster selon les apps hebergees. -coeurs: 1 -memoire_mo: 1024 -disque_go: 10 +# Empreinte ressources du logiciel — dimensionnement VM derive (scripts/instancier.py). +# Sommee au socle SE + marge pour estimer coeurs/RAM/disque de la VM hote. +# Override possible par hote dans le plan (serveurs.yml: coeurs/memoire/disque). +# +# LA CLE `setops_empreinte:` EST OBLIGATOIRE. Declarees a la racine, ces valeurs +# etaient lues comme absentes : `charger_empreinte_role` rendait {0,0,0} et la VM +# recevait le MINIMUM. collab-01 s'est retrouvee avec 1 coeur / 1 Go pour porter +# Nextcloud ET Collabora — elle a cesse de repondre en SSH (2026-08-07). +setops_empreinte: + coeurs: 1 + memoire_mo: 1024 + disque_go: 10 diff --git a/roles/serveur_web_frontal/meta/empreinte.yml b/roles/serveur_web_frontal/meta/empreinte.yml index 31417b9..73960a1 100644 --- a/roles/serveur_web_frontal/meta/empreinte.yml +++ b/roles/serveur_web_frontal/meta/empreinte.yml @@ -1,6 +1,13 @@ --- -# Empreinte de dimensionnement (propriete du role). Site statique servi par -# nginx : tres leger (pas de runtime, pas de BD). -coeurs: 1 -memoire_mo: 512 -disque_go: 10 +# Empreinte ressources du logiciel — dimensionnement VM derive (scripts/instancier.py). +# Sommee au socle SE + marge pour estimer coeurs/RAM/disque de la VM hote. +# Override possible par hote dans le plan (serveurs.yml: coeurs/memoire/disque). +# +# LA CLE `setops_empreinte:` EST OBLIGATOIRE. Declarees a la racine, ces valeurs +# etaient lues comme absentes : `charger_empreinte_role` rendait {0,0,0} et la VM +# recevait le MINIMUM. collab-01 s'est retrouvee avec 1 coeur / 1 Go pour porter +# Nextcloud ET Collabora — elle a cesse de repondre en SSH (2026-08-07). +setops_empreinte: + coeurs: 1 + memoire_mo: 512 + disque_go: 10 diff --git a/scripts/inventory_rules.py b/scripts/inventory_rules.py index f790d98..0a6971d 100644 --- a/scripts/inventory_rules.py +++ b/scripts/inventory_rules.py @@ -621,6 +621,18 @@ def charger_empreinte_role(racine_roles: Path, groupe: str) -> dict | None: emp = (data or {}).get("setops_empreinte") or {} if not isinstance(emp, dict): raise ValueError(f"{fichier}: 'setops_empreinte' doit etre une table.") + # Un fichier qui declare les valeurs A LA RACINE au lieu de sous + # `setops_empreinte:` etait lu comme VIDE : la VM recevait le minimum, en + # silence. Quatre roles etaient dans ce cas, et `collab-01` s'est retrouvee + # avec 1 coeur / 1 Go pour porter Nextcloud ET Collabora — elle a cesse de + # repondre en SSH (2026-08-07). Un fichier qui existe mais ne dit rien est + # pire qu'un fichier absent : le repli, lui, aurait donne des valeurs sensees. + if not emp and any(c in (data or {}) for c in CHAMPS_EMPREINTE): + raise ValueError( + f"{fichier}: les valeurs sont declarees a la racine ; elles doivent " + f"etre sous la cle `setops_empreinte:`. Sans elle, l'empreinte est lue " + f"comme nulle et la VM recoit le minimum." + ) return {cle: int(emp.get(cle, 0)) for cle in CHAMPS_EMPREINTE}