Loki servait en HTTPS, Grafana lui parlait en clair : la variable host restait vide et aucun panneau ne s affichait. URL derivee de serveur_loki_tls_actif. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
119 lines
6.6 KiB
YAML
119 lines
6.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"
|
|
# L'URL DE LOKI SUIT L'INTERRUPTEUR TLS DE LOKI (2026-09-28). Elle etait ecrite en dur,
|
|
# `http://localhost:3100`, alors que les locataires activent `serveur_loki_tls_actif` : Loki
|
|
# servait en HTTPS, Grafana lui parlait en clair, et Loki coupait la connexion. Les tableaux
|
|
# construisent leur variable `host` depuis Loki — elle restait vide, et AUCUN panneau
|
|
# n'affichait rien, Prometheus compris. Meme defaut que la sonde de Loki, corrige pour elle
|
|
# le 2026-09-10 : un parametre qui ne suit pas l'interrupteur dont il depend.
|
|
# En TLS, le NOM qui est dans le certificat (le FQDN) — pas `localhost`, qui n'y est pas.
|
|
# L'autorite interne est dans le magasin de confiance du systeme : Grafana verifie.
|
|
serveur_grafana_loki_hote: "{{ (groups.get('serveur_loki') or [inventory_hostname]) | first }}"
|
|
serveur_grafana_loki_tls: "{{ hostvars[serveur_grafana_loki_hote].serveur_loki_tls_actif | default(false) | bool }}"
|
|
serveur_grafana_loki_url: >-
|
|
{{ ('https://' ~ serveur_grafana_loki_hote ~ '.' ~ domaine_interne)
|
|
if serveur_grafana_loki_tls | bool else '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-"
|