Intégration (& monitoring) Proxmox

Bonjour à tous,

Mon problème

Je cherche à monitoré mon NUC -Proxmox- depuis HA (visuel des reçources, démarrer ou arrêter une VM, etc…)
J’ai bien tenté l’intégration Proxmox VE mais elle permet uniquement de récupérer l’état ON/OFF d’une VM (ou container).
J’ai aussi vue quelque choses concernant Node Red, mais vue que je ne suis pas franchement familier avec, je ne parviens à rien…

Tout les conseil sont les bien venue !!

Ma configuration


En version très courte :


HASSOS est sur RPi.
Proxmox est sur PC-serveur.
Les deux entités sont physiquement distincte !


Salut

je dirais

ou

a ce jour je ne sais que récupérer la température de mon CPU.

Merci !
Grace au deuxième lien je suis parvenu a récupéré quelques infos :
image

Intégrer vite fais dans une carte :
image

Reste encore à :

  • trouver comment démarrer ou arrêter une VM
  • récupéré les infos des ressources de chaque VM

La manipe pour ceux qui chercherai :


Depuis le terminal SSH de HA :

ssh-keygen

On valide le chemin :

/root/.ssh/id_rsa

On remplace « proxmox-ip-address » par l’ip du serveur Proxmox :

ssh-copy-id root@proxmox-ip-address

On s’identifie avec le bon mot de passe, puis :

mkdir -p /config/.ssh
cp /root/.ssh/id_rsa /config/.ssh/id_rsa

Encore une fois, on remplace « proxmox-ip-address » par l’ip du serveur Proxmox :

ssh -i /config/.ssh/id_rsa root@proxmox-ip-address
exit

Et dans le YAML : (évidement on remplace l’ip)

- platform: command_line
  name: 'Proxmox CPU Temp'
  command: "ssh -i /config/id_rsa -o StrictHostKeyChecking=no root@192.168.X.X -t 'cat /sys/class/thermal/thermal_zone2/temp'"
  unit_of_measurement: '°C'
  scan_interval: 300
  value_template: '{{ (value | multiply(0.001)) | round(0) }}'

- platform: command_line
  name: 'Proxmox CPU'
  command: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /config/.ssh/id_rsa root@192.168.X.X top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{printf ("%.0f\n",$2 + $4)}'
  unit_of_measurement: '%'
    
- platform: command_line
  name: 'Proxmox RAM'
  command: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /config/.ssh/id_rsa root@192.168.X.X free -m | grep Mem | awk '{printf ("%.0f\n",$3*100/$2)}'
  unit_of_measurement: '%'

- platform: command_line
  name: 'Proxmox SSD'
  command: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /config/.ssh/id_rsa root@192.168.X.X df | grep pve-root | awk '{printf ("%.0f\n",$3*100/($3+$4))}'
  unit_of_measurement: '%'
1 « J'aime »

Salut,

Comme je n’aime pas trop les 15 appels SSH, j’ai fais chez moi la version MQTT pour récupérer les infos.

Si ça peut intéresser des gens:
Côté Proxmox :

  • Un script Python qui récupère les valeurs, les colle dans un JSON et les envoie en MQTT
  • Une entrée dans la cron, pour que ça tourne toutes les minutes.

Côté HA:

  • Un Sensor MQTT pour chaque valeur récupérée.

Le script python ressemble à ça:

import os
import psutil
import paho.mqtt.client as mqtt

def mqtt_pub(topic, value):
        mqttc = mqtt.Client(client_id="ProxOneStats")
        mqttc.username_pw_set("xxxxxx", "xxxxxx")
        mqttc.connect("192.168.1.xxxx", 1883, 60)
        mqttc.publish(topic,value, qos=0, retain=True)
        mqttc.disconnect()


stream = os.popen('/usr/sbin/hddtemp --numeric /dev/sda')
ssd1_temp = stream.read()
stream = os.popen('/usr/sbin/hddtemp --numeric /dev/sdb')
ssd2_temp = stream.read()
stream = os.popen('/usr/sbin/hddtemp --numeric /dev/sdc')
ssd3_temp = stream.read()
stream = os.popen('/usr/sbin/hddtemp --numeric /dev/sdd')
ssd4_temp = stream.read()


temps = psutil.sensors_temperatures()
fans = psutil.sensors_fans()

myjson="{\"ssd_nvme\": " + str(temps['nvme'][0].current) + ",\"cpu_temp\": " + str(temps['coretemp'][0].current) + ",\"cpu_fan\": " + str(fans['nct6798'][1].current)  + ",\"ssd1_temp\": " + ssd1_temp  + ",\"ssd2_temp\": " + ssd2_temp  + ",\"ssd3_temp\": " + ssd3_temp  + ",\"ssd4_temp\": " + ssd4_temp + ",\"cpu_percent\": " + str(psutil.cpu_percent(2)) + ",\"memory_percent\":" + str(psutil.virtual_memory()[2]) + ",\"media_free\": "  + str(psutil.disk_usage('/mnt/pve/media/')[3])  + ",\"mytank_free\": "  + str(psutil.disk_usage('/mytank/')[3]) + "}"

