--- # LE RATTRAPAGE HERITE DU GABARIT (2026-10-08). # # `apt-daily.timer` et `apt-daily-upgrade.timer` sont PERSISTANTS : systemd garde la date # de leur dernier passage (`/var/lib/systemd/timers/stamp-*`) et rattrape un passage # manque. Une VM clonee herite de ces traces — celle d'`apt-daily` datait du 2026-06-21, # jour de fabrication du gabarit. Elle « rattrape » donc des son demarrage, avec un delai # aleatoire jusqu'a 60 min : a la reconstruction de Technolibre, `apt-daily-upgrade` est # parti cinq minutes apres la naissance d'`infra-pki-01`, en pleine serie d'operations apt # du role. Il tenait le verrou du CACHE DES ARCHIVES, qu'`apt-get` n'attend jamais # (`DPkg::Lock::Timeout` ne couvre que dpkg) : # # 'apt-get autoremove' failed: E: Could not get lock /var/cache/apt/archives/lock. # # Une trace plus ancienne que la naissance de la machine n'est pas la sienne : on la remet a # l'heure, et on relance le minuteur, qui recalcule son prochain passage (le matin suivant) # sans rattraper. Les mises a jour automatiques restent armees (decision du 2026-09-11) ; # seul disparait un passage herite. Sur une machine en service, la trace est recente : # rien ne change. - name: Naissance de la machine (cle d'hote SSH, posee au premier demarrage) ansible.builtin.stat: path: /etc/ssh/ssh_host_ed25519_key.pub register: common_packages_naissance - name: Traces des minuteurs apt persistants ansible.builtin.stat: path: "/var/lib/systemd/timers/stamp-{{ item }}" loop: "{{ common_packages_unites_maj_auto | select('match', '.*[.]timer$') | list }}" register: common_packages_traces - name: Remettre a l'heure une trace heritee du gabarit ansible.builtin.file: path: "{{ item.stat.path }}" state: touch mode: "0644" loop: >- {{ common_packages_traces.results | selectattr('stat.exists') | selectattr('stat.mtime', 'lt', common_packages_naissance.stat.mtime | default(0)) | list }} loop_control: label: "{{ item.item }}" register: common_packages_traces_remises when: common_packages_naissance.stat.exists # Relancer recalcule le prochain passage d'apres la trace neuve. Relancer un minuteur ne # declenche pas sa cible. - name: Relancer les minuteurs dont la trace a ete remise ansible.builtin.systemd_service: name: "{{ item.item.item }}" state: restarted loop: "{{ common_packages_traces_remises.results | default([]) | selectattr('changed') | list }}" loop_control: label: "{{ item.item.item }}" # UN PASSAGE DEJA PARTI se termine avant nos operations apt, plutot que de se les disputer. # `is-active` rend 0 si l'une au moins des unites tourne. - name: Attendre la fin d'un passage apt automatique deja en cours ansible.builtin.command: argv: ["systemctl", "is-active", "--quiet", "apt-daily.service", "apt-daily-upgrade.service"] register: common_packages_passage changed_when: false failed_when: false until: common_packages_passage.rc != 0 retries: 30 delay: 10