Guida agli script Linux: come automatizzare la raccolta di informazioni sulle VM Proxmox

Nell’attuale panorama IT, gestione e monitoraggio efficienti degli ambienti virtuali sono fondamentali per gli amministratori di sistema e i Managed Service Provider (MSP). Gli ambienti virtuali, come quelli gestiti da Proxmox, richiedono una supervisione regolare per garantire un funzionamento normale e prestazioni ottimali.

L’automazione della raccolta delle informazioni sullo stato delle virtual machine (VM) e di quelle di base non solo fa risparmiare tempo, ma riduce anche il rischio di errori umani. In questo articolo analizzeremo uno script bash progettato per recuperare e visualizzare lo stato e i dettagli delle VM guest Proxmox, per evidenziare la sua utilità e il modo in cui può semplificare le operazioni IT.

Background

Proxmox è una popolare soluzione open-source per la gestione della virtualizzazione, che combina KVM e la virtualizzazione basata su container in un’unica piattaforma. Per i professionisti IT e gli MSP, il monitoraggio dello stato delle VM Proxmox e dei container è un’attività di routine ma vitale. Questo script risponde alla necessità di un metodo automatizzato e coerente per raccogliere e visualizzare le informazioni sulla VM, presentandole in un formato di facile accesso e interpretazione.

Lo script per visualizzare le informazioni sulle VM Proxmox

#!/usr/bin/env bash

# Description: This script gets the status and basic info of all Proxmox guests on a host and saves it to a WYSIWYG custom field.
#
# Release Notes: Initial Release
# 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).
#
# Below are all the (case sensitive) valid parameters for this script.
# Only the custom field name is required!
# Preset Parameter: "Custom_Field_Name"
#   Custom_Field_Name: The name of the WYSIWYG custom field to save the VM info to.

Custom_Field_Name=$1

if [[ -n "${customFieldName}" ]]; then
    Custom_Field_Name="${customFieldName}"
fi

if [[ -z "${Custom_Field_Name}" || "${Custom_Field_Name}" == "null" ]]; then
    echo "The custom field name is required."
    echo " Example: guests"
    exit 1
fi

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

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

function SetCustomField() {
    /opt/NinjaRMMAgent/programdata/ninjarmm-cli "$@"
}

# Get the status and basic info of all Proxmox VMs on a host
qemu_guests=$(pvesh get /nodes/localhost/qemu --output-format=json)

# Create a table to store the VM info with the headers: Name, Status, Memory, CPUs, Disk Sizes
vm_table="<table><tr><th>Status</th><th>ID</th><th>Name</th><th>Memory</th><th>CPUs</th><th>Disk Sizes Combined</th></tr>"

