Linux-Skript-Guide: Abruf vom Status des Netzwerk-Knoten-Speichers in Proxmox

Eine effektive Speicherverwaltung ist ein entscheidender Aspekt für die Aufrechterhaltung einer stabilen und effizienten IT-Infrastruktur. Für IT-Experten und Managed Service Provider (MSPs) können Tools, die detaillierte Einblicke in den Speicherstatus bieten, die betriebliche Effizienz erheblich steigern.

Ein solches Tool ist das Bash-Skript zum Abrufen und Anzeigen von Knoten-Speicher-Details in Proxmox. In diesem Blogbeitrag werden die Funktionen des Skripts, seine Bedeutung und seine Anwendung in der Praxis untersucht.

Kontext

In einer virtualisierten Umgebung wie Proxmox ist es für die Leistungsoptimierung, Fehlerbehebung und Kapazitätsplanung unerlässlich, den Status des Netzwerk-Knoten-Speichers abrufen zu können. Proxmox VE (Virtual Environment) ist eine Open-Source-Lösung für die Verwaltung der Servervirtualisierung, die eine leistungsstarke Plattform für das Management von VM, Containern, Speichern und Netzwerken bietet.

Das mitgelieferte Skript nutzt die API von Proxmox und das CLI-Tool von NinjaOne RMM, um detaillierte Speicherinformationen zu sammeln und darzustellen, die dann in benutzerdefinierten Feldern zur weiteren Analyse oder Dokumentation gespeichert werden können. Dieses Skript ist besonders nützlich für MSPs, die mehrere Client-Umgebungen überwachen und optimale Leistung und Verfügbarkeit sicherstellen müssen.

Das Skript:

#!/usr/bin/env bash

# Description: Get the details of a Proxmox Node Storage 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

# Check if the multilineCustomField and wysiwygCustomField are set
if [[ -n "${multilineCustomField}" && "${multilineCustomField}" != "null" ]]; then
    multiline_custom_field=$multilineCustomField
fi
if [[ -n "${wysiwygCustomField}" && "${wysiwygCustomField}" != "null" ]]; then
    wysiwyg_custom_field=$wysiwygCustomField
fi

# Check if the multiline_custom_field and wysiwyg_custom_field are the same
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

# Check if the multiline_custom_field and wysiwyg_custom_field are set
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 pvesh &>/dev/null; then
    echo "[Error] The Proxmox VE API tool 'pvesh' 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

function GetThisNodeName() {
    # Get the node name
    if ! node_name=$(pvesh get /cluster/status --noborder | awk '$6 == 1 {print $2}'); then
        echo "[Error] Failed to get the node name."
        echo "$node_name"
        exit 1
    fi
    echo "$node_name"
}

# Run the pvesh command to get the status information
if ! storages=$(pvesh get /storage --noborder | tail +2); then
    echo "[Error] Failed to get the list of storages."
    echo "$storages"
    exit 1
fi
# Example Output:
# local
# local-zfs
# storage-nas

function formatStorage() {
    echo ""
    echo "Storage Status:"
    # Loop though the storages and get the status of each
    for storage in $storages; do
        # Get the status of the storage
        if ! storage_status=$(pvesh get /storage/"$storage" --noborder); then
            echo "[Error] Failed to get the Storage Status of $storage."
            echo "$storage_status"
            exit 1
        fi
        storage_node=$(GetThisNodeName)
        # Get the storage name
        storage_name=$(echo "$storage_status" | grep -P 'storage\s+' | awk '{print $2}')
        # Get the free space
        # "$storage_name " is used to avoid matching "local-zfs" when searching for "local"
        storage_free_space=$(pvesh get "/nodes/$storage_node/storage" --noborder | grep -P "$storage_name " | awk '{print $5" "$6}')
        # Get the total space
        storage_total_space=$(pvesh get "/nodes/$storage_node/storage" --noborder | grep -P "$storage_name " | awk '{print $9" "$10}')
        echo -n
        echo ""
        echo "$storage"
        echo "-------------"
        # Take the output of $storage_status, skip the first line, then use a colon as a separator between the key and value
        echo "$storage_status" | tail +2 | awk '{print $1 ": " $2}'
        echo "Free: $storage_free_space"
        echo "Total: $storage_total_space"
    done
}
multiline_output=$(formatStorage)

# Create Storage Status label
storage_table="<h2>Storage Status</h2>"
# Create the Storage Status table
storage_table+="<table style='white-space:nowrap;'><tr><th>Storage Name</th><th>Type</th><th>Path/File System</th><th>Free Space</th><th>Total Space</th><th>Content</th></tr>"

