Guida completa per il monitoraggio dello stato dei cluster Proxmox in Linux

Il mantenimento della stabilità e delle prestazioni di un cluster Proxmox è fondamentale per i professionisti IT e i fornitori di servizi gestiti (MSP). Un cluster Proxmox offre numerosi vantaggi, tra cui alta disponibilità, gestione efficiente delle risorse e virtualizzazione completa. Tuttavia, il monitoraggio del suo stato è essenziale per garantire un funzionamento regolare.

In questo articolo analizzeremo uno script Bash progettato per ottenere lo stato del cluster Proxmox e salvarlo in un campo personalizzato. Esploreremo le funzionalità dello script, i potenziali casi d’uso, i confronti, le domande frequenti, le implicazioni e le best practice.

Background

Proxmox Virtual Environment (VE) è una soluzione open-source per la gestione della virtualizzazione dei server che consente ai professionisti IT di distribuire e gestire virtual machine e container. Il clustering in Proxmox è una caratteristica fondamentale che consente a più nodi Proxmox VE di lavorare insieme, fornendo alta disponibilità e bilanciamento del carico. Il monitoraggio dello stato del cluster è fondamentale per mantenere l’integrità e le prestazioni dell’ambiente virtuale.

Questo script è pensato per i professionisti IT che hanno bisogno di un modo efficiente per monitorare i cluster Proxmox. Recupera lo stato del cluster e salva le informazioni in un campo personalizzato multilinea o in un campo personalizzato WYSIWYG, facilitando la gestione e la revisione dello stato di integrità del cluster.

Lo script per monitorare lo stato dei cluster Proxmox

#!/usr/bin/env bash

# Description: Get the Proxmox Cluster 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

if [[ -n "${multilineCustomField}" && "${multilineCustomField}" != "null" ]]; then
    multiline_custom_field=$multilineCustomField
fi
if [[ -n "${wysiwygCustomField}" && "${wysiwygCustomField}" != "null" ]]; then
    wysiwyg_custom_field=$wysiwygCustomField
fi

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

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 pvecm &>/dev/null; then
    echo "[Error] The Proxmox VE API tool 'pvecm' 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

# 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 pvecm command to get the status information
if ! pvecm_status_output=$(pvecm status); then
    echo "[Error] Failed to get the Proxmox Cluster Status."
    echo "$pvecm_status_output"
    exit 1
fi
# Example Output:
# Cluster information
# -------------------
# Name:             cluster1
# Config Version:   4
# Transport:        knet
# Secure auth:      on
#
# Quorum information
# ------------------
# Date:             Mon Apr  8 10:33:16 2024
# Quorum provider:  corosync_votequorum
# Nodes:            4
# Node ID:          0x00000004
# Ring ID:          1.631
# Quorate:          Yes
#
# Votequorum information
# ----------------------
# Expected votes:   4
# Highest expected: 4
# Total votes:      4
# Quorum:           3
# Flags:            Quorate
#
# Membership information
# ----------------------
#     Nodeid      Votes Name
# 0x00000001          1 10.10.10.17
# 0x00000002          1 10.10.10.18
# 0x00000003          1 10.10.10.19
# 0x00000004          1 10.10.10.20 (local)

# Cluster Table
# Get the cluster name
cluster_name=$(echo "$pvecm_status_output" | grep -oP 'Name:\s+\K\w+' | head -n 1)
# Get the Config Version
config_version=$(echo "$pvecm_status_output" | grep -oP 'Config Version:\s+\K\d+' | head -n 1)
# Get the Transport
transport=$(echo "$pvecm_status_output" | grep -oP 'Transport:\s+\K\w+' | head -n 1)
# Get the Secure auth
secure_auth=$(echo "$pvecm_status_output" | grep -oP 'Secure auth:\s+\K\w+' | head -n 1)

# Create Cluster Status label
cluster_table="<h2>Cluster Status</h2>"
# Create the Cluster Status table
cluster_table+="<table style='white-space:nowrap;'><tr><th>Cluster Name</th><th>Config Version</th><th>Transport</th><th>Secure Auth</th></tr>"
cluster_table+="<tr><td>$cluster_name</td><td>$config_version</td><td>$transport</td><td>$secure_auth</td></tr></table>"

# Quorum Table
# Get the Quorum Date
quorum_date=$(echo "$pvecm_status_output" | grep -oP 'Date:\s+\K.*' | head -n 1)
# Get the Quorum provider
quorum_provider=$(echo "$pvecm_status_output" | grep -oP 'Quorum provider:\s+\K\w+' | head -n 1)
# Get the Nodes
nodes=$(echo "$pvecm_status_output" | grep -oP 'Nodes:\s+\K\d+' | head -n 1)
# Get the Node ID
node_id=$(echo "$pvecm_status_output" | grep -oP 'Node ID:\s+\K\w+' | head -n 1)
# Get the Ring ID
ring_id=$(echo "$pvecm_status_output" | grep -oP 'Ring ID:\s+\K[\d.]+')
# Get the Quorate
quorate=$(echo "$pvecm_status_output" | grep -oP 'Quorate:\s+\K\w+')

