Comment surveiller l’état des nœuds Proxmox à l’aide d’un script Bash automatisé ?

Une gestion efficace de l’infrastructure informatique est essentielle pour maintenir la stabilité et la performance de l’environnement numérique d’une entreprise. L’une des tâches essentielles des professionnels de l’informatique et des fournisseurs de services gérés (MSP) consiste à surveiller l’état des nœuds au sein d’un cluster Proxmox Virtual Environment (PVE). Le script fourni offre une solution performante pour automatiser ce processus, garantissant que les informations sur l’état des nœuds sont facilement disponibles et à jour.

Contexte

Proxmox VE est un environnement de virtualisation de serveurs open-source utilisé par de nombreux professionnels de l’informatique pour gérer les machines virtuelles, les conteneurs et le stockage. La surveillance de l’intégrité et de l’état des nœuds au sein d’un cluster Proxmox est essentielle pour la maintenance proactive et le dépannage.

Ce script simplifie le processus en récupérant les informations sur l’état des nœuds et en les enregistrant dans des champs personnalisés pour faciliter l’accès et l’analyse. Cette automatisation est particulièrement précieuse pour les entreprises MSP qui gèrent plusieurs environnements clients, car elle réduit les efforts manuels et minimise le risque de négligence.

Le script

#!/usr/bin/env bash

# Description: Get the Proxmox Node Status and save it to a multiline and/or WYSIWYG custom field
#
# Release Notes: Fixed 10% width bug.
# By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
# Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
# Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
# Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
# Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
# Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
# Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
# EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).

# Command line arguments, swap the numbers if you want the multiline custom field to be the second argument
multiline_custom_field=$1 # First argument is the multiline custom field name
wysiwyg_custom_field=$2   # Second argument is the WYSIWYG custom field name

# Check if the custom fields are set to null
if [[ -n "${multilineCustomField}" && "${multilineCustomField}" != "null" ]]; then
    multiline_custom_field=$multilineCustomField
fi
if [[ -n "${wysiwygCustomField}" && "${wysiwygCustomField}" != "null" ]]; then
    wysiwyg_custom_field=$wysiwygCustomField
fi

# Check if the custom fields are the same
if [[ -n "${multiline_custom_field}" && "${multiline_custom_field}" == "${wysiwyg_custom_field}" ]]; then
    echo "[Error] multilineCustomField and wysiwygCustomField cannot be the same custom field."
    exit 1
fi

# Check if the custom fields are not set
if [[ -z "${multiline_custom_field}" ]]; then
    echo "[Info] multilineCustomField is not set."
fi
if [[ -z "${wysiwyg_custom_field}" ]]; then
    echo "[Info] wysiwygCustomField is not set."
fi

# Check that we have the required tools
if ! command -v pvesh &>/dev/null; then
    echo "[Error] The Proxmox VE API tool 'pvesh' is required."
    exit 1
fi

# Check that we are running as root
if [[ $EUID -ne 0 ]]; then
    echo "[Error] This script must be run as root."
    exit 1
fi

# Get the version of proxmox-ve
_version=$(pveversion --verbose | grep "proxmox-ve" | awk '{print $2}')

# Check if the version
if [[ "$(echo "${_version}" | awk -F. '{print $1}')" -eq 7 ]]; then
    echo "[Info] Proxmox VE $_version is greater than or equal to 8."
else
    echo "[Warn] Proxmox VE $_version is less than 8. Some data may not be formatted as expected. See: https://pve.proxmox.com/pve-docs/chapter-pve-faq.html#faq-support-table"
fi

# Check if ninjarmm-cli command exists
ninjarmm_cli="/opt/NinjaRMMAgent/programdata/ninjarmm-cli"
if [[ -z $ninjarmm_cli ]]; then
    echo "[Error] The ninjarmm-cli command does not exist in the default path. Please ensure the NinjaRMM agent is installed before running this script."
    exit 1
else
    # ninjarmm-cli command exists in the default path
    echo -n
fi

# Run the pvesh command to get the status information
if ! pvesh_status_output=$(pvesh get /cluster/status --noborder); then
    echo "[Error] Failed to get the Proxmox Node Status."
    echo "$pvesh_status_output"
    exit 1
fi
# Example Output from: pvesh get /cluster/status --noborder
# id        name     type    ip            level local nodeid nodes online quorate version
# cluster   cluster1 cluster                                      4        1       4
# node/pve1 pve1     node    192.168.1.10  c     0          1       1
# node/pve2 pve2     node    192.168.1.20  c     0          2       1
# node/pve3 pve3     node    192.168.1.30  c     0          3       1
# node/pve4 pve4     node    192.168.1.40  c     1          4       1

# Exclude the cluster information then skip the first line
node_status=$(echo "$pvesh_status_output" | grep -v "cluster" | tail -n +2)

# Create a table with the node status information with only the columns named id, name, ip, and online
if [[ "$(echo "${_version}" | awk -F. '{print $1}')" -ge 8 ]]; then
    data_table=$(echo "$node_status" | awk '{print $7, $2, $4, $8}' | column -t)