# Loop though the storages and get the status of each
for storage in $storages; do
    if ! storage_status=$(pvesh get /storage/"$storage" --noborder); then
        echo "[Error] Failed to get the Storage Status of $storage."
        echo "$storage_status"
        exit 1
    fi
    # Example Output:
    # key     value
    # content images,rootdir
    # digest  c14cb4c9bbcf9a062fa8a82b10afe01cb1ed5b8d
    # pool    rpool/data
    # sparse  1
    # storage local-zfs
    # type    zfspool
    storage_node=$(GetThisNodeName)
    # Get the storage name
    storage_name=$(echo "$storage_status" | grep -P 'storage\s+' | awk '{print $2}')
    # Get the storage type
    storage_type=$(echo "$storage_status" | grep -P 'type\s+' | awk '{print $2}')
    # Get the storage pool/path
    storage_pool=$(echo "$storage_status" | grep -P 'pool\s+' | awk '{print $2}')
    if [[ -z "${storage_pool}" ]]; then
        storage_pool=$(echo "$storage_status" | grep -P 'path\s+' | awk '{print $2}')
    fi
    # Get the storage content
    storage_content=$(echo "$storage_status" | grep -P 'content\s+' | awk '{print $2}')
    # Get the free space
    # "$storage_name " is used to avoid matching "local-zfs" when searching for "local"
    storage_free_space=$(pvesh get "/nodes/$storage_node/storage" --noborder | grep -P "$storage_name " | awk '{print $5" "$6}')
    # Get the total space
    storage_total_space=$(pvesh get "/nodes/$storage_node/storage" --noborder | grep -P "$storage_name " | awk '{print $9" "$10}')

    # Add to the Storage Status table
    storage_table+="<tr><td>$storage_name</td><td>$storage_type</td><td>$storage_pool</td><td>$storage_free_space</td><td>$storage_total_space</td><td>$storage_content</td></tr>"
done

# Close the Storage Status table
storage_table+="</table>"

# Save the results
result_table="$storage_table"

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