mqtt_pub('monitoring/proxone', myjson)

Le message en MQTT ça ressemble à ça:

{
    "ssd_nvme": 29.85,
    "cpu_temp": 22,
    "cpu_fan": 1141,
    "ssd1_temp": 21,
    "ssd2_temp": 19,
    "ssd3_temp": 20,
    "ssd4_temp": 20,
    "cpu_percent": 0.2,
    "memory_percent": 51.7,
    "media_free": 49.8,
    "mytank_free": 0
}

Un sensor MQTT dans HA ça ressemble à ça:

    - name: "Serveur Ram"
      state_topic: "monitoring/proxone"
      unit_of_measurement: "%"
      value_template: "{{ value_json.memory_percent }}"
4 « J'aime »

Merci pour ton retour :smiley:
Cela dit je n’ai pas vraiment tout compris… Tu aurais pas la version Pour les nuls ? :disguised_face:

Tu met où le JSON ? Tu envoie comment en MQTT ? Une entrée dans la cron ? :face_with_spiral_eyes:

Effectivement faut un peu de background linux qd même :slight_smile:
Après ça doit être adapté en fonction des appareils et des sondes présentes, toutes les cartes mères sont pas pareil à ce niveau là. Ca dépend aussi du nombre de partitions.

C’est le script python qui s’occupe d’envoyer le tout à MQTT (mqttc.publish).
Le JSON pas besoin de s’en occuper c’était pour montrer toute les valeurs sont regroupées dans un seul message envoyé en MQTT.

Le Cron c’est le planificateur de tâches qui existe dans tous les systèmes linux. (commande crontab -e)
Exemple d’entrée pour qu’un script se lance toutes les minutes:

*/1 * * * * python3 /root/scripts/info_system.py

Il y a aussi quelques paquets à installer genre hddtemp et les librairies mqtt & psutil pour python.

C’est une affaire d’une 30aine de minutes au total, mais c’est sûr que c’est pas évident si tu ne connais pas du tout Linux et tout ce qui va avec.
Maintenant en installant Proxmox c’est quand même fortement recommandé d’avoir un peu de connaissances là dedans, car sinon tu vas au devant de petites surprises!

Effectivement faut un peu de background linux qd même :slight_smile:

Bah faut bien commencer un jour, non ?!

Le Cron c’est le planificateur de tâches qui existe dans tous les systèmes linux. (commande crontab -e )

Là je comprend mieux !
(me reste a bien comprendre comment adapter le script)

Il y a aussi quelques paquets à installer genre hddtemp, psutils et la librairie mqtt pour python.

ça c’est fais ! J’en ai aussi profiter pour installer Glances ce qui me permet de récupéré :

type: entities
entities:
  - entity: sensor.promox_glances_free
    name: / free
  - entity: sensor.promox_glances_used
    name: / used
  - entity: sensor.promox_glances_used_percent
    name: / used percent
  - entity: sensor.promox_glances_acpitz_1_temperature
    name: Acpitz 1 Temperature
  - entity: sensor.promox_glances_acpitz_2_temperature
    name: Acpitz 2 Temperature
  - entity: sensor.promox_glances_core_0_temperature
    name: Core 0 Temperature
  - entity: sensor.promox_glances_core_1_temperature
    name: Core 1 Temperature
  - entity: sensor.promox_glances_cpu_load
    name: CPU load
  - entity: sensor.promox_glances_cpu_used
    name: CPU used
  - entity: sensor.promox_glances_package_id_0_temperature
    name: Package id 0 Temperature
  - entity: sensor.promox_glances_ram_free
    name: RAM free
  - entity: sensor.promox_glances_ram_used
    name: RAM used
  - entity: sensor.promox_glances_ram_used_percent
    name: RAM used percent
  - entity: sensor.promox_glances_running
    name: Running
  - entity: sensor.promox_glances_sda_temperature
    name: Sda Temperature
  - entity: sensor.promox_glances_sleeping
    name: Sleeping
  - entity: sensor.promox_glances_swap_free
    name: Swap free
  - entity: sensor.promox_glances_swap_used
    name: Swap used
  - entity: sensor.promox_glances_swap_used_percent
    name: Swap used percent
  - entity: sensor.promox_glances_thread
    name: Thread
  - entity: sensor.promox_glances_total
    name: Total
title: Proxmox

J’ingnore cependant s’il n’aurait pas été mieux (ou possible ? et si oui comment) de l’installer en container ?

