get_url IGNORE la configuration d apt : le mandataire pose dans /etc/apt/apt.conf.d/ ne vaut que pour apt. Les six cles de signature sortaient donc TOUJOURS en direct, malgre tout le travail sur le remap. Un trou reste ouvert derriere une porte qu on croyait fermee. Et ce n etait pas theorique. Depuis collab-01 : en direct grafana 200 collabora TIMEOUT via le cache collabora 200 La route directe vers Collabora ne passe pas depuis cette zone. Trois cles sur quatre avaient reussi PAR CHANCE, parce que leurs fournisseurs etaient joignables. Le meme geste corrige les deux : plus rien ne sort, et la machine qui n avait pas de route en trouve une. POURQUOI SEULE UNE NAISSANCE POUVAIT LE MONTRER. Mes deploiements de convergence rendaient failed=0 parce que les cles etaient DEJA sur disque et que la tache etait sautee. Le defaut existait depuis le premier commit du remap, invisible a tout deploiement sur une flotte existante. C est l argument de la reconstruction depuis zero, applique a moi-meme. Troisieme reconstruction : 32 minutes, un seul echec - celui-ci. Clonage 3 min 52, zero fatal dans le journal, 963 Mo servis par le cache contre 183 tires de l Internet, soit 81 pourcent servis localement. Et la derive s est effacee toute seule : apt-cacher-ng tournait encore sur forge-01 que plus aucun plan ne declarait. Je proposais de l arreter a la main ; la reconstruction l a fait. Ce qui n est pas au plan n existe pas apres une naissance. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
131 lines
5 KiB
YAML
131 lines
5 KiB
YAML
---
|
|
# LA CONDITION EST ECRITE D'UN SEUL TENANT, ET C'EST DELIBERE.
|
|
#
|
|
# `scripts/verifier_intrants.py` lit les `assert` de la forme `var | length > 0` comme un
|
|
# CONTRAT : l'instance doit fournir cette valeur. Et il ignore volontairement les `when:`
|
|
# — un intrant exige sous condition reste un intrant exige.
|
|
#
|
|
# Ecrite en deux morceaux (`that: var | length > 0` + `when: actif`), cette garde
|
|
# promettait donc un secret pour une console FERMEE, et P32 le refusait a juste titre.
|
|
# Ecrite en une implication, elle dit ce qu'elle veut vraiment dire : SI la console est
|
|
# ouverte, ALORS un mot de passe. Ne pas la « simplifier » en la recoupant en deux.
|
|
- name: Exiger un secret si — et seulement si — la console d'administration est ouverte
|
|
ansible.builtin.assert:
|
|
that:
|
|
- not (serveur_collabora_admin_actif | bool) or (serveur_collabora_admin_mot_de_passe | length > 0)
|
|
fail_msg: >-
|
|
La console d'administration est ouverte mais son mot de passe est vide.
|
|
Le renseigner depuis la voûte de l'instance, ou refermer la console
|
|
(`serveur_collabora_admin_actif: false`).
|
|
|
|
- name: Assurer le repertoire des trousseaux apt
|
|
ansible.builtin.file:
|
|
path: /etc/apt/keyrings
|
|
state: directory
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
|
|
# Récupérée UNE FOIS, comme la clé Smallstep : une plateforme souveraine ne recontacte pas
|
|
# un serveur étranger à chaque déploiement pour une clé déjà installée. Une rotation amont
|
|
# ne passe pas inaperçue pour autant — `apt` refuse alors le dépôt, bruyamment.
|
|
- name: Cette ressource est-elle deja recuperee ? (cle Collabora)
|
|
ansible.builtin.stat:
|
|
path: "{{ serveur_collabora_depot_cle_fichier }}"
|
|
register: serveur_collabora_cle_presente
|
|
|
|
- name: Telecharger la cle de signature Collabora
|
|
when: not serveur_collabora_cle_presente.stat.exists
|
|
ansible.builtin.get_url:
|
|
url: "{{ serveur_collabora_depot_cle_url }}"
|
|
dest: "{{ serveur_collabora_depot_cle_fichier }}"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
timeout: 30
|
|
register: serveur_collabora_cle
|
|
retries: 5
|
|
delay: 6
|
|
until: serveur_collabora_cle is succeeded
|
|
# 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: ""
|
|
|
|
# DEPOT PLAT : `Suites: ./`, aucun composant. Une source classique ne le trouverait pas.
|
|
- name: Ajouter le depot apt Collabora
|
|
ansible.builtin.template:
|
|
src: collabora.sources.j2
|
|
dest: /etc/apt/sources.list.d/collabora.sources
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
|
|
- name: Installer Collabora Online
|
|
when: not ansible_check_mode # dry-run : le depot n'est pas reellement ajoute
|
|
ansible.builtin.apt:
|
|
name: "{{ serveur_collabora_paquets }}"
|
|
state: present
|
|
update_cache: true
|
|
|
|
- name: Assurer le repertoire du fragment systemd
|
|
ansible.builtin.file:
|
|
path: "{{ serveur_collabora_fragment | dirname }}"
|
|
state: directory
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
|
|
# LA CONFIGURATION DE SET-OPS TIENT EN UN FICHIER, et le coolwsd.xml du paquet reste
|
|
# intact. Voir defaults/main.yml pour le raisonnement.
|
|
- name: Deployer la surcharge Set-OPS
|
|
ansible.builtin.template:
|
|
src: setops.conf.j2
|
|
dest: "{{ serveur_collabora_fragment }}"
|
|
owner: root
|
|
group: root
|
|
mode: "0640"
|
|
notify: Redemarrer Collabora
|
|
|
|
- name: Appliquer les redemarrages avant de verifier
|
|
ansible.builtin.meta: flush_handlers
|
|
|
|
- name: Activer et demarrer Collabora
|
|
when: not ansible_check_mode
|
|
ansible.builtin.systemd:
|
|
name: "{{ serveur_collabora_service }}"
|
|
enabled: true
|
|
state: started
|
|
daemon_reload: true
|
|
|
|
# ECRIRE, PUIS RELIRE (D-68). Un service « active » qui ne repond pas a `capabilities`
|
|
# est un vert sur un perimetre vide : Nextcloud le decouvrirait a la premiere ouverture
|
|
# de document, c'est-a-dire devant un usager.
|
|
- name: Collabora repond-il vraiment ?
|
|
when: not ansible_check_mode
|
|
ansible.builtin.uri:
|
|
url: "http://127.0.0.1:{{ serveur_collabora_port }}/hosting/capabilities"
|
|
status_code: [200]
|
|
timeout: 20
|
|
register: serveur_collabora_capacites
|
|
retries: 12
|
|
delay: 5
|
|
until: serveur_collabora_capacites is succeeded
|