Set-OPS-Public/roles/common_packages/tasks/main.yml
Daniel Allaire a60b69f072 un fichier vide existe, et une sonde pour les correctifs
LA GARDE FICHIER ENTIER, en deux corrections. Un telechargement
interrompu laisse un fichier de zero octet QUI EXISTE, et toutes les gardes
demandaient seulement s il etait la. infra-mail-01 a garde une cle
smallstep de 0 octet apres l epreuve hors ligne.

La premiere correction n a pas suffi. Ajouter le controle de taille faisait
bien s executer la tache - et le fichier faisait toujours 0 octet au
passage suivant. get_url sur une destination existante emet une requete
CONDITIONNELLE : l amont repond non modifie, le module rend ok, la ruine
reste. Le play etait vert et ne reparait rien. Il faut effacer avant de
redemander.

Controle negatif : 0 -> 1022 octets, 0 erreur apt. Cinq roles.

LA SONDE CORRECTIFS, 23e. Set-OPS desarme unattended-upgrades et applique
les correctifs au deploiement - choix defendable, le verrou dpkg a fait
decrocher une machine d une reconstruction entiere le matin meme. Mais rien
ne disait QUAND le geste etait du : une flotte pouvait deriver des mois en
restant verte.

Elle mesure les paquets de securite en attente ET depuis quand. Elle ne
lance pas apt-get update - une sonde qui rafraichit l index toutes les
quinze minutes deviendrait la cause de la panne qu elle surveille. Et le
seuil de 72 h est un choix d exploitation, pas une derivation : le
mecanisme qui applique les correctifs est un geste humain.

P64 REFUSAIT UNE DECLARATION CORRECTE. serveur_debian et serveur_durci sont
des roles de declaration pure, sans une tache ; le travail est fait par les
roles que leur playbook applique. La preuve exigeait declaration et depot
dans le meme role - vrai des vingt-deux premieres sondes, faux des qu une
sonde appartient au socle. Une garde qui force a contourner ce qu elle
protege est un defaut. Elle suit desormais le playbook du groupe.

Mesure : 21/21 machines vertes, 65 preuves, 23 sondes, 0 echec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 17:26:35 -04:00

99 lines
3.9 KiB
YAML

---
# `lock_timeout` sur CHAQUE tache apt : au premier demarrage, l'image Debian lance ses
# propres mises a jour (apt-daily, unattended-upgrades) et tient le verrou dpkg par
# vagues. Sans attente, la premiere tache echoue sur un verrou — pas sur une vraie
# erreur — et le deploiement d'une VM neuve devient un tirage au sort.
#
# Attendre ici plutot que seulement avant le playbook : le verrou peut etre repris
# ENTRE deux taches, ce qu'une verification ponctuelle en amont ne peut pas empecher.
# DÉSARMER AVANT TOUTE OPÉRATION APT, ET NON APRÈS.
#
# Une tâche apt placée avant celle-ci attendrait le verrou que celle-ci doit justement
# libérer — l'ordre n'est pas cosmétique. `state: stopped` en plus de `masked` : masquer
# empêche un démarrage futur, pas celui qui est déjà en cours.
- name: Désarmer les mises à jour automatiques de Debian (Set-OPS les applique lui-même)
ansible.builtin.systemd_service:
name: "{{ item }}"
state: stopped
enabled: false
masked: true
loop: "{{ common_packages_unites_maj_auto }}"
when: common_packages_desarmer_maj_auto | bool
failed_when: false # une unite absente n'est pas une faute : elle est desarmee
# EFFACER LA TRACE QUE LE DESARMEMENT LAISSE (mesure du 2026-08-30).
#
# Masquer le service pendant que son timer TOURNE lui fait perdre sa cible. systemd le
# note, et le garde :
#
# apt-daily.timer: Unit to trigger vanished.
# apt-daily.timer: Failed with result 'resources'.
#
# `state: stopped` n'efface pas un etat `failed` — seul `reset-failed` le fait. Sans lui,
# CHAQUE machine porte deux unites en echec permanent. Constate sur les quinze de
# Chezlepro : `systemctl list-units --state=failed` en rend deux partout.
#
# CE N'EST PAS COSMETIQUE. Une supervision qui compte les unites en echec compte ces
# deux-la pour toujours — et le jour ou une VRAIE panne s'ajoute, elle se noie dans un
# bruit qu'on a appris a ignorer. C'est le meme defaut que le journal de la frontiere
# noye sous 982 000 entrees : ce qui ment le plus n'est pas ce qui se tait, c'est ce qui
# crie sans raison.
- name: Effacer l'etat d'echec laisse par le desarmement
ansible.builtin.command:
argv: ["systemctl", "reset-failed", "{{ item }}"]
loop: "{{ common_packages_unites_maj_auto }}"
register: common_packages_reset
changed_when: false
failed_when: false # rien a effacer n'est pas une faute
when: common_packages_desarmer_maj_auto | bool
- name: Mettre à jour le cache APT
ansible.builtin.apt:
update_cache: true
cache_valid_time: 3600
lock_timeout: "{{ common_packages_lock_timeout }}"
- name: Appliquer les mises à jour disponibles
ansible.builtin.apt:
upgrade: full
lock_timeout: "{{ common_packages_lock_timeout }}"
- name: Installer les paquets communs
ansible.builtin.apt:
name: "{{ common_packages_list }}"
state: present
lock_timeout: "{{ common_packages_lock_timeout }}"
- name: Supprimer les dépendances devenues inutiles
ansible.builtin.apt:
autoremove: true
lock_timeout: "{{ common_packages_lock_timeout }}"
# LA SONDE SE DEPOSE ICI, ELLE SE DECLARE AILLEURS (`roles/serveur_debian/meta/`).
# Ce role est celui qui APPLIQUE les mises a jour ; il est donc le bon porteur. Mais la
# derivation des services d'Icinga croise les GROUPES, et `common_packages` n'en est pas
# un — d'ou la separation, expliquee dans la declaration.
- name: Assurer le repertoire des sondes de supervision
ansible.builtin.file:
path: /usr/local/lib/setops/sondes
state: directory
owner: root
group: root
mode: "0755"
- name: Assurer le repertoire d etat des sondes
ansible.builtin.file:
path: /var/lib/setops
state: directory
owner: root
group: root
mode: "0750"
- name: Deposer la sonde des correctifs de securite
ansible.builtin.template:
src: sonde-correctifs.sh.j2
dest: /usr/local/lib/setops/sondes/correctifs.sh
owner: root
group: root
mode: "0750"