Bon alors du coup avec glances tu as la version clé en mains avec bcp bcp d’infos :wink:
Y’a une intégration qui permet de récupérer ça directement dans HA en fait.

Y’a une image docker, mais je ne sais pas quel système ça mesure en l’utilisant… ça doit dépendre de comment docker est installé.

De mon côté j’ai les infos que je voulais voir:

Bonsoir,

possible d’avoir le code de la carte ?
et si possible la méthode d’installation utilisé pour glances sur proxmox, j’ai galéré sur mon raspi.

Merci

Salut,

je ne sais pas si c’est à moi que tu demandais pour la carte, donc là voilà au cas où… :slight_smile:
C’est principalement une carte custom vertical-stack-in-card avec dedans des grilles et des cartes custo bar-card.
Pour Glances, je ne sais pas, c’est @Dackara qui l’a installé. Mais ça doit être dans les packages debian.

type: custom:vertical-stack-in-card
cards:
  - type: picture
    image: /local/UI_Pics/Proxmox.jpg
    tap_action:
      action: none
    hold_action:
      action: none
  - type: glance
    entities:
      - entity: sensor.serveur_cpu
        icon: mdi:chart-line
        name: i5 -10400
      - entity: sensor.serveur_cpu_temp
        name: 6C/12T
      - entity: sensor.serveur_cpu_fan
        icon: mdi:fan-auto
        name: 4,3GHz
      - entity: sensor.serveur_ram
        icon: mdi:chip
        name: 32Go
  - square: true
    columns: 5
    type: grid
    cards:
      - type: custom:bar-card
        direction: up
        entities:
          - entity: sensor.serveur_ssd_boot
            icon: mdi:thermometer
            name: Boot
            positions:
              icon: inside
              name: outside
              value: outside
              indicator: 'off'
            width: 25px
            height: 35px
            severity:
              - from: '0'
                to: '30'
                color: Green
              - from: '30'
                to: '40'
                color: Orange
              - from: '40'
                color: Red
                to: '100'
      - type: custom:bar-card
        direction: up
        entities:
          - entity: sensor.serveur_ssd_raisz_1
            icon: mdi:thermometer
            name: Raid1
            width: 25px
            height: 25px
            positions:
              icon: inside
              name: outside
              value: outside
              indicator: 'off'
            severity:
              - from: '0'
                to: '30'
                color: Green
              - from: '30'
                to: '40'
                color: Orange
              - from: '40'
                color: Red
                to: '100'
      - type: custom:bar-card
        direction: up
        entities:
          - entity: sensor.serveur_ssd_raidz_2
            icon: mdi:thermometer
            name: Raid2
            width: 25px
            height: 25px
            positions:
              icon: inside
              name: outside
              value: outside
              indicator: 'off'
            severity:
              - from: '0'
                to: '30'
                color: Green
              - from: '30'
                to: '40'
                color: Orange
              - from: '40'
                color: Red
                to: '100'
      - type: custom:bar-card
        direction: up
        entities:
          - entity: sensor.serveur_ssd_raidz_3
            icon: mdi:thermometer
            name: Raid3
            width: 25px
            height: 25px
            positions:
              icon: inside
              name: outside
              value: outside
              indicator: 'off'
            severity:
              - from: '0'
                to: '30'
                color: Green
              - from: '30'
                to: '40'
                color: Orange
              - from: '40'
                color: Red
                to: '100'
      - type: custom:bar-card
        direction: up
        entities:
          - entity: sensor.serveur_ssd_media
            icon: mdi:thermometer
            name: Media
            width: 25px
            height: 25px
            positions:
              icon: inside
              name: outside
              value: outside
              indicator: 'off'
            severity:
              - from: '0'
                to: '30'
                color: Green
              - from: '30'
                to: '40'
                color: Orange
              - from: '40'
                color: Red
                to: '100'
  - type: custom:bar-card
    entities:
      - entity: sensor.serveur_boot_used
        icon: mdi:harddisk
        name: Boot (72Go)
        height: 25px
        positions:
          icon: inside
        color: purple
      - entity: sensor.serveur_raidz_used
        icon: mdi:harddisk
        name: RaidZ (2To)
        height: 25px
        positions:
          icon: inside
        color: purple
      - entity: sensor.serveur_media_used
        icon: mdi:movie
        name: Media (500Go)
        height: 25px
        positions:
          icon: inside
        color: purple
  - type: entities
    entities:
      - entity: sensor.serveur_last_boot
        name: Last boot
1 « J'aime »

Salut,
Après plusieurs essaies, (et bien que je n’ai pas encore assez de recul) je conseillerai d’avantage d’installer Glances dans une machine CT.
La raison est que pour communiquer avec HA, Glances doit visiblement être en mode Web pour ouvrir le port 61208 l’inconvénient principal est que lorsque l’on charge la commande glances -w depuis le terminal, celui-ci est « bloquer », on ne peut plus s’en servir jusqu’a ce que l’ont ferme Glances ou que l’on relunch le terminal (ce qui aura le même effet : fermer Glances) donc plus de communication avec HA)

