Supervision de Proxmox et de Mikrotik via Prometheus+Grafana

Vous avez été nombreux à me demander des informations sur mon Grafana et Prometheus, donc voici le tuto !
Vous pouvez voir un exemple sur sup.ataxya.net
Ce tuto est fait sur Debian 10

Partie 1: Installation de Prometheus

Préparation de l’environnement

On va commencer par créer un utilisateur pour Prometheus et pour Node exporter. Le paramètre --no-create-home permet de ne pas créer de dossier /home, et on désactive le dossier avec --shell /usr/sbin/nologin.

sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter

On crée les dossier pour Prometheus

sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus

On donne les droits à l'utilisateur prometheus pour être sûr que l'utilisateur ait bien accès aux dossiers

sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

Installation de Node_Exporter

Node_Exporter permet de collecter les métriques de la VM et de les renvoyer vers le Prometheus

On télécharge Node_Exporter

wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz

On dézippe le tar.gz

tar xvf node_exporter-0.16.0.linux-amd64.tar.gz

On copie le fichier binaire /usr/local/bin et on donne les droits à l'utilisateur créé précédemment

sudo cp node_exporter-0.16.0.linux-amd64/node_exporter /usr/local/bin
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

On supprime les fichiers dont nous n'avons plus besoin

rm -rf node_exporter-0.16.0.linux-amd64.tar.gz node_exporter-0.16.0.linux-amd64

Pour démarrer Node_Exporter à chaque boot, nous allons créer un fichier systemd.

nano /etc/systemd/system/node_exporter.service

Copier les lignes suivantes dans le fichier et sauvegarder

[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

On recharge systemd pour prendre en compte le nouveau service

sudo systemctl daemon-reload

On démarre node_exporter avec la commande suivante

sudo systemctl start node_exporter

On vérifie que le service a bien démarré

sudo systemctl status node_exporter

Vous devriez voir quelque chose comme ceci, avec  active (running)

● node_exporter.service - Node Exporter
   Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-06-25 11:47:06 UTC; 4s ago
 Main PID: 1719 (node_exporter)
   CGroup: /system.slice/node_exporter.service
           └─1719 /usr/local/bin/node_exporter

Si tout fonctionne, on active Node_Exporter pour le démarrer à chaque boot

sudo systemctl enable node_exporter

Installation de Prometheus

On télécharge la dernière version de Prometheus . A titre d'exemple, la version est 2.2.1:

sudo apt-get update && apt-get upgrade
wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-amd64.tar.gz
tar xfz prometheus-*.tar.gz
cd prometheus-*

On copie les fichiers vers le dossier /usr/local/bin/:

sudo cp ./prometheus /usr/local/bin/
sudo cp ./promtool /usr/local/bin/

On donne les droits à l'utilisateur prometheus précédemment créé

sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

On copie les dossiers consoles et console_libraries vers /etc/prometheus:

sudo cp -r ./consoles /etc/prometheus
sudo cp -r ./console_libraries /etc/prometheus

On donne les droits à l'utilisateur prometheus précédemment crée

sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries

On supprime les fichiers dont nous n'avons plus besoin

cd .. && rm -rf prometheus-*

Configuration de Prometheus

Avant d'utiliser Prometheus, nous avons besoin de créer une configuration. Nous allons donc créer le fichier de configuration prometheus.yml

Note: Le ficher de configuration de Prometheus est écrit en YAML, qui interdit l'utilisation de tabulations. Si le fichier est mal formaté, Prometheus ne démarrera pas.

On édite le fichier prometheus.yml

sudo nano /etc/prometheus/prometheus.yml

Le fichier devrait ressembler à l'exemple suivant

global:
  scrape_interval:     15s
  evaluation_interval: 15s

rule_files:
  # - "first.rules"
  # - "second.rules"

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']

Dans la partie scrape_configs nous avons défini notre premier exporter, celui de Prometheus lui-même. Les paramètres static_configset targets détermine où l'exporter tourne. Le Prometheus tournant en local, on défini localhost et le port 9090.

Comme Prometheus exporte seulement ce qui est défini dans la partie scrape_configs , il faut ajouter Node_Exporter, comme nous avons fait pour Prometheus.

On ajoute la partie suivante en dessous du job Prometheus (attention aux espaces!)

- job_name: 'node_exporter'
  scrape_interval: 5s
  static_configs:
    - targets: ['localhost:9100']

Comme l'exporter est sur le même serveur que Prometheus, on utilise localhost avec le port par défaut de  Node_Exporter: 9100.

On donne les droits à l'utilisateur prometheus

sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml

Le serveur Prometheus est prêt à démarrer !

Démarrer Prometheus

Pour tester, on démarre Prometheus directement en ligne de commande avec la commande suivante:

sudo -u prometheus /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries

Le serveur va vous afficher plusieurs message de status et comme quoi le serveur a bien démarré

level=info ts=2018-04-12T11:56:53.084000977Z caller=main.go:220 msg="Starting Prometheus" version="(version=2.2.1, branch=HEAD, revision=bc6058c81272a8d938c05e75607371284236aadc)"
level=info ts=2018-04-12T11:56:53.084463975Z caller=main.go:221 build_context="(go=go1.10, user=root@149e5b3f0829, date=20180314-14:15:45)"
level=info ts=2018-04-12T11:56:53.084632256Z caller=main.go:222 host_details="(Linux 4.4.127-mainline-rev1 #1 SMP Sun Apr 8 10:38:32 UTC 2018 x86_64 scw-041406 (none))"
level=info ts=2018-04-12T11:56:53.084797692Z caller=main.go:223 fd_limits="(soft=1024, hard=65536)"
level=info ts=2018-04-12T11:56:53.09190775Z caller=web.go:382 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2018-04-12T11:56:53.091908126Z caller=main.go:504 msg="Starting TSDB ..."
level=info ts=2018-04-12T11:56:53.102833743Z caller=main.go:514 msg="TSDB started"
level=info ts=2018-04-12T11:56:53.103343144Z caller=main.go:588 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
level=info ts=2018-04-12T11:56:53.104047346Z caller=main.go:491 msg="Server is ready to receive web requests."

On ouvre le navigateur et on entre http://<ip>:9090 pour accéder à l'interface Web de Prometheus. Si tout fonctionne, on termine la tâche en pressant CTRL + C sur le serveur

Note: Si vous obtenez une erreur lors du démarrage du serveur, vérifiez votre fichier de configuration. Le message vous dira ou est l'erreur (généralement, c'est le fichier qui est mal formaté)

