Linux-Skript-Guide: Automatisierung der Proxmox VM-Informationserfassung

In der heutigen IT-Welt sind die effiziente Verwaltung und Überwachung virtueller Umgebungen für Systemadministratoren und Managed Service Provider (MSPs) ausschlaggebend. Virtuelle Umgebungen, wie die durch Proxmox verwalteten, müssen regelmäßig überwacht werden, um einen reibungslosen Betrieb und optimale Leistung zu gewährleisten.

Die automatisierte Erfassung von Status- und Basisinformationen zu virtuellen Maschinen (VM) spart nicht nur Zeit, sondern verringert auch das Risiko menschlichen Versagens. Vielleicht fragen Sie sich nun, wie Sie die Proxmox-VM-Informationserfassung automatisieren können. In diesem Blogbeitrag wird ein Bash-Skript vorgestellt, das den Status und die Details von Proxmox-Gästen automatisch abruft und anzeigt. Es wird dargelegt, wie es den IT-Betrieb durch seine Nützlichkeit optimieren kann.

Kontext

Proxmox ist eine beliebte Open-Source-Virtualisierungs-Verwaltungslösung, die KVM und Container-basierte Virtualisierung auf einer einzigen Plattform vereint. Für IT-Experten und MSPs ist die Überwachung des Zustands von VM und Containern eine routinemäßige, aber essenzielle Aufgabe. Dieses Skript erfüllt den Bedarf an einer automatisierten, konsistenten Methode zur Sammlung und Darstellung von VM-Informationen in einem benutzerfreundlichen Format, das leicht zugänglich und interpretierbar ist.

Das Skript

#!/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"

 

Greifen Sie auf über 300 Skripte im NinjaOne Dojo zu.

Zugang erhalten

Detailansicht

Das mitgelieferte Bash-Skript, mit dem Sie die Proxmox-VM-Informationserfassung automatisieren können, ruft den Status und wesentliche Informationen aller Proxmox-Gäste auf einem Host ab und speichert diese Daten in einem benutzerdefinierten Feld. Dies ist besonders nützlich für Umgebungen mit zahlreichen VM, in denen manuelle Prüfungen zeitaufwändig und fehleranfällig sein können.

Schritt-für-Schritt-Erläuterung

1. Skriptinitialisierung und Parameterbehandlung:

  • Das Skript beginnt mit der Definition des Namens vom benutzerdefinierten Feld, der ein obligatorischer Parameter ist. Dieser Feldname speichert die VM-Informationen.
  • Wenn der Name des benutzerdefinierten Feldes nicht angegeben wird oder ungültig ist, wird das Skript mit einer Fehlermeldung beendet.

2. Überprüfung der Tool-Verfügbarkeit:

  • Das Skript prüft die Verfügbarkeit der erforderlichen Tools: pvesh (Proxmox VE API-Tool) und Python3. Wenn diese Tools nicht gefunden werden, wird das Skript mit einer entsprechenden Fehlermeldung beendet.

3. Überprüfung der Root-Rechte:

  • Das Skript kontrolliert, ob es mit Root-Rechten ausgeführt wird. Wenn nicht, wird das Programm mit einer Fehlermeldung beendet.

4. Abruf von VM-Informationen:

  • Mit pvesh ruft das Skript Informationen über QEMU-VM und LXC-Container vom Proxmox-Host ab.
  • Diese Informationen werden mit Python verarbeitet, um eine HTML-Tabelle mit Details wie Status, ID, Namen, Speicher, CPUs und kombinierte Datenträgergrößen zu erzeugen.

5. Generierung der HTML-Tabelle:

  • Das in das Bash-Skript eingebettete Python-Skript formatiert die abgerufenen JSON-Daten in eine HTML-Tabelle. Diese Tabelle ist so gestaltet, dass laufende und gestoppte VM unterschiedlich hervorgehoben werden.

6. Speicherung der Tabelle in einem benutzerdefinierten Feld:

  • Die erzeugte HTML-Tabelle wird mit dem NinjaOne RMM-CLI-Tool in dem angegebenen benutzerdefinierten Feld gespeichert.

Potenzielle Anwendungsfälle

Stellen Sie sich vor, ein MSP verwaltet mehrere Proxmox-Umgebungen für verschiedene Clients. Die manuelle Überprüfung des Status und der Ressourcenzuweisung jeder VM auf verschiedenen Hosts kann mühsam sein. Durch die Verteilung dieses Skripts kann der MSP die Erfassung dieser Daten automatisieren, die dann in einem benutzerdefinierten Feld zur Verfügung stehen, auf das er über seine Verwaltungsoberfläche zugreifen kann. Dies steigert nicht nur die Effizienz, sondern gewährleistet auch, dass er schnell auf alle auftretenden Probleme reagieren kann.

Vergleiche

Andere Methoden zur Erfassung von VM-Informationen können in der manuellen Ausführung von Befehlen und der Zusammenstellung der Ergebnisse bestehen, was zeitaufwändig und fehleranfällig ist. Tools wie die Weboberfläche von Proxmox liefern die benötigten Informationen, erfordern aber eine manuelle Navigation und Überprüfung. Im Gegensatz dazu automatisiert dieses Skript den gesamten Prozess, gewährleistet Konsistenz und spart wertvolle Zeit.

FAQs

F: Was passiert, wenn das Skript pvesh oder python3 nicht findet?
A: Das Skript prüft beim Start auf diese Abhängigkeiten und wird mit einer klaren Fehlermeldung beendet, wenn sie nicht gefunden werden. Außerdem führt es die Benutzer:innen dazu, die fehlenden Tools zu installieren.