La seul différence pour Glances c’est qu’il ne verra que l’espace HDD qu’on lui aura aloué, pour le reste toutes les infos sont identique avec la machine sources

Pour ce faire on va dans image (ou « pve » si contrairement a moi vous ne l’avez pas renommer).
Puis : image
Et on choisis la dernière version de « ubuntu » (on attend la fin du téléchargement).
On clic sur image en haut à droite.
On créer notre container :

  • General > Hostname : > on remplie (je l’ai nommé « Docker »)
  • General > Password : > on met un mot de passe pour l’utilisateur « root » de l’instance « ubuntu »
  • Template > Template : > l’image « ubuntu » que l’on a télécharger.
  • Disks > Strorage : > on choisis un disque.
  • Disks > Disk size : > la taille de disque que vous souhaitez allouer a la machine (docker va t’il faire tourner seulement Glances ? Si oui 4 ou 5 Go devrait être suffisant…)
  • Network > IPv4/CIDR : > on choisis lIP static pour cette instance suivi de « /24 » (exemple 192.168.1.106/24)
  • Network > Gateway (IPv4) : > Votre Gateway
  • Confirm > Start after created > on coche !

Et on clic sur « Finish »
On attend que le machine se lance. > Task OK

On sélectionne notre nouvelle machine et on ouvre la console :
image
(choisissez « xterm.sj » qui permet le copier coller)

Dans la console :

  • login > root
  • password > -celui que vous avez choisis-.

Puis les ligne des commande suivante :

  • sudo apt update && sudo apt upgrade -y
  • sudo apt install curl -y
  • adduser xxx (remplacez « xxx » par votre nom d’utilisateur)
  • choisissez un mot de passe pour le nouvel utilisateur
  • usermod -aG sudo xxx
  • su - xxx
  • curl -fsSL https://get.docker.com -o get-docker.sh
  • sudo sh get-docker.sh
  • sudo usermod -aG docker xxx
  • sudo reboot
  • mkdir -p ~/.docker/cli-plugins/
  • (https://github.com/docker/compose/releases) vérifier à cette adresse la dernière version de docker pour pouvoir modifier la ligne de commande en dessous.
  • curl -SL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
  • chmod +x ~/.docker/cli-plugins/docker-compose
  • docker --version
  • docker compose version
  • docker volume create portainer_data
  • docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Se connecter via l’explorer.

  • 192.xxx.xxx.x:9000

On créer un utilisateur et sont mot de passe pour Portainer.
On sélectionne « Get Started »

On retourne sur notre terminal « Proxmox » et on entre la commande suivante :

  • docker run -d --restart="always" -p 61208-61209:61208-61209 -e GLANCES_OPT="-w" -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host nicolargo/glances:latest

Et voila, Glance est installer en container sur Proxmox et est accessible via 192.xxx.xxx.x:61208

Il ne reste plus qu’a faire l’intégration dans HA !

1 « J'aime »

Tu pourrais expliquer comment fonctionne psutils ?
Pasque franchement, là je sèche… :confused:

Ah oui, c’est une boulette de ma part :wink:
C’est la librairie python « psutil », pas le package psutils qui lui, n’a rien à voir avec le choucroute!
Ell donne directement en python des fonctions équivalentes à ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap .

Installation
pip3 install psutil

Ensuite exemple dans le code python que j’ai partage plus haut.
Et la doc est bien complète:
https://psutil.readthedocs.io/en/latest/

Bonjour,

il suffit dans ce cas de lancer :

glances -w &

(avec l’eperluette en dernier pour garder la main dans le terminal, et laisser glances tourner en tache de fond …)

Sinon, je viens d’installer glances pour voir; à l’installation, il lance tout seul glances en mode serveur;

A+

1 « J'aime »

Pour le lancement de « glances » sous proxmox ou autre debian, le lancer via systemd :

1 « J'aime »

au top merci beaucoup pour toutes ses explications

Super intéressant tout ça. et pour revenir à une « version pour les nuls » ton script python, tu le colles ou au niveau proxmox? enfin dans quel répertoire? /root direct?

N’importe quel répertoire.
Mais oui je l’ai dans « /root/scripts ».

1 « J'aime »

Salut @AlexHass

Je vois dans ton script que tu fais appelles à paho.mqtt.client.
Pourquoi celui ci plutôt que mosquitto.client ?

Salut,

Alors là bonne question.
Quand j’ai commencé à faire du Mqtt en python, c’est la première librairie que j’ai trouvé :slight_smile:
Et depuis je fais des copier-coller de script pour la partie Mqtt.

1 « J'aime »