Mode opératoire — Superviser un lab avec Prometheus, et y ajouter une machine en une commande
Document autonome. Partie théorique, puis mise en œuvre telle qu’elle a été réalisée et vérifiée les 19, 20 et 21/10/2026 dans le lab pfSense de l’école (phase 14 du suivi, tâches 14.3 et 14.4). La méthode vaut pour toute infrastructure de quelques dizaines de machines (Linux, Windows, MariaDB, pfSense). Le contexte est dans Documentation-pfSense.md (étapes 45 à 47) ; les règles de pare-feu dans Matrice-de-flux.md (§4.4) ; les scripts et fichiers de configuration dans
scripts/supervision/.Valeurs masquées. Aucun mot de passe n’apparaît ici. Le seul compte créé (MariaDB) n’en a pas.
Dernière mise à jour : 28/10/2026 — ajout du §14 (exporteurs PBS et Proxmox VE par leur API) et du §15 (sondes des accès distants Termix et Pangolin) ; l’écran est décrit dans le MO-17 État au 12/11/2026 : 15 machines supervisées (13 par
node_exporter: 12 Linux et pfSense ; 2 Windows), 11 services sondés, exporteurs MariaDB, PBS et Proxmox. Les postes Windows sont déclarés parajouter-poste-windows.sh(phase 21, étape 74).
Sommaire
| § | Contenu |
|---|---|
| 1 | Le besoin |
| 2 | Théorie : Prometheus, exporteurs, sondes, étiquettes |
| 3 | L’architecture retenue |
| 4 | Installer Prometheus |
| 5 | La configuration, et comment la modifier sans risque |
| 6 | Les sondes de service (blackbox exporter) |
| 7 | Ajouter une machine : quelle méthode selon la machine |
| 8 | Ajouter une machine Linux depuis le bastion, en une commande |
| 9 | Ajouter un nœud de base de données MariaDB |
| 10 | Ajouter une machine Windows |
| 11 | Ajouter pfSense |
| 12 | Retirer une machine |
| 13 | Contrôler que tout est mesuré |
| 14 | Superviser PBS et Proxmox VE par leur API |
| 15 | Sonder les accès distants (Termix, Pangolin) |
| 16 | Pièges et checklist |
1 · Le besoin
Le lab compte une quinzaine de machines réparties dans 5 réseaux (VLAN : WEB, BDD, ADM, USERS, et VISITEURS depuis le 30/10) : serveurs web, cluster de bases de données à 3 nœuds, annuaire Active Directory, bastion, serveur de sauvegarde, poste client, pare-feu. Jusqu’ici, savoir si tout allait bien demandait de se connecter machine par machine.
On veut un seul endroit qui sait, en permanence :
- si chaque machine est en vie, et dans quel état (processeur, mémoire, disques, réseau) ;
- si le cluster de bases est complet et synchronisé ;
- si les services répondent comme pour un utilisateur (site web, DNS, sauvegarde) ;
- et qui garde cet historique quelques semaines, pour comparer et alerter.
C’est le rôle de Prometheus. L’écran (Grafana) et les alertes viendront s’appuyer sur lui.
2 · Théorie : Prometheus, exporteurs, sondes, étiquettes
2.1 Le principe : Prometheus va chercher les mesures
toutes les 15 secondes
┌──────────────────┐ « donne-moi tes mesures » ┌──────────────────────────┐
│ PROMETHEUS │ ───────────────────────────► │ exporteur (sur chaque │
│ (srv-metriques) │ ◄─────────────────────────── │ machine) : port 9100, │
│ base de mesures │ texte : cpu=…, ram=…, … │ 9104, 9182… │
└──────────────────┘ └──────────────────────────┘
| Mot | Sens |
|---|---|
| Mesure (métrique) | un nombre qui évolue : charge du processeur, octets reçus, nombre de nœuds du cluster… |
| Exporteur | petit service installé sur la machine, qui publie ses mesures en texte sur un port HTTP (/metrics) |
| Cible (target) | une adresse que Prometheus vient lire (10.0.10.10:9100) |
| Job | un groupe de cibles du même type (node, mysql, windows…) |
| Sonde | un test fait de l’extérieur, comme un utilisateur : « la page répond-elle ? », « le DNS résout-il ? » |
| Étiquette (label) | une information attachée à chaque mesure : host="srv-web-01", zone="WEB", os="linux" |
On dit que Prometheus fonctionne en « pull » (il tire les mesures) : la machine surveillée n’a rien à envoyer, elle attend qu’on la lise. Conséquence pratique : c’est vers les exporteurs qu’il faut ouvrir le pare-feu, depuis Prometheus seulement.
2.2 Deux regards complémentaires
| Regard | Outil | Question | Exemple |
|---|---|---|---|
| De l’intérieur | exporteurs | « comment va la machine ? » | disque plein à 95 % |
| De l’extérieur | sondes (blackbox) | « le service marche-t-il pour l’utilisateur ? » | le site ne répond plus |
Il faut les deux : une machine peut aller très bien et son service être en panne, et inversement.
2.3 Les étiquettes rendent tout lisible
Sans étiquette, une mesure s’appelle 10.0.20.11:9100. Avec, elle s’appelle srv-mysql-02, zone BDD, système linux.
Les tableaux de bord et les alertes s’écrivent ensuite par étiquette : « toutes les machines de la zone BDD », « tous les Windows ».
Principe à retenir — Prometheus lit, il n’administre pas. Le serveur de supervision a le droit de lire les ports des exporteurs, et rien d’autre : pas de SSH vers les machines, pas de compte d’administration. S’il était piraté, il ne donnerait accès à rien.
2.4 Les risques à connaître
| Risque | Parade dans ce lab |
|---|---|
| Un exporteur expose des informations (versions, noms, charge) | écoute sur l’adresse de la machine seulement ; port ouvert à Prometheus seul |
| Un exporteur de base de données a besoin d’un compte | compte sans mot de passe (unix_socket), sans accès aux données |
| Une configuration fausse rechargée = supervision aveugle | copie avant modification + promtool check config avant tout rechargement |
| Le disque de Prometheus se remplit | conservation limitée à 30 jours |
3 · L’architecture retenue
| Élément | Valeur |
|---|---|
| Serveur | srv-metriques — VM 139, Debian 13, 10.0.30.14, VLAN 30 (ADM), 4 vCPU, 2 Gio de RAM, 32 Gio de disque |
| Prometheus | 2.53.3 (paquet Debian), écoute 10.0.30.14:9090, conservation 30 jours, relevé toutes les 15 s |
| Blackbox exporter | 0.26.0 (paquet Debian), écoute 127.0.0.1:9115 (seul Prometheus l’interroge) |
| Déploiement des exporteurs | depuis le bastion srv-docker (10.0.30.12), seul autorisé à ouvrir du SSH vers toutes les zones |
| Exporteur | Port | Où |
|---|---|---|
node_exporter | 9100 | toutes les machines Linux, et pfSense (paquet) |
mysqld_exporter | 9104 | les 3 nœuds MariaDB / Galera |
windows_exporter | 9182 | Active Directory, poste Windows 11 |
Pare-feu pfSense (posé à l’étape 45, une seule règle pour tous les exporteurs) :
| Onglet | Source | Destination | Port | Rôle |
|---|---|---|---|---|
| ADM | SRV_METRIQUES | LAB_NETS | PORTS_EXPORTERS (9100, 9104, 9182) | Prometheus lit les exporteurs de toutes les zones |
| ADM | SRV_METRIQUES | SRV_HA | 443 | la sonde du site web |
Entre machines du même VLAN, pfSense ne voit pas passer le trafic : c’est alors le pare-feu de la machine qui filtre (cas des Windows, §10).
4 · Installer Prometheus
Contexte : VM
srv-metriquesinstallée (Debian 13 minimale, réseau fixe, à jour, accès SSH par clé). Objectif : Prometheus en service, qui ne garde que 30 jours et n’écoute que sur l’adresse du serveur.
4.1 Les paquets
sudo apt install -y --no-install-recommends prometheus prometheus-node-exporter curl
--no-install-recommends: sans lui,prometheus-node-exporterinstalle une trentaine de paquets « recommandés » (smartmontools,ipmitool,nvme-cli…) dont des services inutiles sur une VM. Incident H-25. Si c’est déjà arrivé :sudo apt purge prometheus-node-exporter-collectorspuissudo apt autoremove --purge.
4.2 Conservation et adresse d’écoute
Les options de démarrage sont dans /etc/default/prometheus (ligne ARGS=) :
sudo sed -i 's|^ARGS=.*|ARGS="--storage.tsdb.retention.time=30d --web.listen-address=10.0.30.14:9090"|' /etc/default/prometheus
sudo sed -i 's|^ARGS=.*|ARGS="--web.listen-address=10.0.30.14:9100"|' /etc/default/prometheus-node-exporter
sudo systemctl restart prometheus prometheus-node-exporter
| Réglage | Pourquoi |
|---|---|
retention.time=30d | 15 jours par défaut ; 30 jours suffisent pour comparer deux semaines, et bornent la taille du disque |
listen-address=10.0.30.14:… | jamais * (toutes les adresses) : le service n’est joignable que sur le réseau d’administration |
Validation
curl -s http://10.0.30.14:9090/api/v1/status/flags | grep -o '"storage.tsdb.retention.time":"[^"]*"'
"storage.tsdb.retention.time":"30d"
Le paquet Debian n’inclut que l’ancienne interface web : la page des cibles est
http://10.0.30.14:9090/classic/targets. Ce n’est pas gênant : l’écran de travail sera Grafana.
5 · La configuration, et comment la modifier sans risque
5.1 Le fichier
/etc/prometheus/prometheus.yml — copie de référence : scripts/supervision/prometheus.yml. Ses 8 jobs :
| Job | Quoi | Comment les cibles sont listées |
|---|---|---|
prometheus | Prometheus lui-même | dans le fichier |
node | machines Linux + pfSense | dossier de fiches /etc/prometheus/cibles/node/ |
mysql | nœuds MariaDB | dossier /etc/prometheus/cibles/mysql/ |
windows | machines Windows | dossier /etc/prometheus/cibles/windows/ |
sonde_https, sonde_dns_ad, sonde_dns_resolveur, sonde_site | les 4 sondes (§6) | dans le fichier |
5.2 Les fiches : une machine = un petit fichier
Les jobs node, mysql et windows utilisent file_sd_configs : Prometheus lit tous les fichiers .yml d’un dossier.
- job_name: 'node'
file_sd_configs:
- files:
- '/etc/prometheus/cibles/node/*.yml'
Une fiche (/etc/prometheus/cibles/node/srv-web-01.yml) :
- targets: ['10.0.10.10:9100']
labels:
host: 'srv-web-01'
zone: 'WEB'
os: 'linux'
Principe à retenir — ajouter une fiche ne demande aucun rechargement : Prometheus surveille ses dossiers et prend la nouvelle machine en compte en moins d’une minute. On ne touche à
prometheus.ymlque pour ajouter un type de machine (un job).
5.3 Modifier prometheus.yml : la méthode sûre
Le fichier est écrit sur le PC, puis transféré — jamais collé dans un terminal web (un long collage arrive corrompu, incident H-24).
1. Depuis le PC (PowerShell)
scp "<dossier>\annexes\scripts\supervision\prometheus.yml" ipfixe@10.0.30.14:/tmp/prometheus.yml
2. Sur srv-metriques : copie de l’ancien, installation, contrôles
sudo cp /etc/prometheus/prometheus.yml /etc/prometheus/prometheus.yml.avant-<motif> && sudo install -m 644 -o root -g root /tmp/prometheus.yml /etc/prometheus/prometheus.yml && grep -c job_name /etc/prometheus/prometheus.yml && promtool check config /etc/prometheus/prometheus.yml
le nombre de jobs attendu (8 aujourd’hui), puis SUCCESS. Un avertissement « file … does not exist » sur un dossier de fiches
encore vide est normal.
3. Seulement si SUCCESS
sudo systemctl reload prometheus
Ne jamais recharger sans
promtool. Une configuration invalide n’est pas chargée : Prometheus garde l’ancienne en silence, et l’on croit avoir ajouté une surveillance qui n’existe pas. Le comptage des jobs attrape en plus les blocs en double (incident H-22).
Retour arrière : sudo cp /etc/prometheus/prometheus.yml.avant-<motif> /etc/prometheus/prometheus.yml puis systemctl reload prometheus.
6 · Les sondes de service (blackbox exporter)
6.1 Installation
sudo apt install -y --no-install-recommends prometheus-blackbox-exporter
Configuration /etc/prometheus/blackbox.yml (copie de référence : scripts/supervision/blackbox.yml),
réduite aux modules utilisés :
| Module | Teste | Remarque |
|---|---|---|
http_2xx_insecure | une page web répond en 2xx | ne vérifie pas le certificat (auto-signés dans le lab) : mesure la disponibilité, pas la validité |
tcp_connect | un port TCP accepte la connexion | non utilisé pour l’instant |
dns_ad | l’annuaire résout sio.internal | |
dns_resolveur | pfSense résout www.sio.internal |
Tous en preferred_ip_protocol: "ip4" : le lab n’a pas d’IPv6.
prometheus-blackbox-exporter --config.check --config.file=/etc/prometheus/blackbox.yml
sudo sed -i 's|^ARGS=.*|ARGS="--config.file /etc/prometheus/blackbox.yml --web.listen-address=127.0.0.1:9115 --log.level=warn"|' /etc/default/prometheus-blackbox-exporter
sudo systemctl restart prometheus-blackbox-exporter
L’écoute sur 127.0.0.1 : seul Prometheus, sur la même machine, a besoin de lui parler.
--log.level=warnest indispensable dès que les journaux sont centralisés. Par défaut, le blackbox écrit cinq lignes par sonde réussie (adresse résolue, requête, réponse, temps, succès) : avec 4 sondes toutes les 15 s, plus de 100 000 lignes par jour, qui ont rempli la base des journaux en quelques heures (35 709 lignes le 21/10). Le résultat des sondes est déjà dans Prometheus : les journaux ne gardent que les avertissements et les erreurs.
6.2 Une sonde = un job
Prometheus demande au blackbox « teste telle cible avec tel module ». Les trois lignes de relabel_configs sont toujours les mêmes :
elles mettent la cible en paramètre, la gardent comme nom (instance), et envoient la demande au blackbox.
- job_name: 'sonde_site'
metrics_path: /probe
params:
module: [http_2xx_insecure]
static_configs:
- targets: ['https://www.sio.internal/']
labels:
host: 'srv-ha'
service: 'site-web'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115
| Sonde | Cible | Ce qu’elle prouve |
|---|---|---|
sonde_site | https://www.sio.internal/ | tout le parcours d’un utilisateur : DNS, répartiteur, serveur web, PHP, base |
sonde_dns_ad | 10.0.30.10 | l’annuaire répond |
sonde_dns_resolveur | 10.0.30.1 | le résolveur de pfSense répond |
sonde_https | https://10.0.30.13:8007 | l’interface du serveur de sauvegarde répond |
Une sonde ne doit pas laisser de trace sur le service. Une sonde TCP « brute » sur MariaDB a été abandonnée : elle ouvrait une connexion non authentifiée toutes les 15 s, au risque de faire bloquer l’adresse du répartiteur par MariaDB (incident H-23). L’état du cluster est mesuré par
mysqld_exporter(§9), qui s’authentifie.
Validation
curl -s http://10.0.30.14:9090/api/v1/query --data-urlencode 'query=probe_success' | grep -o '"service":"[^"]*"\|"value":\[[^]]*\]'
chaque service suivi d’une valeur "1". (Commande de lecture standard de l’API, à confirmer au prochain contrôle : À VÉRIFIER.)
7 · Ajouter une machine : quelle méthode selon la machine
| La machine est… | Exporteur | Méthode | § |
|---|---|---|---|
| une VM Linux (Debian) en WEB, BDD ou ADM | node_exporter | une commande depuis le bastion | 8 |
| un nœud MariaDB | node_exporter + mysqld_exporter | §8, puis un compte et un service | 9 |
| une machine Windows | windows_exporter | installeur officiel, pare-feu Windows | 10 |
| pfSense | node_exporter (paquet) | interface web de pfSense | 11 |
Avant toute chose, deux conditions :
| # | Condition | Pourquoi |
|---|---|---|
| 1 | la machine a une adresse fixe (ou une réservation DHCP hors de la plage dynamique) | Prometheus la cherche par son adresse ; si elle change, il la perd (incident H-29) |
| 2 | elle est dans un VLAN du lab (LAB_NETS) | la règle ADM « Metriques vers exporteurs du lab » couvre alors déjà ses ports : aucune règle pfSense à ajouter |
8 · Ajouter une machine Linux depuis le bastion, en une commande
Contexte : une nouvelle VM Debian du lab, joignable en SSH par le compte
ipfixe(membre desudo). Objectif : qu’elle apparaisse dans Prometheus, avec son nom et sa zone, sans rien modifier à la configuration.
8.1 Les deux scripts
| Script | Tourne | Fait |
|---|---|---|
ajouter-machine.sh | sur le bastion srv-docker, compte ipfixe, sans sudo | demande l’adresse et le compte ; déduit la zone de l’adresse ; lit le nom de la machine et le propose ; copie et lance l’installeur ; dépose la fiche sur srv-metriques |
installer-node-exporter.sh | sur la machine ajoutée, en sudo | installe node_exporter sans les paquets recommandés ; l’écoute sur <IP>:9100 ; vérifie (jusqu’à 15 s) ; en zone BDD, télécharge aussi mysqld_exporter |
installer-rsyslog-client.sh (depuis le 21/10) | sur la machine ajoutée, en sudo | envoie une copie de ses journaux à srv-supervision et règle son heure sur pfSense — voir MO-15 §5 |
| Adresse | Zone déduite |
|---|---|
10.0.10.x | WEB |
10.0.20.x | BDD |
10.0.30.x | ADM |
autre (dont 10.0.40.x, USERS) | refusée : le script s’arrête |
Les deux scripts sont sans risque à relancer : une machine déjà équipée est simplement vérifiée, sa fiche réécrite à l’identique.
8.2 Une seule fois : déposer les scripts sur le bastion
Depuis le PC (PowerShell), dans le dossier annexes\scripts\supervision :
ssh ipfixe@10.0.30.12 "mkdir -p ~/supervision"
scp ajouter-machine.sh installer-node-exporter.sh ipfixe@10.0.30.12:~/supervision/
Si PowerShell répond
stat local "ajouter-machine.sh": No such file or directory, il n’est pas dans le bon dossier : donne le chemin complet du fichier. Après toute modification d’un script sur le PC, recopie-le : le bastion garde sinon l’ancienne version.
8.3 Ajouter la machine
Sur srv-docker (Termix) :
cd ~/supervision
bash ajouter-machine.sh 10.0.10.11 ipfixe
(ou bash ajouter-machine.sh seul : le script pose les questions.)
Déroulé et réponses :
| Le script affiche | Tu fais |
|---|---|
Zone : WEB | rien (déduite de l’adresse) |
[email protected]'s password: | mot de passe de connexion de la machine ajoutée (une seule fois : la connexion est réutilisée) |
Nom de la machine [srv-web-02] : | Entrée pour accepter, ou un autre nom (minuscules, chiffres, tirets) |
[sudo] Mot de passe de ipfixe : | mot de passe sudo de la machine ajoutée |
[email protected]'s password: puis [sudo] | ceux de srv-metriques (pour déposer la fiche) |
Attends que l’invite
[sudo]soit affichée avant de taper. Tapé trop tôt, le mot de passe s’affiche en clair à l’écran et dans l’historique du terminal (incident H-28). Un mot de passe affiché doit être changé.
Validation
dans l’ordre : OK : node_exporter ecoute sur 10.0.10.11:9100, la liste des fiches (avec srv-web-02.yml), puis
OK : srv-web-02 est supervise. Prometheus le prend en compte tout seul (moins d'une minute).
89c-ajouter-machine-srv-mysql-02.png
8.4 Cas de la zone BDD : pas d’Internet
Les nœuds de base n’ont pas d’accès Internet (règle BDD « TEMPORAIRE » décochée). Pour installer, on ouvre une fenêtre courte :
| # | Action | Où |
|---|---|---|
| 1 | cocher la règle « TEMPORAIRE - acces internet pour installation MySQL », Apply | pfSense → Firewall → Rules → BDD |
| 2 | lancer le script ; à la question « La regle Internet de la zone BDD est-elle OUVERTE ? », répondre o | bastion |
| 3 | décocher la règle, Apply | pfSense |
| 4 | vérifier sur le nœud : la commande ci-dessous doit répondre ferme | nœud |
timeout 5 bash -c '</dev/tcp/deb.debian.org/80' && echo ouvert || echo ferme
Ne teste pas avec
ping: la règle n’ouvre que TCP 80/443, unping 8.8.8.8échoue même règle ouverte. On teste le protocole que la règle vise.
En zone BDD, le script télécharge aussi mysqld_exporter (sans l’installer) : le §9 se fera ensuite sans rouvrir Internet.
89a-pfsense-bdd-fenetre-ouverte.png · 89d-fenetre-bdd-test-ouvert-ferme.webp · 89e-pfsense-bdd-fenetre-refermee.png
8.5 Si ça ne marche pas
| Message | Cause | Que faire |
|---|---|---|
ssh: connect to host … Connection timed out | mauvaise adresse, ou machine éteinte | vérifier l’adresse ; le script s’arrête de lui-même (incident H-26) |
Permission denied, please try again. | faute de frappe dans le mot de passe | retaper |
ERREUR : … n'est pas dans une zone Linux du lab | adresse hors WEB/BDD/ADM | machine USERS : non prévue par le script |
ERREUR : le port 9100 n'ecoute pas | le service n’a pas démarré | sur la machine : sudo journalctl -u prometheus-node-exporter -n 20 |
la cible reste down dans Prometheus | pare-feu | la machine est-elle bien dans LAB_NETS ? Depuis srv-metriques : curl -s --max-time 5 http://<IP>:9100/metrics | head -3 |
9 · Ajouter un nœud de base de données MariaDB
Contexte : le nœud a déjà
node_exporter(§8), et le paquetprometheus-mysqld-exporterdans son cache (téléchargé par le script en zone BDD). Objectif : mesurer l’état du serveur et du cluster Galera (nœuds présents, synchronisation, connexions).
9.1 Le compte de lecture — une seule fois pour tout le cluster
Sur un nœud, vérifier d’abord le cluster :
sudo mariadb -e "SELECT VERSION(); SHOW STATUS LIKE 'wsrep_cluster_size'; SHOW STATUS LIKE 'wsrep_local_state_comment';"
version ≥ 10.5, wsrep_cluster_size = nombre de nœuds, Synced. Puis :
sudo mariadb -e "CREATE USER IF NOT EXISTS 'prometheus'@'localhost' IDENTIFIED VIA unix_socket; GRANT PROCESS, REPLICATION CLIENT, SLAVE MONITOR ON *.* TO 'prometheus'@'localhost';"
| Choix | Pourquoi |
|---|---|
IDENTIFIED VIA unix_socket | aucun mot de passe : MariaDB accepte la connexion seulement si elle vient de l’utilisateur système prometheus de la machine elle-même |
'prometheus'@'localhost' | inutilisable depuis le réseau |
PROCESS, REPLICATION CLIENT, SLAVE MONITOR | lecture des statistiques seulement. La documentation de l’exporteur ajoute SELECT ON *.* : inutile ici, et il donnerait accès aux données — non accordé |
Galera recopie le compte sur les autres nœuds. sur un autre nœud :
sudo mariadb -e "SHOW GRANTS FOR 'prometheus'@'localhost';"
GRANT PROCESS, BINLOG MONITOR, SLAVE MONITOR ON *.* TO 'prometheus'@'localhost' IDENTIFIED VIA unix_socket (BINLOG MONITOR est le nom actuel de REPLICATION CLIENT).
9.2 L’exporteur — sur chaque nœud
1. Installer et créer le fichier de connexion (sans mot de passe)
sudo apt-get install -y --no-install-recommends prometheus-mysqld-exporter && printf '[client]\nuser=prometheus\nsocket=/run/mysqld/mysqld.sock\n' | sudo tee /etc/mysql/prometheus-exporter.cnf >/dev/null && sudo chown root:prometheus /etc/mysql/prometheus-exporter.cnf && sudo chmod 640 /etc/mysql/prometheus-exporter.cnf && echo FICHIER-OK
2. Régler le service (l’adresse du nœud est détectée) et le démarrer
IP=$(hostname -I | awk '{print $1}'); sudo sed -i "s|^ARGS=\"\"|ARGS=\"--config.my-cnf=/etc/mysql/prometheus-exporter.cnf --web.listen-address=${IP}:9104\"|" /etc/default/prometheus-mysqld-exporter; sudo grep ^ARGS /etc/default/prometheus-mysqld-exporter; sudo systemctl reset-failed prometheus-mysqld-exporter; sudo systemctl restart prometheus-mysqld-exporter; sleep 2; systemctl is-active prometheus-mysqld-exporter
FICHIER-OK, la ligne ARGS= avec l’adresse du nœud, puis active.
Juste après l’installation, le service est en échec (
failed) : c’est normal, ses options sont vides (ARGS="") tant qu’on ne lui a pas dit où se connecter. Le fichier d’exemple de Debian parle deDATA_SOURCE_NAME: les versions récentes ne la lisent plus, on utilise le fichier.cnf.
9.3 Déclarer le nœud
Sur srv-metriques (exemple pour un 4ᵉ nœud fictif srv-mysql-04 en 10.0.20.13) :
printf -- "- targets: ['10.0.20.13:9104']\n labels:\n host: 'srv-mysql-04'\n zone: 'BDD'\n os: 'linux'\n" | sudo tee /etc/prometheus/cibles/mysql/srv-mysql-04.yml
Validation, depuis srv-metriques (le test traverse aussi le pare-feu) :
curl -s http://10.0.20.13:9104/metrics | grep -E '^mysql_up|^mysql_global_status_wsrep_cluster_size|^mysql_global_status_wsrep_local_state '
mysql_up 1 (connexion réussie), wsrep_cluster_size = nombre de nœuds, wsrep_local_state 4 (= Synced).
88a-prometheus-cibles-mysql.png
10 · Ajouter une machine Windows
Contexte : machine Windows avec accès Internet (zones ADM et USERS), session PowerShell administrateur. Objectif :
windows_exporteren service, son port ouvert àsrv-metriquesseul.
Les commandes se lancent dans l’ordre, dans la même fenêtre (chacune réutilise ce que la précédente a gardé). Regroupées dans
installer-windows-exporter.ps1.
1. Vérifier les droits
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
True. (Ne pas tester IsInRole('Administrators') : sur un Windows en français, le groupe s’appelle « Administrateurs » et le test répond False à tort — incident H-27.)
2. Télécharger la dernière version officielle
[Net.ServicePointManager]::SecurityProtocol='Tls12'; $rel=Invoke-RestMethod https://api.github.com/repos/prometheus-community/windows_exporter/releases/latest; $msi=$rel.assets | Where-Object {$_.name -like '*amd64.msi'} | Select-Object -First 1; $f="$env:TEMP\$($msi.name)"; Invoke-WebRequest $msi.browser_download_url -OutFile $f -UseBasicParsing; $rel.tag_name; Get-Item $f | Select-Object Name,Length
le numéro de version (v0.31.9 le 21/10) et le fichier .msi (~11 Mo).
3. Installer sans question
Start-Process msiexec.exe -ArgumentList "/i `"$f`" /qn" -Wait; Remove-Item $f; Get-Service windows_exporter
Running.
4. Ouvrir le port 9182 à srv-metriques seul
if (-not (Get-NetFirewallRule -DisplayName 'windows_exporter - srv-metriques seul' -ErrorAction SilentlyContinue)) { New-NetFirewallRule -DisplayName 'windows_exporter - srv-metriques seul' -Direction Inbound -Protocol TCP -LocalPort 9182 -RemoteAddress 10.0.30.14 -Action Allow -Profile Any | Out-Null }; Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq '9182'} | Get-NetFirewallRule | Format-Table DisplayName,Enabled -AutoSize
une seule règle. S’il y en a une autre (plus large), la regarder avant de la désactiver. Si la nôtre apparaît deux fois (commande envoyée
deux fois, incident H-30) : Remove-NetFirewallRule -DisplayName 'windows_exporter - srv-metriques seul', puis relancer cette étape.
Pourquoi le pare-feu Windows ?
srv-metriqueset l’annuaire sont dans le même VLAN : leur trafic ne passe pas par pfSense. Seul le pare-feu de la machine peut alors limiter qui lit le port.
5. Déclarer la machine — sur srv-metriques (exemple : poste en 10.0.40.10) :
printf -- "- targets: ['10.0.40.10:9182']\n labels:\n host: 'poste-win11'\n zone: 'USERS'\n os: 'windows'\n" | sudo tee /etc/prometheus/cibles/windows/poste-win11.yml
Validation — deux tests, dans les deux sens :
curl -s --max-time 5 http://10.0.40.10:9182/metrics | grep -E '^windows_exporter_build_info|^windows_os_info' | cut -c1-200
depuis srv-metriques : la version de l’exporteur et celle de Windows.
curl -s --max-time 5 -o /dev/null http://10.0.30.10:9182/metrics && echo OUVERT || echo BLOQUE
depuis srv-docker (une autre machine) : BLOQUE — preuve que la règle n’ouvre qu’à srv-metriques.
88d-prometheus-cibles-windows.png
11 · Ajouter pfSense
- System → Package Manager → Available Packages, chercher
node_exporter, Install puis Confirm ; attendre Success. - Services → node_exporter :
| Champ | Valeur |
|---|---|
| Enable node_exporter | |
| Interface | ADM — jamais WAN |
| Listen port | 9100 |
| Collectors | ceux par défaut, marqués (*) |
- Save.
Validation — dans Diagnostics → Command Prompt :
sockstat -4l | grep 9100
une seule ligne, sur 10.0.30.1:9100 (ni *, ni l’adresse WAN).
- Déclarer pfSense (fiche dans le dossier
node, puisque c’est le même exporteur) — sursrv-metriques:
printf -- "- targets: ['10.0.30.1:9100']\n labels:\n host: 'fw-01'\n zone: 'ADM'\n os: 'freebsd'\n" | sudo tee /etc/prometheus/cibles/node/fw-01.yml
curl -s http://10.0.30.1:9100/metrics | grep ^node_uname_info depuis srv-metriques → sysname="FreeBSD". Aucune règle de pare-feu à ajouter :
l’adresse ADM de pfSense fait partie de LAB_NETS.
90a-pfsense-paquet-node-exporter.png · 90b-pfsense-node-exporter-reglages.png
12 · Retirer une machine
Supprimer sa fiche sur srv-metriques (exemple) :
sudo rm /etc/prometheus/cibles/node/srv-web-02.yml
Prometheus cesse de la lire sans rechargement ; son historique reste consultable jusqu’à expiration (30 jours).
(Comportement standard de file_sd_configs, non encore testé dans le lab : À VÉRIFIER au premier retrait.)
Pour une suppression définitive de la machine, désinstaller aussi l’exporteur (sudo apt purge prometheus-node-exporter) et, sous Windows, la règle de pare-feu.
13 · Contrôler que tout est mesuré
curl -s http://10.0.30.14:9090/api/v1/targets | grep -o '"health":"[a-z]*"' | sort | uniq -c
21 "health":"up" au 21/10 (1 Prometheus + 11 node + 3 mysql + 2 windows + 4 sondes), aucun down.
S’il y a un down, savoir lequel :
curl -s http://10.0.30.14:9090/api/v1/targets | grep -o '"instance":"[^"]*"\|"health":"[a-z]*"' | paste - -
Vue graphique : http://10.0.30.14:9090/classic/targets (bouton Unhealthy pour ne voir que les cibles en panne).
88a à 88d-prometheus-cibles-*.png
14 · Superviser PBS et Proxmox VE par leur API
Contexte : PBS et l’hyperviseur
pve-01ne reçoivent pas d’exporteur « classique » (PBS, si ; mais les mesures utiles — âge des sauvegardes, ressources réglées des VM — ne viennent que de leur API). Un exporteur tourne sursrv-metriques, interroge l’API à distance avec un jeton en lecture seule, et publie des mesures pour Prometheus.Objectif : savoir, pour chaque VM, depuis quand elle n’a pas été sauvegardée, et ce que Proxmox lui réserve (mémoire, disque) au-delà de ce que la VM voit.
14.1 Le principe commun
| Étape | PBS | Proxmox VE |
|---|---|---|
| Compte dédié + jeton | metriques@pbs, jeton exporteur | metriques-axel@pve, jeton exporteur (séparation des privilèges décochée) |
| Droit | Audit (lecture seule) | PVEAuditor sur /pool/SIO2527_Axel et /vms/137 seulement (hyperviseur partagé : on ne voit pas les VM des autres) |
| Secret | Bitwarden + /etc/default/pbs-exporter (600) | Bitwarden + /etc/prometheus/pve.yml (640 root:pve-exporter) |
| Outil | natrontech/pbs-exporter 0.9.4 (binaire, somme vérifiée) | prometheus-pve-exporter 3.10.2 (environnement Python isolé) |
| Écoute | 10.0.30.14:10019 | 10.0.30.14:9221 |
Le secret ne s’affiche jamais : il est collé dans une saisie masquée (
read -rsp), écrit dans un fichier aux droits restreints, puis la variable est effacée (unset).
14.2 L’exporteur Proxmox VE, pas à pas
1. Un environnement Python isolé (le paquet n’existe pas dans Debian 13 : apt-cache policy prometheus-pve-exporter
ne trouve rien) :
sudo apt install -y python3-venv
sudo useradd --system --no-create-home --shell /usr/sbin/nologin pve-exporter
sudo python3 -m venv /opt/pve-exporter && sudo /opt/pve-exporter/bin/pip install prometheus-pve-exporter
/opt/pve-exporter/bin/pip show prometheus-pve-exporter | head -3; /opt/pve-exporter/bin/pve_exporter --help
Version: 3.10.2 ; l’aide liste --config.file et --web.listen-address (les options changent selon les versions :
on les lit avant d’écrire la configuration).
2. La configuration, créée vide avec les bons droits, puis le secret en saisie masquée :
sudo install -m 640 -o root -g pve-exporter /dev/null /etc/prometheus/pve.yml
read -rsp "Secret du jeton PVE : " S; echo; printf 'default:\n user: metriques-axel@pve\n token_name: exporteur\n token_value: "%s"\n verify_ssl: false\n' "$S" | sudo tee /etc/prometheus/pve.yml >/dev/null; unset S
sudo stat -c '%a %U:%G' /etc/prometheus/pve.yml; sudo grep -c token_value /etc/prometheus/pve.yml
640 root:pve-exporter puis 1. Si la commande 2 est lancée avant la 1, le fichier est créé en 644 (lisible
par tous) : ne pas relancer la 1 (elle viderait le fichier), corriger avec chown root:pve-exporter et chmod 640.
3. Le service : pve-exporter.service, avec les modules qui
exigent un droit sur tout l’hyperviseur coupés (--no-collector.status --no-collector.node --no-collector.cluster --no-collector.qdevice --no-collector.backup-info, voir H-50).
sudo systemctl daemon-reload && sudo systemctl enable --now pve-exporter && systemctl is-active pve-exporter
curl -s -w "\nCODE HTTP : %{http_code}\n" "http://10.0.30.14:9221/pve?target=10.1.0.253&cluster=1&node=0" | grep -E '^pve_memory_size_bytes|^pve_guest_info|CODE HTTP' | head -30
CODE HTTP : 200, une ligne par VM du pool (et la 137), aucune VM d’un autre élève.
4. Le job Prometheus (même mécanisme que les sondes : Prometheus demande à l’exporteur local d’interroger la cible) :
- job_name: 'pve'
scrape_interval: 60s
metrics_path: /pve
params:
module: [default]
cluster: ['1']
node: ['0']
static_configs:
- targets: ['10.1.0.253']
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 10.0.30.14:9221
Méthode sûre du §5.3 (copie, promtool check config, grep -c job_name, reload).
Validation :
curl -s -G http://10.0.30.14:9090/api/v1/query --data-urlencode 'query=up{job="pve"}'
une réponse qui se termine par "1"].
14.3 Les mesures utiles
| Mesure | Sens | Usage dans le tableau de bord |
|---|---|---|
pbs_snapshot_vm_last_timestamp | date de la dernière sauvegarde de chaque VM | « OK / KO » de la nuit (moins de 26 h), une case par jour |
pbs_used, pbs_size | place du datastore | jauge et tendance |
pbs_snapshot_vm_last_verify | la toute dernière sauvegarde est-elle vérifiée ? | non utilisée : la vérification est hebdomadaire, cette valeur serait presque toujours à 0 |
pve_memory_size_bytes, pve_disk_size_bytes | mémoire et disque réglés dans Proxmox | colonnes « Réglé (Proxmox) » |
pve_guest_info | nom de chaque VM (SIO2527-W11-Axel…) | relier une VM à sa machine (label_replace) |
15 · Sonder les accès distants (Termix, Pangolin)
| Sonde | Module | Cible | Ce qu’elle prouve |
|---|---|---|---|
sonde_termix | http_2xx_insecure | http://10.0.30.12:443/ | le portail répond |
sonde_pangolin | http_2xx_grafana | https://grafana.pangolin.<domaine>/api/health | internet → serveur Pangolin → tunnel → connecteur → Grafana |
Le module http_2xx_grafana vérifie le certificat (pas d’insecure_skip_verify) et exige que la réponse contienne
"database": "ok" : une page d’erreur de Pangolin ne peut pas passer pour un succès.
http_2xx_grafana:
prober: http
timeout: 10s
http:
preferred_ip_protocol: "ip4"
fail_if_body_not_matches_regexp:
- '"database": ?"ok"'
prometheus-blackbox-exporter --config.check --config.file=/etc/prometheus/blackbox.yml && sudo systemctl restart prometheus-blackbox-exporter
Prérequis côté Pangolin : une règle d’accès qui laisse passer le seul chemin /api/health (MO-10, §10.9).
Validation :
for c in "http_2xx_insecure&target=http://10.0.30.12:443/" "http_2xx_grafana&target=https://grafana.pangolin.<domaine>/api/health"; do curl -s "http://127.0.0.1:9115/probe?module=$c" | grep -E '^probe_success|^probe_http_status_code'; done
deux fois probe_success 1 et 200. Les nouvelles sondes apparaissent seules dans le tableau de bord (une ligne de
disponibilité par valeur de l’étiquette service).
16 · Pièges et checklist
| Piège | Symptôme | Où c’est documenté |
|---|---|---|
| Exporteur Proxmox avec un droit limité au pool | 500, journal 403 … (/, Sys.Audit) | §14.2, H-50 |
| Configuration du secret écrite avant de créer le fichier | fichier lisible par tous (644) | §14.2 |
| Sonde HTTPS qui accepte n’importe quelle réponse | une page d’erreur passe pour un succès | §15 : fail_if_body_not_matches_regexp |
| Bloc collé deux fois | jobs en double, configuration refusée | H-22 |
| Sonde TCP sur MariaDB | probe_success 0, connexions non authentifiées | H-23 |
| Long fichier collé dans le terminal web | fichier corrompu | H-24 |
| Paquets « recommandés » | une trentaine de paquets et de services | H-25 |
| Mauvaise adresse donnée au script | Connection timed out | H-26 |
| Test d’administrateur sous Windows en français | False pour un administrateur | H-27 |
| Mot de passe tapé avant l’invite | mot de passe affiché en clair | H-28 |
| Réservation DHCP dans la plage | must not be within the DHCP range | H-29 |
| Commande envoyée deux fois | règle Windows en double | H-30 |
ping pour tester la fenêtre BDD | échoue alors que la règle est ouverte | §8.4 |
La machine a une adresse fixe (ou réservée hors de la plage DHCP)
Linux : bash ajouter-machine.sh <IP> ipfixe depuis srv-docker → « OK : … est supervise »
Zone BDD : règle Internet ouverte avant, REFERMÉE après, test « ferme »
Nœud MariaDB : compte prometheus présent (SHOW GRANTS), mysqld_exporter « active », mysql_up 1
Windows : service Running, UNE règle 9182 limitée à 10.0.30.14, test BLOQUE depuis une autre machine
pfSense : écoute sur 10.0.30.1:9100 seulement
prometheus.yml modifié ? copie .avant-…, nombre de jobs, promtool SUCCESS, PUIS reload
Contrôle final : toutes les cibles « up », aucune « down »
La règle à retenir en une phrase : une machine supervisée = un exporteur qui n’écoute que sur son adresse, un port ouvert à Prometheus seul, et une fiche de quatre lignes — le reste ne change pas.



