Set-OPS-Public/roles/serveur_grafana/defaults/main.yml
Daniel Allaire 311f33d6f6 grafana : les panneaux declares deviennent des tableaux
La moitie qui manquait. Les roles declaraient leurs panneaux, Prometheus en
derivait ses cibles, les expressions repondaient, et rien ne les assemblait.

serveur_grafana lit les memes meta/metriques.yml que serveur_prometheus et en
assemble un tableau par role — la raison du panneau devient sa description dans
Grafana. Moisson des tableaux orphelins, prefixe setops-role- pour ne jamais
toucher un tableau ecrit a la main, JSON valide avant d etre pose (Grafana ne
tombe pas sur un tableau illisible : il le saute en silence).

client_metrique declare quatre panneaux sans exportateur — le cas symetrique.
Celui qui compte : la memoire disponible, depuis que le ballon est actif.

Eprouve sur le site : les deux tableaux charges dans le stockage unifie, un
temoin orphelin retire, les quatre panneaux de flotte a 10 series chacun.

Un panneau etait faux — /var/lib/lxcfs rapporte toujours zero octet libre et un
min() en meurt. Corrige en liste blanche : un montage inconnu manque au graphe,
ce qui se voit, au lieu de l ecraser.

P77 garde la table des unites : une unite inventee retombe sur short, lisible et
fausse. 76 OK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 16:32:30 -04:00

107 lines
5.6 KiB
YAML

