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 " " qemu_name = qemu_name if qemu_name else " " qemu_mem = qemu_mem if qemu_mem else " " qemu_cpus = qemu_cpus if qemu_cpus else " " qemu_disk = qemu_disk if qemu_disk else " " 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 " " lxc_name = lxc_name if lxc_name else " " lxc_mem = lxc_mem if lxc_mem else " " lxc_cpus = lxc_cpus if lxc_cpus else " " lxc_disk = lxc_disk if lxc_disk else " " 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.
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.