# Loop through each VM and add the info to the table
qemu_table=$(echo "$qemu_guests" | python3 -c '
import sys, json

# Function to convert bytes to human readable format
def human_readable_size(size):
    for unit in ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB"]:
        if size < 1024:
            return f"{size:.2f} {unit}"
        size /= 1024

qemu_guests = json.load(sys.stdin)
vm_table = ""

for qemu in qemu_guests:
    qemu_id = qemu["vmid"]
    qemu_name = qemu["name"]
    qemu_status = qemu["status"]
    # Convert the memory from bytes to GB
    qemu_mem = human_readable_size(qemu["maxmem"])
    qemu_cpus = qemu["cpus"]
    # Convert the disk size from bytes to GB
    qemu_disk = human_readable_size(qemu["maxdisk"])

    # Add HTML blank space if values are empty
    qemu_id = qemu_id if qemu_id else "&nbsp;"
    qemu_name = qemu_name if qemu_name else "&nbsp;"
    qemu_mem = qemu_mem if qemu_mem else "&nbsp;"
    qemu_cpus = qemu_cpus if qemu_cpus else "&nbsp;"
    qemu_disk = qemu_disk if qemu_disk else "&nbsp;"

    if "running" in qemu_status:
        status_text = "<tr class='"'success'"'><td>Running</td>"
    elif "stopped" in qemu_status:
        status_text = "<tr class='"'danger'"'><td>Stopped</td>"
    else:
        status_text = "<tr class='"'other'"'><td>{}</td>".format(qemu_status)

    vm_table += "{}<td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>".format(
        status_text, qemu_id, qemu_name, qemu_mem, qemu_cpus, qemu_disk
    )

print(vm_table)
')
vm_table="$vm_table$qemu_table"

# Loop through each lxc and add the info to the table
lxc_guests=$(pvesh get /nodes/localhost/lxc --output-format=json)
# Loop through each lxc and add the info to the table
lxc_table=$(echo "$lxc_guests" | python3 -c '
import sys, json

# Function to convert bytes to human readable format
def human_readable_size(size):
    for unit in ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB"]:
        if size < 1024:
            return f"{size:.2f} {unit}"
        size /= 1024

lxc_guests = json.load(sys.stdin)
vm_table = ""

for lxc in lxc_guests:
    lxc_id = lxc["vmid"]
    lxc_name = lxc["name"]
    lxc_status = lxc["status"]
    # Convert the memory from bytes to GB
    lxc_mem = human_readable_size(lxc["maxmem"])
    lxc_cpus = lxc["cpus"]
    # Convert the disk size from bytes to GB
    lxc_disk = human_readable_size(lxc["maxdisk"])

    # Add HTML blank space if values are empty
    lxc_id = lxc_id if lxc_id else "&nbsp;"
    lxc_name = lxc_name if lxc_name else "&nbsp;"
    lxc_mem = lxc_mem if lxc_mem else "&nbsp;"
    lxc_cpus = lxc_cpus if lxc_cpus else "&nbsp;"
    lxc_disk = lxc_disk if lxc_disk else "&nbsp;"

    if "running" in lxc_status:
        status_text = "<tr class='"'success'"'><td>Running</td>"
    elif "stopped" in lxc_status:
        status_text = "<tr class='"'danger'"'><td>Stopped</td>"
    else:
        status_text = "<tr class='"'other'"'><td>{}</td>".format(lxc_status)

    vm_table += "{}<td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>".format(
        status_text, lxc_id, lxc_name, lxc_mem, lxc_cpus, lxc_disk
    )

print(vm_table)
')
vm_table="$vm_table$lxc_table"

# Close the table
vm_table="$vm_table</table>"

# Highlight the running and stopped VMs
vm_table=$(echo "$vm_table" | sed 's/<tr><td>running<\/td>/<tr class="success"><td>Running<\/td>/')
vm_table=$(echo "$vm_table" | sed 's/<tr><td>stopped<\/td>/<tr class="danger"><td>Stopped<\/td>/')

# Save the table to the custom field
if ! SetCustomField set "$Custom_Field_Name" "$vm_table"; then
    echo "Failed to save the Proxmox VM info to the custom field: $Custom_Field_Name"
    exit 1
fi
echo "The Proxmox VM info has been saved to the custom field: $Custom_Field_Name"

 

Analisi dettagliata

Lo script bash fornito recupera lo stato e le informazioni essenziali di tutte le VM guest di Proxmox su un host e salva questi dati in un campo personalizzato. Ciò è particolarmente utile per gli ambienti con numerose virtual machine, dove i controlli manuali possono richiedere molto tempo e sono soggetti a errori.

Spiegazione passo per passo

1. Inizializzazione dello script e gestione dei parametri:

  • Lo script per visualizzare le informazioni sulle VM Proxmox inizia definendo il nome del campo personalizzato, che è un parametro obbligatorio. In questo campo personalizzato verranno memorizzate le informazioni sulla virtual machine.
  • Se il nome del campo personalizzato non viene fornito o non è valido, lo script per visualizzare le informazioni sulle VM Proxmox mostra un messaggio di errore.

2. Verifica della disponibilità degli strumenti:

  • Lo script per visualizzare le informazioni sulle VM Proxmox verifica la disponibilità degli strumenti necessari: pvesh (Proxmox VE API tool) e python3. Se questi strumenti non vengono trovati, lo script mostra un messaggio di errore appropriato.

3. Verifica dei privilegi di root:

  • Lo script per visualizzare le informazioni sulle VM Proxmox controlla se è in esecuzione con i privilegi di root. In caso contrario, mostra un messaggio di errore.

4. Recupero delle informazioni sulla VM Proxmox:

  • Utilizzando pvesh, lo script per visualizzare le informazioni sulle VM Proxmox recupera informazioni sulle virtual machine QEMU e sui container LXC dall’host Proxmox.
  • Queste informazioni vengono elaborate con Python per generare una tabella HTML con dettagli quali lo stato, l’ID, il nome, la memoria, le CPU e le dimensioni combinate delle unità.

5. Generazione della tabella HTML:

  • Lo script Python incorporato nello script bash formatta i dati JSON recuperati in una tabella HTML. Questa tabella è strutturata in modo da evidenziare in modo diverso le virtual machine in esecuzione e quelle interrotte.

6. Salvataggio della tabella in un campo personalizzato:

  • La tabella HTML generata viene salvata nel campo personalizzato specificato utilizzando lo strumento NinjaRMM CLI.

Casi d’uso potenziali

Immagina un MSP che gestisce più ambienti Proxmox per diversi clienti. Controllare manualmente lo stato e l’allocazione delle risorse di ogni virtual machine su diversi host può essere complicato. Distribuendo questo script, l’MSP può automatizzare la raccolta di questi dati e averli a disposizione in un campo personalizzato, accessibile dalla propria interfaccia di gestione. Questo non solo aumenta l’efficienza, ma garantisce anche la possibilità di rispondere rapidamente a qualsiasi problema si presenti.

Confronti

Altri metodi per raccogliere informazioni sulle virtual machine potrebbero comportare l’esecuzione manuale di comandi e la compilazione dei risultati, che richiedono molto tempo e sono soggetti a errori. Strumenti come l’interfaccia web di Proxmox forniscono le informazioni necessarie, ma richiedono una navigazione e un controllo manuali. Questo script, invece, automatizza l’intero processo per visualizzare le informazioni sulle VM Proxmox, garantendo coerenza e facendo risparmiare tempo prezioso.

Domande frequenti

D: Cosa succede se lo script per visualizzare le informazioni sulle VM Proxmox non riesce a trovare pvesh o python3?
R: Lo script per visualizzare le informazioni sulle VM Proxmox verifica la presenza di queste dipendenze all’inizio e mostra un chiaro messaggio di errore se non vengono trovate, guidando l’utente a installare gli strumenti mancanti.

D: Lo script può essere eseguito senza i privilegi di root?
R: No, lo script per visualizzare le informazioni sulle VM Proxmox deve essere eseguito come root per accedere alle informazioni di sistema necessarie.

D: Cosa succede se il nome del campo personalizzato non viene fornito?
R: Lo script per visualizzare le informazioni sulle VM Proxmox richiede il nome del campo personalizzato come parametro. Se non viene fornito, lo script uscirà con un messaggio di errore.

Implicazioni

L’automazione della raccolta di informazioni sulle VM Proxmox non solo migliora l’efficienza operativa, ma aumenta anche la sicurezza informatica. Controlli regolari e automatizzati assicurano che tutte le virtual machine siano registrate e funzionino come previsto, riducendo il rischio di downtime passati inosservati o di errata allocazione delle risorse.

Raccomandazioni

Quando utilizzi questo script, assicurati che:

  • Lo script per visualizzare le informazioni sulle VM Proxmox venga eseguito regolarmente per mantenere aggiornate le informazioni sulle VM.
  • I permessi siano impostati in modo che lo script venga eseguito come root.
  • Le dipendenze (pvesh, python3, NinjaRMM CLI) siano installate e configurate correttamente.

Considerazioni finali

Questo script per visualizzare le informazioni sulle VM Proxmox è uno strumento prezioso per i professionisti IT che gestiscono ambienti Proxmox, in quanto semplifica il processo di raccolta e visualizzazione delle informazioni sulle VM Proxmox. Per coloro che utilizzano NinjaOne, questo script si integra ulteriormente nel loro flusso di lavoro, rendendo più facile mantenere una visione chiara e aggiornata della loro infrastruttura virtuale. Automatizzando le attività di routine, i professionisti IT possono concentrarsi su attività più strategiche, migliorando la produttività complessiva e l’affidabilità del sistema.

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.