if [[ -n "$multiline_custom_field" ]]; then
    if [[ -x "$ninjarmm_cli" ]]; then
        if hideOutput=$(echo "$multiline_output" | "$ninjarmm_cli" set --stdin "$multiline_custom_field" 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

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

if [[ $_exit_code -eq 1 ]]; then
    exit 1
fi

 

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

Zugang erhalten

Detailansicht

Als Nächstes sehen wir uns das Skript an, um seine Funktionsweise Schritt für Schritt zu verstehen.

  1. Initialisierung und Parsen der Argumente Das Skript beginnt mit der Analyse der Befehlszeilenargumente, um die Namen der benutzerdefinierten Felder zu bestimmen, in denen die Speicherdetails gespeichert werden sollen. Sie akzeptiert zwei Argumente: eines für ein mehrzeiliges benutzerdefiniertes Feld und ein weiteres für ein benutzerdefiniertes WYSIWYG-Feld. In diesen Feldern werden formatierte Speicherinformationen zum leichteren Lesen und zur weiteren Analyse gespeichert.
  2. Überprüfung der benutzerdefinierten Felder Das Skript prüft, ob die benutzerdefinierten Felder durch Umgebungsvariablen oder Befehlszeilenargumente festgelegt sind. Es stellt sicher, dass die beiden Felder nicht gleich sind, um Konflikte zu vermeiden.
  3. Überprüfung der Verfügbarkeit von Tools und der Berechtigungen Das Skript prüft die Verfügbarkeit des pvesh-Befehls, der für die Interaktion mit der Proxmox-API verwendet wird, und gewährleistet, dass er mit Root-Rechten ausgeführt wird.
  4. Validierung von der NinjaOne RMM-CLI Das Skript prüft, ob das NinjaOne RMM-CLI-Tool vorhanden ist, das für die Aktualisierung benutzerdefinierter Felder erforderlich ist.
  5. Abruf des Namens vom Netzwerk-Knoten Es definiert eine Funktion zum Abruf des Namens vom Netzwerk-Knoten in Proxmox, der für die Abfrage bestimmter Speicherdetails erforderlich ist.
  6. Abruf und Formatierung von Speicherinformationen Das Skript ruft die Speicherliste ab und iteriert über jedes Speicherelement, um detaillierte Statusinformationen, einschließlich des freien und des gesamten Speicherplatzes, zu erfassen. Diese Informationen werden sowohl für mehrzeilige als auch für benutzerdefinierte WYSIWYG-Felder formatiert.
  7. HTML-Tabellenerstellung Das Bash-Skript erstellt eine HTML-Tabelle für das benutzerdefinierte WYSIWYG-Feld, in der der Speicherstatus in einem Tabellenformat zusammengefasst wird.
  8. Speichern der Ergebnisse Schließlich speichert das Skript die formatierten Speicherinformationen in den angegebenen benutzerdefinierten Feldern mit dem CLI-Tool von NinjaOne RMM.

Potenzielle Anwendungsfälle

Stellen Sie sich vor, ein MSP verwaltet mehrere Client-Umgebungen mit Proxmox. Er muss den Speicherstatus regelmäßig überprüfen, um sicher zu sein, dass genügend freier Speicherplatz für Backups und den VM-Betrieb vorhanden ist. Mit diesem Skript kann der MSP den Abruf von Speicherinformationen automatisieren und sie in benutzerdefinierten Feldern für jeden Client speichern, was einen schnellen Zugriff auf wichtige Daten ohne manuelle Eingriffe ermöglicht. Diese Automatisierung verringert das Risiko menschlichen Versagens und gewährleistet zeitnahe Aktualisierungen des Speicherzustands.

Vergleiche

Dieses Skript bietet eine personalisierte Lösung für Proxmox-Umgebungen, die mit NinjaOne RMM integriert ist. Andere Methoden zum Abrufen von Speicherinformationen sind die Verwendung nativer Proxmox-Tools wie das Webinterface oder benutzerdefinierte Skripte ohne NinjaOne RMM-Integration.

Diesen Methoden fehlen jedoch möglicherweise die Automatisierungs- und zentralen Verwaltungsfunktionen, die durch die Kombination aus diesem Skript und NinjaOne RMM bereitgestellt werden, was sie für MSPs, die mehrere Umgebungen verwalten, weniger effizient macht.

FAQs

Was ist Proxmox VE?

Proxmox VE ist eine Open-Source-Plattform für die Verwaltung von Servervirtualisierung, die die Verwaltung von VM, Containern, Speichern und Netzwerken ermöglicht.

Was ist NinjaOne RMM?

NinjaOne RMM ist ein Tool zum Remote Monitoring und Management (RMM), das MSPs und IT-Experten bei der Verwaltung von Kundenumgebungen über eine zentrale Plattform unterstützt.

Benötige ich Root-Zugriff, um dieses Skript auszuführen?

Ja, Root-Zugriff ist erforderlich, um Speicherinformationen von Netzwerk-Knoten in Proxmox abzurufen.

Kann dieses Skript auch ohne NinjaOne RMM verwendet werden?

Das Skript ist für die Integration mit NinjaOne RMM zur Speicherung benutzerdefinierter Felddaten konzipiert. Ohne NinjaOne RMM kann es zwar Speicherinformationen abrufen und anzeigen, aber nicht in benutzerdefinierten Feldern speichern.

Folgen

Die Automatisierung des Abrufs und der Dokumentation des Speicherstatus erhöht die betriebliche Effizienz und verringert das Risiko, dass speicherbezogene Probleme unbemerkt bleiben. Dieser proaktive Ansatz für die Speicherverwaltung kann Ausfallzeiten verhindern und garantieren, dass die IT-Infrastruktur gesund und leistungsfähig bleibt.

Empfehlungen

  • Stellen Sie sicher, dass das Proxmox API-Tool (pvesh) und das CLI-Tool von NinjaOne RMM korrekt installiert und konfiguriert sind, bevor Sie das Skript ausführen.
  • Überprüfen und aktualisieren Sie regelmäßig die benutzerdefinierten Felder, um die Speicherinformationen aktuell und korrekt zu halten.
  • Testen Sie das Skript nicht in einer Produktionsumgebung, um sicherzugehen, dass es Ihren Anforderungen entspricht und sich nahtlos in Ihre bestehenden Prozesse integriert.

Abschließende Überlegungen

Der Einsatz von Automatisierungsskripten wie diesem kann die Effizienz des IT-Betriebs erheblich steigern, insbesondere für MSPs, die mehrere Client-Umgebungen verwalten. NinjaOne liefert mit seinen leistungsstarken RMM-Funktionen eine hervorragende Plattform für die Integration solcher Skripte und bietet einen zentralisierten und optimierten Ansatz für das IT-Management. Durch die Verwendung dieser Tools können IT-Experten gewährleisten, dass ihre Infrastruktur stets optimal funktioniert, und sind besser darauf vorbereitet, aufkommende speicherbezogene Herausforderungen zu bewältigen.

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).