journaux : le bruit de sonde du courriel filtré ; make appliquer accepte ARGS

- client_journal : sept stage.drop de plus pour Postfix (connect, lost
  connection after CONNECT, disconnect commands=0/0, SSL_accept error) et
  Dovecot LMTP ; phrase exacte, seulement depuis une machine sondeuse
- éprouvé sur une heure réelle de Chezlepro (69 % jeté, 96 % sur
  edge-mta-01, le scanner externe reste visible) et avec le binaire Alloy
  1.20.1 (9 lignes de sonde jetées, 7 légitimes reçues)
- Makefile : appliquer passe ARGS, comme site-appliquer
- CHANGELOG 63 : mesure des locataires ; cache de paquets du poste plus
  vieux qu'eux (alloy 1.19.2 / loki 3.7.7 contre 1.20.1 / 3.7.8)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-10-03 19:01:07 -04:00
parent 8d40c687e1
commit b4ae92c03f
3 changed files with 96 additions and 1 deletions

View file

@ -1,5 +1,54 @@
# CHANGELOG — Set-OPS
## 2026-10-03 (63) — Les locataires mesurés : même bruit, et le courriel en ajoute
**Demande de l'exploitant** : mesurer chez les deux locataires les défauts corrigés au site
(62), puis y appliquer les correctifs.
**Mesuré (une heure, depuis chaque `obs-01`)** — identique chez Chezlepro et Technolibre :
sonde SSH 635 lignes/h **par machine** (environ 65 % de son journal) ; sonde TLS 53/h par
machine, environ 650 sur `obs-01` et `infra-pki-01` ; audit de `node_exporter` à 31-35 % ;
Loki qui se relit (100 à 186 lignes/h) ; aucune unité en échec, donc pas de reste à la
façon des hyperviseurs. Environ 500 000 lignes de journal par jour et par locataire.
**Ce que le site n'avait pas : le courriel.** Postfix (`edge-mta-01`) écrit trois lignes par
connexion de sonde — `connect`, `lost connection after CONNECT`, `disconnect … commands=0/0` —
et une quatrième sur le port chiffré (`SSL_accept error`) : 7 000 lignes par heure, la
machine la plus bavarde de chaque locataire. Dovecot LMTP (`infra-mail-01`) en ajoute
environ 105, dont une sur deux étiquetée `Error`. **Fait** : sept `stage.drop` de plus, même
règle qu'en 62 — la phrase exacte, et seulement depuis une machine sondeuse. Une vraie session
venue de la flotte ne perd que sa ligne `connect from` (son `client=` et son `disconnect`
compté en `commands=N/M` restent) ; un échec TLS LMTP autre que « fermé avant de commencer »
passe.
**Éprouvé avant d'écrire, deux fois.** Sur une heure de journaux réels de Chezlepro : 69 % de
lignes jetées (96 % sur `edge-mta-01`), et le balayeur externe (`censys-scanner.com`) reste
visible. Puis avec le binaire Alloy (v1.20.1, sur `edge-mta-01`) : un fichier de 16 lignes
témoins à travers le même `loki.process` vers `loki.echo` — les 9 lignes de sonde jetées, les
7 légitimes reçues (source externe, `[preauth]`, certificat refusé, scanner, vraie session
SMTP, vrai échec TLS LMTP, témoin de fin).
**`make appliquer` accepte `ARGS`**, comme `site-appliquer` : simuler (`--check --diff`)
passe par la même porte que l'application.
**Trouvé en simulant : le cache de paquets du poste est plus vieux que les locataires.** Ils
portent `alloy 1.20.1` et `loki 3.7.8` (tirés à la reconstruction du 2026-10-01) ; le cache
du poste fournit `1.19.2` et `3.7.7`. La simulation saute l'`apt-get install` : elle ne
montre rien. En réel, `paquets_tiers` tenterait une rétrogradation. Contournement pour ce
passage : `-e paquets_tiers_cache=/dev/null/aucun` — le rôle se dégrade comme prévu (aucun
manifeste, rien à déposer) et les paquets en place ne bougent pas. Remède de fond : `make
cacher-paquets` depuis le poste.
**Non appliqué chez les locataires** : le déploiement depuis le poste a été refusé par le
contrôle des permissions de l'assistant ; il reste à lancer par l'exploitant (simulé chez
Chezlepro : 0 échec ; seuls changent la config Loki, la config Alloy et les règles d'audit).
**Vu au passage, non traité** : Icinga Web ne trouve pas sa base de configuration chez les
deux locataires depuis leur reconstruction (`Please check if a db instance exists at all`,
145/h chez Chezlepro tant qu'une page de la vigie est ouverte).
**Validation** : `ansible-lint` (0 violation), `make verifier` conforme (83/83).
## 2026-10-03 (62) — Le site parlait trop dans ses journaux, et trois hyperviseurs échouaient en silence
**Demande de l'exploitant** : analyser les journaux centralisés (Loki) et les événements

View file

@ -552,7 +552,9 @@ appliquer: ansible-runtime ## Applique un groupe a la flotte — GROUPE=<groupe>
exit 2; \
fi
python3 scripts/inventory_host.py --inventaire $(INVENTAIRE_PRODUCTION) --dependances $(FICHIER_DEPENDANCES) verifier-dependances-groupe --groupe $(GROUPE)
ansible-playbook -i $(INVENTAIRE_PRODUCTION) "$(DOSSIER_PLAYBOOKS_GROUPES)/$(GROUPE).yml" --limit '$(GROUPE):&$(GROUPE_HOTES_ACTIFS)'
@# `ARGS` comme chez `site-appliquer` (2026-10-03) : simuler (`ARGS="--check --diff"`)
@# avant d'appliquer doit etre possible par la meme porte que l'application elle-meme.
ansible-playbook -i $(INVENTAIRE_PRODUCTION) "$(DOSSIER_PLAYBOOKS_GROUPES)/$(GROUPE).yml" --limit '$(GROUPE):&$(GROUPE_HOTES_ACTIFS)' $(ARGS)
# ATTENDRE PLUTOT QUE CONSTATER (2026-08-27). `deployer` faisait un `ping` unique
# (`_verifier-acces-hote`). Depuis que `creer-vm` ne guette plus le SSH — il prouve la

View file

@ -41,6 +41,50 @@ loki.process "sondes" {
expression = "TLS handshake error from ({{ sondeurs }}):[0-9]+: EOF$"
drop_counter_reason = "sonde_connectivite"
}
// LE COURRIEL PARLE PLUS QUE LES AUTRES (mesure chez les deux locataires, 2026-10-03).
// Postfix ecrit trois lignes par connexion de sonde — quatre sur le port chiffre — et
// faisait de `edge-mta-01` la machine la plus bavarde de chaque locataire (7 000 lignes
// par heure). Une VRAIE session venue de la flotte perd sa ligne `connect from`, rien
// d'autre : ses identifiants de file (`client=`), et son `disconnect` qui compte des
// commandes (`commands=N/M`, jamais `0/0`), restent.
stage.drop {
expression = "^connect from [^\\[ ]+\\[({{ sondeurs }})\\]$"
drop_counter_reason = "sonde_connectivite"
}
stage.drop {
expression = "^(NOQUEUE: )?lost connection after CONNECT from [^\\[ ]+\\[({{ sondeurs }})\\]$"
drop_counter_reason = "sonde_connectivite"
}
stage.drop {
expression = "^disconnect from [^\\[ ]+\\[({{ sondeurs }})\\] commands=0/0$"
drop_counter_reason = "sonde_connectivite"
}
stage.drop {
expression = "^SSL_accept error from [^\\[ ]+\\[({{ sondeurs }})\\]: lost connection$"
drop_counter_reason = "sonde_connectivite"
}
// Dovecot LMTP, en TLS des l'accueil : la sonde ferme avant la poignee. Seule la forme
// « fermee avant de commencer » est jetee ; toute autre raison d'echec TLS passe, et une
// livraison reelle se lit toujours a `saved mail to`.
stage.drop {
expression = "^lmtp\\([0-9]+\\): Connect from ({{ sondeurs }})$"
drop_counter_reason = "sonde_connectivite"
}
stage.drop {
expression = "^lmtp\\([0-9]+\\): Error: lmtp-server: conn ({{ sondeurs }}):[0-9]+ \\[[0-9]+\\]: SSL handshake failed: Connection closed$"
drop_counter_reason = "sonde_connectivite"
}
stage.drop {
expression = "^lmtp\\([0-9]+\\): Disconnect from ({{ sondeurs }}): SSL Initialization failed \\(state=GREETING\\)$"
drop_counter_reason = "sonde_connectivite"
}
}
{% endif %}