--- - name: Assurer le repertoire des trousseaux apt ansible.builtin.file: path: /etc/apt/keyrings state: directory owner: root group: root mode: "0755" # Recuperee UNE FOIS. Sans garde, chaque deploiement recontactait le serveur du # fournisseur : cinq cles x quatorze hotes = soixante-dix allers-retours externes pour # des cles deja installees, et autant d'occasions qu'un tiers lent fasse tomber le # deploiement. Arbitrage rendu le 2026-08-09 : une plateforme souveraine ne depend pas # de six serveurs etrangers pour redeployer ce qu'elle possede deja. # # CONSEQUENCE ASSUMEE : une rotation de cle amont n'est plus recuperee toute seule. Elle # ne passe pas inapercue pour autant — `apt` refuse alors le depot, bruyamment. Pour # forcer le rafraichissement : supprimer le fichier et rejouer le role. - name: Cette ressource est-elle deja recuperee ? (Telecharger la cle de signature Gr) ansible.builtin.stat: path: "{{ client_journal_depot_cle_fichier }}" register: telecharger_la_cle_de_signature_grafana_present - name: Telecharger la cle de signature Grafana when: not telecharger_la_cle_de_signature_grafana_present.stat.exists ansible.builtin.get_url: url: "{{ client_journal_depot_cle_url }}" dest: "{{ client_journal_depot_cle_fichier }}" owner: root group: root mode: "0644" # LA CLE PASSE PAR LE CACHE, ELLE AUSSI (mesure du 2026-09-10). # # `get_url` ignore la configuration d'apt : le mandataire pose dans # `/etc/apt/apt.conf.d/` ne vaut que pour apt. Les cles de signature sortaient donc # TOUJOURS en direct, meme apres que tous les depots soient passes par le cache — un # trou reste ouvert derriere une porte qu'on croyait fermee. # # Et ce n'est pas theorique : depuis `collab-01`, la route directe vers # `www.collaboraoffice.com` EXPIRE, quand le cache l'atteint sans peine. # # en direct grafana 200 collabora TIMEOUT # via le cache collabora 200 # # Le meme geste corrige donc les deux : plus rien ne sort, et la machine qui n'avait # pas de route en trouve une. # # DEGRADE, JAMAIS DEVINE : sans cache d'amorcage declare, la valeur est VIDE et # `get_url` sort en direct comme avant. On n'invente pas un mandataire. environment: http_proxy: >- {{ ('http://' ~ artefacts_amorcage) if (artefacts_amorcage | default('') | string | length > 0) else '' }} https_proxy: "" # `apt_repository` AJOUTE, IL NE REMPLACE PAS (mesure du 2026-09-10). # # Passer une source de `https://` a `http://` y ecrit une SECONDE ligne au lieu de # corriger la premiere. apt interroge alors les deux — et l'ancienne continue de sortir # en direct sur Internet, ce que le passage au cache visait justement a supprimer. Le # symptome le disait, sur les quatorze machines : # # W: La cible Packages est specifiee plusieurs fois dans grafana.list:1 et :2 # # On retire donc explicitement la forme precedente. `state: absent` ne mord que si la # ligne existe : sur une machine neuve, cette tache ne fait rien. - name: Retirer la forme HTTPS du depot (elle contournait le cache) ansible.builtin.apt_repository: repo: "{{ client_journal_depot_source | replace('http://', 'https://') }}" filename: grafana state: absent when: client_journal_depot_schema == 'http' - name: Ajouter le depot apt Grafana ansible.builtin.apt_repository: repo: "{{ client_journal_depot_source }}" filename: grafana state: present # LE CACHE DU CONTROLEUR D'ABORD, LE DEPOT DISTANT POUR LE RESTE (2026-09-03). # # Les depots tiers sont en HTTPS, et `client_artefacts` pose # `Acquire::https::Proxy "DIRECT"` — ils CONTOURNENT donc le cache du site et sortent sur # Internet a chaque construction de VM. `make cacher-paquets` les tire une fois, versions # epinglees et empreintes verifiees ; ce role les depose depuis ce cache. - name: Poser les paquets tiers depuis le cache du controleur ansible.builtin.include_role: name: paquets_tiers vars: paquets_tiers_noms: "{{ client_journal_paquets }}" - name: Installer Grafana Alloy ansible.builtin.apt: # CE QUE LE CACHE N'A PAS FOURNI, ET RIEN D'AUTRE. Les dependances Debian passent # par le cache du site en HTTP ; seuls les paquets tiers non caches exigent Internet. # Reinstaller ce que le cache vient de poser ferait un `update_cache` inutile — et # hors ligne, il echouerait APRES un travail deja fait. name: "{{ client_journal_paquets | difference((paquets_tiers_disponibles | default({})).keys() | list) }}" state: present update_cache: true when: (client_journal_paquets | difference((paquets_tiers_disponibles | default({})).keys() | list)) | length > 0 - name: Autoriser Alloy a lire le journal systeme ansible.builtin.user: name: "{{ client_journal_utilisateur }}" groups: systemd-journal append: true notify: Redemarrer alloy - name: Deployer la configuration Alloy ansible.builtin.template: src: config.alloy.j2 dest: "{{ client_journal_config }}" owner: root group: "{{ client_journal_utilisateur }}" mode: "0640" notify: Redemarrer alloy # Le port d'ecoute est IMPOSE ici plutot que subi : voir defaults/main.yml. - name: Imposer le port de l interface locale d Alloy ansible.builtin.lineinfile: path: /etc/default/alloy regexp: "^CUSTOM_ARGS=" line: >- CUSTOM_ARGS="--server.http.listen-addr={{ client_journal_http_adresse }}:{{ client_journal_http_port }}" create: false notify: Redemarrer alloy - name: Activer et demarrer Alloy ansible.builtin.systemd: name: "{{ client_journal_service }}" enabled: true state: started # LA SONDE VIT AVEC LE ROLE QU'ELLE MESURE (docs/supervision-conception.md). Le porteur # `client_sante` fait tourner tout ce qui vit dans ce repertoire ; il n'a pas a savoir ce # que celle-ci mesure. - 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" # La sonde compare le compteur de lignes jetees a celui du passage precedent : il lui # faut un endroit ou s'en souvenir. `/var/lib`, parce que ce n'est pas un cache — le # perdre ferait passer une cicatrice ancienne pour une perte en cours. - 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 d expedition des journaux ansible.builtin.template: src: sonde-journaux.sh.j2 dest: /usr/local/lib/setops/sondes/journaux.sh owner: root group: root mode: "0750"