# Create Quorum Status label
quorum_table="<h2>Quorum Status</h2>"
# Create the Quorum Status table
quorum_table+="<table style='white-space:nowrap;'><tr><th>Quorum Date</th><th>Quorum Provider</th><th>Nodes</th><th>Node ID</th><th>Ring ID</th><th>Quorate</th></tr>"
quorum_table+="<tr><td>$quorum_date</td><td>$quorum_provider</td><td>$nodes</td><td>$node_id</td><td>$ring_id</td><td>$quorate</td></tr></table>"

# Votequorum Table
# Get the Expected votes
expected_votes=$(echo "$pvecm_status_output" | grep -oP 'Expected votes:\s+\K\d+')
# Get the Highest expected
highest_expected=$(echo "$pvecm_status_output" | grep -oP 'Highest expected:\s+\K\d+')
# Get the Total votes
total_votes=$(echo "$pvecm_status_output" | grep -oP 'Total votes:\s+\K\d+')
# Get the Quorum
quorum=$(echo "$pvecm_status_output" | grep -oP 'Quorum:\s+\K\d+')
# Get the Flags
flags=$(echo "$pvecm_status_output" | grep -oP 'Flags:\s+\K\w+')

# Create Votequorum Status label
votequorum_table="<h2>Votequorum Status</h2>"
# Create the Votequorum Status table
votequorum_table+="<table style='white-space:nowrap;'><tr><th>Expected Votes</th><th>Highest Expected</th><th>Total Votes</th><th>Quorum</th><th>Flags</th></tr>"
votequorum_table+="<tr><td>$expected_votes</td><td>$highest_expected</td><td>$total_votes</td><td>$quorum</td><td>$flags</td></tr></table>"

# Get the Membership information table
memberships=$(echo "$pvecm_status_output" | grep -oP '0x000000\d+\s+\d+\s+\d+\.\d+\.\d+\.\d+')
# Split memberships into an array
OLDIFS=$IFS
IFS=$'\n' read -r -d '' -a membership_array <<<"$memberships"
IFS=$OLDIFS

# Membership Table
# Create Membership Status label
membership_table="<h2>Membership Status</h2>"
# Create the Membership Status table
membership_table+="<table style='white-space:nowrap;'><tr><th>Node ID</th><th>Votes</th><th>Name</th></tr>"
for membership in "${membership_array[@]}"; do
    node_id=$(echo "$membership" | grep -oP '0x000000\d+')
    votes=$(echo "$membership" | grep -oP '\d+\s+(?=\d+\.\d+\.\d+\.\d+)')
    name=$(echo "$membership" | grep -oP '\d+\.\d+\.\d+\.\d+')
    membership_table+="<tr><td>$node_id</td><td>$votes</td><td>$name</td></tr>"
done
membership_table+="</table>"

# Combine all tables into one
result_table="$cluster_table</br>$quorum_table</br>$votequorum_table</br>$membership_table"