Comme pour Node_Exporter, on crée un fichier systemd pour démarrer automatiquement Prometheus au boot

sudo nano /etc/systemd/system/prometheus.service

On copie les informations suivantes dans le fichier et on sauvegarde

[Unit]
  Description=Prometheus Monitoring
  Wants=network-online.target
  After=network-online.target

[Service]
  User=prometheus
  Group=prometheus
  Type=simple
  ExecStart=/usr/local/bin/prometheus \
  --config.file /etc/prometheus/prometheus.yml \
  --storage.tsdb.path /var/lib/prometheus/ \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries
  ExecReload=/bin/kill -HUP $MAINPID

[Install]
  WantedBy=multi-user.target

On recharge systemd pour prendre en compte le nouveau service

sudo systemctl daemon-reload

On active Node_Exporter pour le démarrer à chaque boot

sudo systemctl enable prometheus

Et on démarre Prometheus !

sudo systemctl start prometheus

Le serveur Prometheus est prêt à être utilisé, et à récupérer toutes nos informations!

Partie 2: Installation de Grafana

Pour pouvoir afficher proprement les informations récupérées par Prometheus, on va installer Grafana

1 . On installe Grafana sur le même serveur que le Prometheus

sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_6.7.3_amd64.deb
sudo dpkg -i grafana_6.7.3_amd64.deb

2 . On active le démarrage automatique de Grafana via systemd:

sudo systemctl daemon-reload && sudo systemctl enable grafana-server && sudo systemctl start grafana-server

Grafana est désormais lancé, nous pouvons y accéder via http://<ip>:3000. L'utilisateur et le mot de passe par défaut est admin / admin (Pensez à le changer!).

Nous allons donc créer la source de données Prometheus:

  • Cliquez sur le logo de Grafana pour ouvrir le menu
  • Cliquez sur "Data Source"
  • Choisissez “Add New”.
  • Sélectionnez “Prometheus” en source de données.
  • Mettez l'ip de la source Prometheus (dans notre cas http://localhost:9090/)
  • Cliquez sur“Add” pour tester la connexion et ajouter la source de données

Le Grafana est désormais fonctionnel ! Nous allons voir comment exporter les informations de Proxmox et de Mikrotik

Partie 3: Pve_Exporter

Pour exporter les informations de notre Proxmox, nous allons utiliser Pve_Exporter, disponible ici
On installe l’exporter directement sur le Proxmox

On crée d'abord un utilisateur dédié au monitoring

pveum usermod pve_exporter@pve -group monitoring
pveum passwd pve_exporter@pve

On installe l'exporter avec pip

