--- # CE QUE LA FORGE DU SITE PORTE, FACE A CE QUE LE POSTE PORTE. # # La forge du SITE fait autorite pour le genome (D-81). Toute autre copie est un miroir. # Encore faut-il que cette autorite soit A JOUR — et la derive ne se voit pas toute seule. # # Mesure du 2026-08-26 : la forge etait restee quatre commits derriere le poste sans que # rien ne le signale. Le runner clonait donc un moteur perime, dont le correctif qui # desarme le pare-feu Proxmox. Un ecosysteme qui se reproduit depuis une forge en retard # reproduit ses defauts. # # Cette cible ne corrige rien : elle REGARDE. `make genome-pousser` corrige. # # make genome-etat - name: Ce que la forge du site porte, face au poste hosts: serveur_ops_site gather_facts: false vars: genome_racine: "{{ serveur_ops_racine | default('/opt/setops') }}" genome_freres: "{{ playbook_dir | dirname | dirname | dirname }}" genome_moteur: "{{ (serveur_ops_depots | selectattr('role', 'eq', 'moteur') | first).dest }}" tasks: - name: Voir lesquels de ces dépôts existent sur le contrôleur ansible.builtin.stat: path: "{{ genome_freres }}/{{ item.dest }}/.git" delegate_to: localhost become: false loop: "{{ serveur_ops_depots | default([]) }}" loop_control: label: "{{ item.dest }}" register: genome_locaux - name: Retenir ceux qu'on peut comparer ansible.builtin.set_fact: genome_compares: >- {{ genome_locaux.results | selectattr('stat.exists') | map(attribute='item') | list }} - name: Ce que le poste porte ansible.builtin.command: argv: - python3 - "{{ genome_freres }}/{{ genome_moteur }}/scripts/genome_colis.py" - etat - "{{ genome_freres }}/{{ item.dest }}" - --branche - "{{ item.branche | default('main') }}" delegate_to: localhost become: false loop: "{{ genome_compares }}" loop_control: label: "{{ item.dest }}" register: genome_ici changed_when: false - name: Ce que la forge porte ansible.builtin.uri: url: >- https://forge.{{ domaine_interne }}/api/v1/repos/{{ serveur_ops_forge_organisation | default('genome') }}/{{ item.depot }}/branches/{{ item.branche | default('main') }} validate_certs: false status_code: [200, 404] loop: "{{ genome_compares }}" loop_control: label: "{{ item.depot }}" register: genome_la_bas # LE PREMIER CONTACT AVEC LA FORGE RATE PARFOIS (mesure du 2026-08-26 : une fois sur # six, poignee TLS expiree, puis cinq reponses de suite). Ce n'est pas le chemin — # il est prouve — c'est l'acceptation TLS apres un temps d'inactivite. On reessaie # plutot que de rendre un verdict sur un alea. retries: 4 delay: 3 until: genome_la_bas is succeeded changed_when: false - name: L'état, dépôt par dépôt ansible.builtin.debug: msg: >- {{ item.depot }} : poste {{ (genome_ici.results[idx].stdout | from_json).courte }} {{ '=' if genome_la_bas.results[idx].status == 200 and genome_la_bas.results[idx].json.commit.id == (genome_ici.results[idx].stdout | from_json).tete else '≠' }} forge {{ genome_la_bas.results[idx].json.commit.id[:7] if genome_la_bas.results[idx].status == 200 else '(absente)' }} {{ '— copie locale NON PROPRE, des commits ne sont pas faits' if not (genome_ici.results[idx].stdout | from_json).propre else '' }} loop: "{{ genome_compares }}" loop_control: label: "{{ item.depot }}" index_var: idx # ON REFUSE PLUTOT QUE DE SIGNALER. Un ecart connu et tolere redevient un ecart oublie ; # et la commande qui le corrige tient en trois mots. - name: La forge fait-elle autorité sur une copie à jour ? ansible.builtin.assert: that: - genome_la_bas.results[idx].status == 200 - genome_la_bas.results[idx].json.commit.id == (genome_ici.results[idx].stdout | from_json).tete fail_msg: >- {{ item.depot }} : la forge du site porte {{ genome_la_bas.results[idx].json.commit.id[:7] if genome_la_bas.results[idx].status == 200 else '(rien — dépôt absent)' }}, le poste porte {{ (genome_ici.results[idx].stdout | from_json).courte }}. La forge du site FAIT AUTORITÉ (D-81) : tant qu'elle est en retard, tout écosystème qui s'y reproduit reproduit un moteur périmé. Corriger avec `make genome-pousser`. success_msg: "{{ item.depot }} : la forge est à jour." loop: "{{ genome_compares }}" loop_control: label: "{{ item.depot }}" index_var: idx