# Save the result to the custom field
_exit_code=0
if [[ -n "$multiline_custom_field" ]]; then
    if [[ -x "$ninjarmm_cli" ]]; then
        if hideOutput=$("$ninjarmm_cli" set "$multiline_custom_field" "$pvecm_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

if [[ -n "$wysiwyg_custom_field" ]]; then
    if [[ -x "$ninjarmm_cli" ]]; then
        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

# Error out after checking both custom fields
if [[ $_exit_code -ne 0 ]]; then
    exit 1
fi

# Output the result if no custom fields are set
if [[ -z "${wysiwyg_custom_field}" ]] && [[ -z "${multiline_custom_field}" ]]; then
    echo "${pvecm_status_output}"
fi

 

Analisi dettagliata

Analizziamo passo per passo lo script per monitorare lo stato dei cluster Proxmox per comprenderne il funzionamento e la logica.

  1. Inizializzazione e argomenti della riga di comando: Lo script per monitorare lo stato dei cluster Proxmox inizia con due argomenti della riga di comando: i nomi dei campi personalizzati multilinea e WYSIWYG.
  2. Convalida e configurazione: Convalida e assegna i valori ai campi personalizzati, assicurandosi che non siano nulli o identici.
  3. Verifica della disponibilità degli strumenti e delle autorizzazioni: Lo script per monitorare lo stato dei cluster Proxmox controlla se gli strumenti necessari, come pvecm e ninjarmm-cli, sono disponibili e assicura che lo script venga eseguito con i privilegi di root.
  4. Recupero e analisi dello stato del cluster: Esegue il comando pvecm status per recuperare lo stato del cluster e memorizza l’output in una variabile.
  5. Estrazione delle informazioni rilevanti: Lo script per monitorare lo stato dei cluster Proxmox utilizza grep e le espressioni regolari per analizzare ed estrarre le informazioni rilevanti, come il nome del cluster, la versione della configurazione, il metodo di trasporto, lo stato dell’autenticazione sicura, le informazioni sul quorum e i dettagli dei membri.
  6. Creazione di tabelle HTML: Lo script per monitorare lo stato dei cluster Proxmox formatta i dati estratti in tabelle HTML per una migliore leggibilità e organizzazione.
  7. Salvataggio dei risultati in campi personalizzati: A seconda della disponibilità dei campi personalizzati, lo script per monitorare lo stato dei cluster Proxmox salva i risultati grezzi e formattati nei campi personalizzati specificati usando il comando ninjarmm-cli.

Casi d’uso potenziali

Immagina un MSP che gestisce più cluster Proxmox per vari clienti. Controllare e registrare regolarmente lo stato dei cluster può richiedere molto tempo. Questo script automatizza il processo per monitorare lo stato dei cluster Proxmox, assicurando che le informazioni aggiornate sullo stato siano sempre disponibili in un formato strutturato. Per esempio, un professionista IT può utilizzare questo script per:

  • Raccogliere e salvare automaticamente lo stato dei cluster Proxmox ogni mattina.
  • Generare report per i clienti, evidenziando lo stato di integrità dei cluster e qualsiasi problema potenziale.
  • Integrarlo con gli strumenti di monitoraggio al fine di attivare avvisi se specifiche metriche del cluster indicano problemi.

Confronti

Sebbene esistano altri metodi per monitorare i cluster Proxmox, come i controlli manuali o l’utilizzo di strumenti di monitoraggio di terze parti, questo script offre diversi vantaggi:

  • Automazione: A differenza dei controlli manuali, questo script automatizza il processo, riducendo le possibilità di errore umano e facendo risparmiare tempo.
  • Personalizzazione: La possibilità di salvare le informazioni sullo stato in campi personalizzati consente una facile integrazione con i sistemi di monitoraggio e reporting esistenti.
  • Economicamente vantaggioso: Questa soluzione sfrutta strumenti e script integrati, evitando la necessità di costose soluzioni di terze parti.

Domande frequenti

D1: Devo essere un esperto di scripting Bash per usare questo script?

No, è sufficiente una conoscenza di base su come eseguire uno script e comprenderne i parametri.

D2: Posso personalizzare lo script per altri tipi di campi personalizzati?

Sì, è possibile modificare lo script per monitorare lo stato dei cluster Proxmox per gestire altri campi personalizzati modificando le sezioni pertinenti.

D3: Cosa succede se lo script incontra un errore?

Lo script per monitorare lo stato dei cluster Proxmox include metodi di gestione degli errori per informare l’utente di strumenti mancanti, problemi di autorizzazioni o errori in termini di comandi.

Implicazioni

Il monitoraggio regolare dello stato dei cluster Proxmox contribuisce a mantenere l’affidabilità e le prestazioni del sistema. Utilizzando questo script, i professionisti IT possono gestire in modo proattivo l’integrità dei cluster Proxmox, prevenire i tempi di inattività e garantire un utilizzo ottimale delle risorse. Ciò contribuisce alla sicurezza informatica complessiva e all’efficienza operativa.

Raccomandazioni

  • Esegui lo script regolarmente: Pianifica l’esecuzione dello script per monitorare lo stato dei cluster Proxmox a intervalli regolari utilizzando cron job per garantire un monitoraggio continuo.
  • Controlla i risultati: Esamina regolarmente i risultati salvati per identificare tempestivamente eventuali anomalie o problemi.
  • Conserva i backup: Conserva i backup delle configurazioni dei cluster Proxmox e aggiorna regolarmente lo script per gestire le nuove versioni di Proxmox.

Considerazioni finali

Un monitoraggio efficiente è fondamentale per la gestione dei cluster Proxmox e questo script Bash fornisce una soluzione semplificata per i professionisti IT e gli MSP. Automatizzando la raccolta delle informazioni sullo stato e formattando i risultati in campi personalizzati, migliorerai la tua capacità di mantenere l’integrità e le prestazioni del cluster. Strumenti come NinjaOne sono complementari a questo script fornendo una piattaforma completa per la gestione dell’IT e assicurando che tutte le esigenze di monitoraggio siano soddisfatte in modo efficiente.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.