pip install prometheus-pve-exporter
Note: Si pip n'est pas installé sur votre Proxmox, vous pouvez l'installer avec apt-get install python-pip

On crée le dossier Pve_Exporter et on crée le fichier de configuration

mkdir -p /usr/share/pve_exporter/
nano /usr/share/pve_exporter/pve_exporter.yml

Le fichier devrait ressembler à ceci:

default:
    user: <user>@pve
    password: <password>
    verify_ssl: false

On peut tester le fonctionnement de la configuration avec la commande suivante

/usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml

Si tout va bien, le serveur nous affiche ceci:

root@pve1:~# /usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml
 * Running on http://localhost:9221/ (Press CTRL+C to quit)

On peut vérifier le fonctionnement via le navigateur, à l'ip suivante http://<ip-proxmox>:9221/pve?target=<ip-proxmox>

Une longue liste d'information va s'afficher, comme ceci:

Comme avec les autres exporter, nous allons créer un service systemd pour lancer l'exporter au boot

nano /etc/systemd/system/pve_exporter.service

La configuration ressemble à ceci:

[Unit]
Description=Proxmox VE Prometheus Exporter
After=network.target
Wants=network.target
[Service]
Restart=on-failure
WorkingDirectory=/usr/share/pve_exporter
ExecStart=/usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml 9221 <ip-proxmox>
[Install]
WantedBy=multi-user.target

On active et on démarre le service:

systemctl enable pve_exporter
systemctl start pve_exporter

Ensuite, on configure le Prometheus pour récupérer les données. On ajoute donc un job à la configuration:

- job_name: 'pve'
    scrape_interval: 5s
    static_configs:
      - targets: ['10.10.1.10:9221']
    metrics_path: /pve

On reload systemd et on restart Prometheus

systemctl daemon-reload
systemctl restart prometheus

Pour afficher les données sur Grafana, vous pouvez utiliser ce dashboard

Partie 4: Mikrotik Exporter

Pour exporter les informations de notre Proxmox, nous allons utiliser mikrotik-exporter, disponible ici

On installe l'exporter sur le même serveur que le Prometheus

Côté Mikrotik

On crée d'abord un groupe sur le mikrotik

/user group add name=prometheus policy=api,read,winbox

On crée l'utilisateur qui va accéder à l'API

/user add name=prometheus group=prometheus password=changeme

Côté serveur

Pour pouvoir builder l'exporter, nous avons besoin du paquet build-essential et de go

apt install build-essential
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz
tar -xvf go1.13.3.linux-amd64.tar.gz
sudo mv go /usr/local
export GOROOT=/usr/local/go
export GOPATH=/usr/local/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
go version

On clone le repository

git clone https://github.com/nshttpd/mikrotik-exporter.git
mv /mikrotik-exporter/ /etc/mikrotik-exporter
cd /etc/mikrotik-exporter
make

On crée le fichier de configuration

nano /etc/mikrotik-exporter/config.yml



devices:
  - name: my_router
    address: <IP-Mikrotik>
    user: prometheus
    password: <password>

features:
  bgp: true
  dhcp: true
  dhcpv6: true
  dhcpl: true
  routes: false
  pools: true
  optics: true

On test le fichier de configuration:

 ./mikrotik-exporter -config-file config.yml

root@Prometheus:/etc/mikrotik-exporter# ./mikrotik-exporter -config-file config.yml
{"level":"info","msg":"setting up collector for devices","numDevices":1,"time":"2020-05-05T18:17:29+02:00"}
{"level":"info","msg":"Listening on :9436","time":"2020-05-05T18:17:29+02:00"}

Une fois que tout fonctionne; on crée le service mikrotik

nano /etc/systemd/system/mikrotik.service

[Unit]
Description=Prometheus exporter for Mikrotik
Documentation=https://github.com/nshttpd/mikrotik-exporter

[Service]
Restart=always
User=root
ExecStart=/etc/mikrotik-exporter/mikrotik-exporter --config-file=/etc/mikrotik-exporter/config.yml

[Install]
WantedBy=multi-user.target

On reload systemd, on active et on démarre le service mikrotik

systemctl daemon-reload
systemctl enable mikrotik.service
systemctl start mikrotik.service

On ajout maintenant le job dans la config Prometheus

 - job_name: 'mikrotik'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9436']

On reload systemd et on redémarre Prometheus

systemctl daemon-reload
systemctl restart prometheus

Pour afficher les données sur Grafana, vous pouvez utiliser ce dashboard

Voilà pour ce tuto ! N'hésitez pas à me faire un retour et à me contacter en cas de problème !

Afficher les commentaires