else
    data_table=$(echo "$node_status" | awk '{print $7, $2, $4, $7}' | column -t)
fi

# Convert the table to an HTML table with headers
result_table=$(echo "$data_table" | awk 'BEGIN {print "<table style=\"white-space:nowrap;\"><tr><th>Node ID</th><th>Node Name</th><th>IP Address</th><th>Online Status</th><th>Votes</th></tr>"} {print "<tr>"; for(i=1;i<=NF;i++) print "<td>" $i "</td>"; print "<td>1</td></tr>"} END {print "</table>"}')

# Save the result to the WYSIWYG custom field
if [[ -n "$wysiwyg_custom_field" ]]; then
    # Check if the NinjaRMM CLI exists and is executable
    if [[ -x "$ninjarmm_cli" ]]; then
        # Save the result to the custom field
        if hideOutput=$("$ninjarmm_cli" set "$wysiwyg_custom_field" "$result_table" 2>&1); then
            echo "[Info] Successfully set custom field: $wysiwyg_custom_field"
        else
            echo "[Error] Failed to set custom field: $wysiwyg_custom_field. Custom Field does not exit or does not have write permissions."
            _exit_code=1
        fi
    else
        echo "[Error] NinjaRMM CLI not found or not executable"
        _exit_code=1
    fi
fi

# Format the output for the multiline custom field
pvesh_status_output=$(
    # Exclude the cluster information then skip the first line
    echo "$data_table" | awk '{if (NR == 1) print "--------"; print "Node ID: " $1 "\nNode Name: " $2 "\nIP Address: " $3 "\nOnline Status: " $4 "\nVotes: 1\n"; if (NR != NF) print "--------"}'
)

# Save the result to the multiline custom field
_exit_code=0
if [[ -n "$multiline_custom_field" ]]; then
    if [[ -x "$ninjarmm_cli" ]]; then
        if hideOutput=$("$ninjarmm_cli" set "$multiline_custom_field" "$pvesh_status_output" 2>&1); then
            echo "[Info] Successfully set custom field: $multiline_custom_field"
        else
            echo "[Error] Failed to set custom field: $multiline_custom_field. Custom Field does not exit or does not have write permissions."
            _exit_code=1
        fi
    else
        echo "[Error] NinjaRMM CLI not found or not executable"
        _exit_code=1
    fi
fi

# Output the result
echo "${pvesh_status_output}"

exit $_exit_code

 

Description détaillée

Le script est conçu pour récupérer le statut d’un nœud Proxmox et enregistrer les informations dans un champ personnalisé multiligne ou un champ personnalisé WYSIWYG. Découvrons ses fonctionnalités étape par étape :

1. Arguments de la ligne de commande

  • Le script accepte deux arguments de ligne de commande : les noms du champ personnalisé multiligne et du champ personnalisé WYSIWYG.

2. Validation des champs personnalisés

  • Il vérifie si les champs personnalisés sont définis et s’assure qu’ils ne sont pas nuls ou identiques.

3. Vérification des outils et des autorisations

  • Le script vérifie la présence des outils nécessaires (pvesh et ninjarmm-cli) et vérifie s’il s’exécute avec un accès root.

4. Récupérer l’état du nœud

  • Il exécute la commande pvesh get /cluster/status –noborder pour récupérer l’état des nœuds du cluster Proxmox.

5. Traitement des données

  • La sortie est traitée pour extraire les informations pertinentes, telles que l’ID du nœud, le nom, l’adresse IP et l’état en ligne. Ces informations sont présentées sous forme de tableau.

6. Enregistrer dans les champs personnalisés

  • Les données formatées sont enregistrées dans les champs personnalisés spécifiés à l’aide de la commande ninjarmm-cli. Si le champ WYSIWYG est spécifié, les données sont converties en tableau HTML.

7. Sortie

  • Si aucun champ personnalisé n’est spécifié, le script affiche l’état du nœud directement sur la console.

Cas d’utilisation potentiels

Étude de cas : Un professionnel de l’informatique qui gère un cluster Proxmox

Imaginez un professionnel de l’informatique nommé Alex, qui gère un cluster Proxmox pour une entreprise de taille moyenne. Alex doit contrôler régulièrement l’état des nœuds pour s’assurer qu’ils sont en ligne et qu’ils fonctionnent correctement. En utilisant ce script, Alex peut automatiser la récupération et l’enregistrement des états des nœuds dans des champs personnalisés au sein de son système de surveillance. Cette automatisation permet à Alex de gagner beaucoup de temps et de s’assurer que tout problème est rapidement détecté et traité.

Comparaisons

Comparaison entre la surveillance manuelle et un script automatisé