---
serveur_grafana_paquets:
- grafana
serveur_grafana_service: "grafana-server"
serveur_grafana_port: 3000
# Publication (derriere serveur_nginx, TLS termine a l'edge).
serveur_grafana_hostname: "grafana.{{ domaine_interne }}"
serveur_grafana_root_url: "https://{{ serveur_grafana_hostname }}/"
# Datasources (Prometheus + Loki, co-localises sur obs-01).
serveur_grafana_prometheus_url: "http://localhost:9090"
serveur_grafana_loki_url: "http://localhost:3100"
# Dashboards provisionnés (fichiers) — répertoire lu par le provider Grafana.
serveur_grafana_dashboards_dir: "/var/lib/grafana/dashboards"
# Secret OBLIGATOIRE (Ansible Vault).
serveur_grafana_admin_password: "{{ vault_grafana_admin | default('') }}" # rempli depuis la voute (vault_grafana_admin)
# --- Connexion locale (accès de secours) ---
# `false` = le formulaire identifiant/mot de passe n'est PAS proposé au repos ; le SSO
# Keycloak est le seul chemin annoncé. Le compte local continue d'exister : on l'atteint
# par `sudo` sur l'hôte (voir docs/authentification.md), qui est le mécanisme de secours
# retenu. Une porte de connexion ouverte en permanence contournerait la politique de mot
# de passe, le MFA et surtout la révocation centrale — désactiver quelqu'un dans LDAP
# laisserait le compte local valide, sans que rien ne le signale.
serveur_grafana_connexion_locale: false
# --- SSO OIDC (Keycloak, realm applicatif) ---
# « Se connecter avec <organisation> » : Grafana délègue l'auth à Keycloak (client confidentiel).
# Requiert client_pki sur ce nœud (confiance step_ca pour les appels serveur→Keycloak) +
# résolution de l'hôte Keycloak (edge). Le client OIDC doit exister dans le realm.
serveur_grafana_oidc_actif: true
serveur_grafana_oidc_nom: "{{ organisation | default('Organisation') }}"
serveur_grafana_oidc_client_id: "grafana"
serveur_grafana_oidc_client_secret: "{{ vault_grafana_oidc | default('') }}" # voûte (vault_grafana_oidc)
serveur_grafana_oidc_realm: "{{ identite_realm | default('chezlepro') }}"
# DERIVE de l'exposition declaree au plan (role `resoudre_idp`) ; repli seulement.
serveur_grafana_oidc_repli: >-
https://keycloak.{{ domaine_interne }}/realms/{{ serveur_grafana_oidc_realm }}
serveur_grafana_oidc_base: >-
{{ (resoudre_idp_base | default(serveur_grafana_oidc_repli)) }}/protocol/openid-connect
serveur_grafana_oidc_scopes: "openid email profile"
# RBAC via SSO : mappe le claim 'roles' (rôles de realm Keycloak) vers le niveau Grafana.
# Défaut : grafana-admin→Admin, grafana-editor→Editor, sinon Viewer. Vider pour désactiver.
serveur_grafana_oidc_role_path: "contains(roles[*], 'grafana-admin') && 'Admin' || contains(roles[*], 'grafana-editor') && 'Editor' || 'Viewer'"
# Depot apt officiel Grafana (partage avec serveur_loki).
serveur_grafana_depot_cle_url: "{{ serveur_grafana_depot_schema }}://apt.grafana.com/gpg-full.key"
serveur_grafana_depot_cle_fichier: "/etc/apt/keyrings/grafana.asc"
serveur_grafana_depot_source: "deb [signed-by=/etc/apt/keyrings/grafana.asc] {{ serveur_grafana_depot_schema }}://apt.grafana.com stable main"
# Empreinte du mot de passe admin APPLIQUE — permet la rotation sans lire le secret
# en place (impossible : il est hache). Voir tasks/main.yml.
serveur_grafana_marqueur_admin: "/etc/grafana/.setops-admin-sha256"
# Chemins du paquet Debian — la CLI ne les devine pas (voir tasks/main.yml).
serveur_grafana_homepath: "/usr/share/grafana"
serveur_grafana_donnees: "/var/lib/grafana"
# --- Sonde de supervision -----------------------------------------------------------
serveur_grafana_sonde_url: "http://127.0.0.1:{{ serveur_grafana_port }}"
# --- SCHEMA DES DEPOTS TIERS (2026-09-10) --------------------------------------------
#
# `http` DES QU'UN CACHE EST DANS LE CHEMIN, `https` sinon. Ce n'est pas un relachement :
# le cache RELAIE ces depots en https vers le fournisseur (voir `serveur_artefacts`,
# `Remap-*`), et l'integrite vient des SIGNATURES du depot, qu'apt verifie de toute facon.
# Le meme raisonnement vaut deja pour `deb.debian.org` depuis toujours.
#
# Sans cette derivation, chaque machine sortait elle-meme sur Internet : le mandataire ne
# vaut que pour `http`, et le socle pose deliberement `Acquire::https::Proxy "DIRECT"`
# parce qu'un cache sans remap refuse les tunnels. Le remap leve ce refus ; encore
# faut-il DEMANDER en http.
#
# DEGRADE, JAMAIS DEVINE : pas de cache d'amorcage declare, pas de reecriture.
serveur_grafana_depot_schema: >-
{{ 'http' if (artefacts_amorcage | default('') | string | length > 0) else 'https' }}
# --- LES TABLEAUX DERIVES DES ROLES (2026-09-14) --------------------------------------
#
# TRADUCTION DES UNITES : ce qu'un role ECRIT dans son `meta/metriques.yml` vers ce que
# Grafana COMPREND. Un role parle sa langue — « octets », « connexions » — et n'a pas a
# connaitre la nomenclature de Grafana ; c'est le moteur qui traduit, comme partout ici.
#
# UNE UNITE ABSENTE DE CETTE TABLE retombe sur `short`, et le graphe reste lisible. Mais
# elle ne passe pas inapercue : P77 refuse une unite que cette table ne connait pas.
serveur_grafana_unites:
octets: bytes
octets_par_seconde: Bps
secondes: s
millisecondes: ms
ratio: percentunit
pourcent: percent
connexions: short
requetes: short
messages: short
tps: ops
operations_par_seconde: ops
nombre: short
# LE PREFIXE DES TABLEAUX DERIVES. Il sert a la MOISSON : tout fichier qui le porte et
# qu'aucun role ne declare plus est retire. Sans ce marqueur on ne saurait pas distinguer
# un tableau derive d'un tableau ecrit a la main (`journaux-flotte.json`), et on effacerait
# le travail de quelqu'un.
serveur_grafana_tableaux_prefixe: "setops-role-"