Set-OPS-Public/roles/serveur_prometheus/templates/prometheus.yml.j2
Daniel Allaire ffb515cf3c idempotence : Prometheus trie ses cibles, Forgejo conserve son secret JWT
Prometheus : intersect rend un ENSEMBLE, dont l'ordre d'iteration n'est pas
stable d'un processus a l'autre. Le fichier se rendait differemment a chaque
passage — memes cibles, ordre different — et le service redemarrait pour rien.
Trie sur les hotes.

Forgejo : JWT_SECRET est genere par le service et ajoute par lui a la fin
d'app.ini. Le gabarit ne le portait pas, donc chaque rendu l'EFFACAIT et
Forgejo en generait un nouveau. Ce n'etait pas du bruit : chaque deploiement
invalidait les jetons OAuth2 emis par la forge. Le role le relit et le repose ;
meme empreinte avant/apres, changed=0 aux 2e et 3e passages.

Trois erreurs de methode de ma part dans cette enquete :
- conclu « diff vide donc contenu identique » alors que no_log masquait le diff
- applique un replace sur le gabarit SANS verifier qu'il avait pris (la section
  [oauth2] n'existait pas), affiche un succes, et interprete trois passages sur
  cette base
- garde une expression Jinja indiagnosticable en place a cause de no_log

Verifier l'effet, pas l'intention — un replace qui ne trouve rien reussit
silencieusement, exactement comme kcadm -s sur une map.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 14:44:03 -04:00

33 lines
1.4 KiB
Django/Jinja

# Gere par Set-OPS (role serveur_prometheus). Ne pas editer a la main.
global:
scrape_interval: {{ serveur_prometheus_intervalle }}
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
- job_name: node
{% if serveur_prometheus_metriques_tls | default(false) %}
scheme: https
tls_config:
ca_file: {{ serveur_prometheus_metriques_ca }}
{% endif %}
static_configs:
{# `intersect` rend un ENSEMBLE : son ordre d'iteration n'est pas stable d'un
processus Python a l'autre. Sans `sort`, ce fichier se rendait differemment a
chaque passage — memes quatorze cibles, ordre different — et Prometheus etait
redemarre pour rien. Trouve par le passage d'idempotence du 2026-08-09.
On trie sur les HOTES : ordre deterministe et lisible par un humain. #}
- targets: {{ (groups.get(serveur_prometheus_groupe_metriques, []) | intersect(groups.get('hotes_actifs', [])) | sort)
| map('extract', hostvars)
| selectattr('ansible_host', 'defined')
| map(attribute='ansible_host')
| map('regex_replace', '$', ':' ~ serveur_prometheus_port_node)
| list | to_json }}
{% for job in serveur_prometheus_cibles_supplementaires %}
- job_name: {{ job.job }}
static_configs:
- targets: {{ job.cibles | to_json }}
{% endfor %}