Traditionnellement, le contrôle de l’état des nœuds implique l’exécution manuelle de commandes et l’enregistrement des résultats, un processus qui prend du temps et qui est sujet aux erreurs. Ce script automatise l’ensemble du flux de travail, garantissant ainsi une collecte de données cohérente et précise. Par rapport à d’autres méthodes, telles que l’utilisation d’outils de surveillance tiers, ce script offre une solution légère et personnalisable adaptée aux environnements Proxmox.

FAQ

  1. Qu’est-ce que Proxmox VE ? Proxmox VE est un environnement de virtualisation de serveurs open-source utilisé pour gérer les machines virtuelles, les conteneurs et le stockage.
  2. Pourquoi dois-je exécuter le script en tant que root ? Le script requiert les privilèges d’administrateur pour accéder aux informations sur l’état des nœuds Proxmox et effectuer les vérifications nécessaires sur le système.
  3. Que se passe-t-il si la commande pvesh échoue ? Si la commande pvesh échoue, le script affiche un message d’erreur et se termine.
  4. Puis-je utiliser ce script sans l’outil ninjarmm-cli ? Non, le script s’appuie sur ninjarmm-cli pour enregistrer les informations sur l’état des nœuds dans des champs personnalisés.

Implications

L’utilisation de ce script garantit que les informations relatives à l’état des nœuds sont collectées et enregistrées de manière cohérente, ce qui est essentiel pour maintenir l’intégrité de l’infrastructure informatique. En automatisant ce processus, les professionnels de l’informatique peuvent se concentrer sur des tâches plus stratégiques, ce qui améliore l’efficacité globale et réduit le risque de problèmes passant inaperçus.

Recommandations

  • Exécuter régulièrement: Planifiez l’exécution du script à intervalles réguliers afin de garantir la mise à jour des informations relatives à l’état des nœuds.
  • Surveiller les résultats: Vérifiez régulièrement les champs personnalisés ou les journaux de sortie pour détecter toute anomalie.
  • S’assurer que les outils sont installés: Vérifiez que pvesh et ninjarmm-cli sont installés et accessibles sur le système.

Conclusion

L’automatisation de la surveillance de l’état des nœuds à l’aide de ce script améliore l’efficacité et la fiabilité de la gestion des clusters Proxmox. En intégrant ce script dans votre flux de travail, vous pouvez garantir des mises à jour d’état précises et opportunes, ce qui améliore la stabilité et les performances de votre environnement informatique.

La suite d’outils de NinjaOne, y compris NinjaRMM, fournit des capacités supplémentaires pour une gestion informatique complète, complétant la fonctionnalité de ce script.

Pour aller plus loin

Pour créer une équipe informatique efficace et performante, il est essentiel d'avoir une solution centralisée qui joue le rôle de nœud principal pour vos services. NinjaOne permet aux équipes informatiques de surveiller, gérer, sécuriser et prendre en charge tous les appareils, où qu'ils soient, sans avoir besoin d'une infrastructure complexe sur site. Pour en savoir plus sur NinjaOne Endpoint Management, participez à une visite guidée, ou profitez d'un essai gratuit de la plateforme NinjaOne.

Catégories :

Vous pourriez aussi aimer

×

Voir NinjaOne en action !

En soumettant ce formulaire, j'accepte la politique de confidentialité de NinjaOne.

Termes et conditions NinjaOne

En cliquant sur le bouton “J’accepte” ci-dessous, vous indiquez que vous acceptez les termes juridiques suivants ainsi que nos conditions d’utilisation:

  • Droits de propriété: NinjaOne possède et continuera de posséder tous les droits, titres et intérêts relatifs au script (y compris les droits d’auteur). NinjaOne vous accorde une licence limitée pour l’utilisation du script conformément à ces conditions légales.
  • Limitation de l’utilisation: Les scripts ne peuvent être utilisés qu’à des fins personnelles ou professionnelles internes légitimes et ne peuvent être partagés avec d’autres entités.
  • Interdiction de publication: Vous n’êtes en aucun cas autorisé à publier le script dans une bibliothèque de scripts appartenant à, ou sous le contrôle d’un autre fournisseur de logiciels.
  • Clause de non-responsabilité: Le texte est fourni “tel quel” et “tel que disponible”, sans garantie d’aucune sorte. NinjaOne ne promet ni ne garantit que le script sera exempt de défauts ou qu’il répondra à vos besoins ou attentes particulières.
  • Acceptation des risques: L’utilisation du script est sous votre propre responsabilité. Vous reconnaissez qu’il existe certains risques inhérents à l’utilisation du script, et vous comprenez et assumez chacun de ces risques.
  • Renonciation et exonération de responsabilité: Vous ne tiendrez pas NinjaOne pour responsable des conséquences négatives ou involontaires résultant de votre utilisation du script, et vous renoncez à tout droit ou recours légal ou équitable que vous pourriez avoir contre NinjaOne en rapport avec votre utilisation du script.
  • EULA: Si vous êtes un client de NinjaOne, votre utilisation du script est soumise au contrat de licence d’utilisateur final qui vous est applicable (End User License Agreement (EULA)).