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.
- 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.
- Convalida e configurazione: Convalida e assegna i valori ai campi personalizzati, assicurandosi che non siano nulli o identici.
- 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.
- 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.
- 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.
- 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.
- 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.