Set-OPS-Public/roles/paquets_tiers/tasks/main.yml
Daniel Allaire 42becd0c02
Some checks are pending
verifier / verifier (push) Waiting to run
paquets tiers : passer par le cache du controleur, plus par Internet
Trois depots tiers etaient en HTTPS, et client_artefacts pose
Acquire::https::Proxy DIRECT — sans quoi le cache du site refuse les tunnels et
aucun depot tiers n est joignable. La ligne est juste ; sa consequence ne l avait
pas ete vue : ces trois depots CONTOURNENT le cache, et chaque VM neuve allait
les chercher sur Internet a sa naissance.

step-cli et alloy sont poses par des integrations UNIVERSELLES. Sans lien, une
machine neuve n obtenait ni son client d autorite ni ses metriques — elle n
entrait dans aucun flux chiffre. Dernier obstacle a une reconstruction hors
ligne, et il tenait dans un mot.

make cacher-paquets tire les 21 deb aux versions epinglees, empreinte SHA256
verifiee depuis l index du depot. Le role partage paquets_tiers les depose et les
installe EN UN SEUL appel a apt — il sait resoudre un ensemble de fichiers locaux
qui se dependent, la ou paquet par paquet echouerait sur l ordre (Icinga en
apporte dix-sept). Six roles branches ; chacun retombe sur le depot distant pour
ce que le cache n a PAS fourni, et rien d autre.

Eprouve pour de vrai : packages.smallstep.com renvoye vers 127.0.0.1, step-cli
desinstalle, cache local efface. Le role rejoue installe 0.30.6-1 depuis le cache
et la machine obtient ses certificats. Zero echec.

Deux defauts de mon propre outil, trouves en le construisant : Smallstep sert son
index NON COMPRESSE (404 sur .gz) donc step-cli n etait jamais mis en cache ; et
un depot injoignable faisait continue AVANT d incrementer le total, si bien que
le script rapportait 20 sur 20 alors qu il en manquait un. Une garde qui ne peut
pas echouer ne garde rien — troisieme fois cette semaine. Corrige puis eprouve en
le faisant echouer.

Reste hors ligne : NTP externe, et l expedition des alertes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
2026-09-05 08:22:14 -04:00

85 lines
3.5 KiB
YAML

---
# DÉGRADER, JAMAIS DEVINER. Sans cache sur le contrôleur, ce rôle ne fait rien et le DIT :
# l'appelant installera depuis le dépôt distant, comme avant. On ne casse pas un
# déploiement connecté parce qu'un cache manque.
- name: Lire le manifeste du cache du contrôleur
ansible.builtin.slurp:
src: "{{ paquets_tiers_cache }}/MANIFESTE"
delegate_to: localhost
become: false
register: paquets_tiers_manifeste
failed_when: false
changed_when: false
# REMISE A ZERO AVANT DE REMPLIR. Un `set_fact` survit au role : appele deux fois dans
# le meme play, ce dictionnaire garderait les paquets du premier appelant et les
# reinstallerait chez le second. Une variable qui traine est une action qu'on ne demande
# plus mais qui a toujours lieu.
- name: Repartir d'un inventaire vide
ansible.builtin.set_fact:
paquets_tiers_disponibles: {}
# Le manifeste porte une ligne `nom=version fichier.deb` par paquet mis en cache. On n'en
# retient que les noms que l'appelant a DEMANDES : un role n'installe pas ce qu'il n'a
# pas declare vouloir, meme si le cache le contient.
- name: Établir ce que le cache peut fournir
ansible.builtin.set_fact:
paquets_tiers_disponibles: >-
{{ paquets_tiers_disponibles
| combine({ (item.split(' ')[0].split('=')[0]): item.split(' ')[1] }) }}
loop: "{{ (paquets_tiers_manifeste.content | default('') | b64decode).splitlines() }}"
when:
- item is search('=')
- item.split(' ') | length > 1
- item.split(' ')[0].split('=')[0] in paquets_tiers_noms
loop_control:
label: "{{ item.split(' ')[0] }}"
- name: Dire que le cache ne couvre pas ces paquets
ansible.builtin.debug:
msg: >-
Aucun paquet en cache pour {{ paquets_tiers_noms | join(', ') }} — ils seront tirés
du dépôt distant. Une reconstruction SANS INTERNET échouera ici.
Lancer `make cacher-paquets` depuis un poste connecté.
when:
- paquets_tiers_noms | length > 0
- paquets_tiers_disponibles | length == 0
- name: Assurer le répertoire des paquets déposés
ansible.builtin.file:
path: "{{ paquets_tiers_dest }}"
state: directory
owner: root
group: root
mode: "0755"
when: paquets_tiers_disponibles | length > 0
- name: Déposer les paquets depuis le cache du contrôleur
ansible.builtin.copy:
src: "{{ paquets_tiers_cache }}/{{ item.value }}"
dest: "{{ paquets_tiers_dest }}/{{ item.value }}"
owner: root
group: root
mode: "0644"
loop: "{{ paquets_tiers_disponibles | dict2items }}"
loop_control:
label: "{{ item.key }}"
# EN UN SEUL APPEL, ET C'EST LE POINT. `apt` sait résoudre un ENSEMBLE de fichiers locaux
# — l'un dépendant de l'autre — alors qu'une installation paquet par paquet échouerait sur
# l'ordre. Icinga en apporte dix-sept qui se dépendent mutuellement : les poser un à un
# demanderait de connaître leur graphe, que seul apt connaît.
#
# Les dépendances Debian, elles, viennent du cache du site en HTTP, comme d'habitude.
- name: Installer les paquets tiers depuis le cache
ansible.builtin.command:
argv: >-
{{ ["apt-get", "install", "-y", "--no-install-recommends"]
+ (paquets_tiers_disponibles.values()
| map('regex_replace', '^', paquets_tiers_dest ~ '/') | list) }}
environment:
DEBIAN_FRONTEND: noninteractive
register: paquets_tiers_pose
changed_when: "'0 nouvellement installés' not in paquets_tiers_pose.stdout
and '0 newly installed' not in paquets_tiers_pose.stdout"
when: paquets_tiers_disponibles | length > 0