F: Kann das Skript ohne Root-Rechte ausgeführt werden?
A: Nein, das Skript muss mit Root-Rechten ausgeführt werden, um Zugriff auf die erforderlichen Systeminformationen zu erhalten.

F: Was geschieht, wenn der Name des benutzerdefinierten Feldes nicht angegeben wird?
A: Das Script benötigt den Namen des benutzerdefinierten Feldes als Parameter. Wenn er nicht angegeben wird, wird das Skript mit einer Fehlermeldung beendet.

Folgen

Wenn Sie die Proxmox-VM-Informationserfassung automatisieren, wird nicht nur die betriebliche Effizienz verbessert, sondern es wird auch die IT-Sicherheit erhöht. Regelmäßige, automatisierte Überprüfungen stellen sicher, dass alle VM erfasst sind und wie erwartet laufen, wodurch die Verringerung des Risikos unbemerkter Ausfallzeiten oder falscher Ressourcenzuweisungen erfolgt.

Empfehlungen

Wenn Sie dieses Skript verwenden, vergewissern Sie sich, dass:

  • das Skript in regelmäßigen Abständen ausgeführt wird, um die VM-Informationen auf dem neuesten Stand zu halten.
  • Sie über geeignete Berechtigungen verfügen, um das Skript mit Root-Rechten ausführen zu dürfen.
  • die Abhängigkeiten (pvesh, python3, NinjaOne RMM-CLI) installiert und korrekt konfiguriert sind.

Abschließende Überlegungen

Dieses Skript ist ein wertvolles Tool für IT-Experten, die Proxmox-Umgebungen verwalten, da es den Prozess der Erfassung und Anzeige von VM-Informationen optimiert. IT-Mitarbeiter:innen, die NinjaOne verwenden, können dieses Skript in ihren Arbeitsablauf integrieren, was es einfacher macht, einen klaren und aktuellen Überblick über ihre virtuelle Infrastruktur zu behalten. Durch die Automatisierung von Routineaufgaben können sich IT-Experten auf strategischere Tätigkeiten konzentrieren und so die Gesamtproduktivität und Systemzuverlässigkeit verbessern.

Nächste Schritte

Der Aufbau eines effizienten und effektiven IT-Teams erfordert eine zentralisierte Lösung, die als einheitliches Tool zur Bereitstellung von IT-Dienstleistungen fungiert. NinjaOne ermöglicht es IT-Teams, alle Geräte zu überwachen, zu verwalten, zu sichern und zu unterstützen, unabhängig vom Standort, ohne dass eine komplexe Infrastruktur vor Ort erforderlich ist.

Erfahren Sie mehr über NinjaOne Remote Script Deployment, sehen Sie sich eine Live-Tour an oder starten Sie Ihre kostenlose Testversion unserer NinjaOne Plattform.

Kategorien:

Das könnte Sie auch interessieren

×

Sehen Sie NinjaOne in Aktion!

Mit dem Absenden dieses Formulars akzeptiere ich die Datenschutzerklärung von NinjaOne.

NinjaOne Allgemeine Geschäftsbedingungen für Skripte

Indem Sie unten auf die Schaltfläche “Ich akzeptiere” klicken, erklären Sie Ihr Einverständnis mit den folgenden rechtlichen Bedingungen sowie mit unseren Nutzungsbedingungen:

  • Eigentumsrechte: NinjaOne besitzt und wird weiterhin alle Rechte, Titel und Interessen an dem Skript (einschließlich des Urheberrechts) behalten. NinjaOne gewährt Ihnen eine eingeschränkte Lizenz zur Nutzung des Skripts in Übereinstimmung mit diesen rechtlichen Bedingungen.
  • Einschränkung der Nutzung: Sie dürfen das Skript nur für Ihre legitimen persönlichen oder internen Geschäftszwecke verwenden und es nicht an Dritte weitergeben.
  • Verbot der Wiederveröffentlichung: Sie sind unter keinen Umständen berechtigt, das Skript in einer Skriptbibliothek, die einem anderen Softwareanbieter gehört oder von diesem kontrolliert wird, erneut zu veröffentlichen.
  • Gewährleistungsausschluss: Das Skript wird “wie gesehen” und “wie verfügbar” bereitgestellt, ohne jegliche Garantie. NinjaOne gibt keine Versprechen oder Garantien, dass das Skript frei von Fehlern ist oder dass es Ihre speziellen Bedürfnisse oder Erwartungen erfüllt.
  • Risikoübernahme: Die Verwendung des Skripts erfolgt auf eigene Gefahr. Sie erkennen an, dass die Nutzung des Skripts mit bestimmten Risiken verbunden ist, und Sie verstehen und übernehmen jedes dieser Risiken.
  • Verzicht und Freigabe: Sie machen NinjaOne nicht für nachteilige oder unbeabsichtigte Folgen verantwortlich, die sich aus Ihrer Nutzung des Skripts ergeben, und Sie verzichten auf alle gesetzlichen oder billigkeitsrechtlichen Rechte oder Rechtsmittel, die Sie gegen NinjaOne im Zusammenhang mit Ihrer Nutzung des Skripts haben könnten.
  • EULA: Wenn Sie ein NinjaOne-Kunde sind, unterliegt Ihre Nutzung des Skripts dem für Sie geltenden Endbenutzer-Lizenzvertrag (EULA).