Guía de scripts de Linux: cómo recuperar el estado de almacenamiento de los nodos Proxmox

La gestión eficaz del almacenamiento es un aspecto crucial para mantener una infraestructura informática sólida y eficiente. Para los profesionales de TI y los proveedores de servicios gestionados (MSP), disponer de herramientas que ofrezcan información detallada sobre el estado del almacenamiento puede mejorar enormemente su eficiencia operativa.

Una de estas herramientas es el script bash diseñado para recuperar el estado de almacenamiento de los nodos Proxmox y mostrar los detalles. Este post explorará la funcionalidad del script, su importancia y su aplicación en situaciones reales.

Contexto

En un entorno virtualizado como Proxmox, comprender el estado del almacenamiento en los nodos es vital para la optimización del rendimiento, la resolución de problemas y la planificación de la capacidad. Proxmox VE (Virtual Environment) es una solución de gestión de virtualización de servidores de código abierto que proporciona una potente plataforma para gestionar máquinas virtuales, contenedores, almacenamiento y redes.

El script proporcionado aprovecha la API de Proxmox y la herramienta CLI de NinjaOne RMM para recopilar y presentar información detallada de almacenamiento, que luego se puede guardar en campos personalizados para su posterior análisis o documentación. Este script es especialmente útil para los MSP que necesitan supervisar varios entornos de clientes y garantizar un rendimiento y una disponibilidad óptimos.

El script para recuperar el estado de almacenamiento de los nodos Proxmox

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

 

Análisis detallado

Profundicemos en el script para recuperar el estado de almacenamiento de los nodos Proxmox para entender su funcionamiento paso a paso.

  1. Inicialización y análisis de argumentos. El script para recuperar el estado de almacenamiento de los nodos Proxmox comienza analizando los argumentos de la línea de comandos para determinar los nombres de los campos personalizados en los que se almacenarán los detalles de almacenamiento. Acepta dos argumentos: uno para un campo personalizado multilínea y otro para un campo personalizado WYSIWYG. Estos campos se utilizan para almacenar información de almacenamiento formateada para facilitar la lectura y el análisis posterior.
  2. Validación de campos personalizados. El script para recuperar el estado de almacenamiento de los nodos Proxmox comprueba si los campos personalizados se establecen a través de variables de entorno o argumentos de línea de comandos. Asegura que ambos campos no sean iguales para evitar conflictos.
  3. Comprobación de disponibilidad y permisos de la herramienta. El script para recuperar el estado de almacenamiento de los nodos Proxmox comprueba la disponibilidad del comando pvesh, que se utiliza para interactuar con la API de Proxmox, y se asegura de que se ejecuta con privilegios de root.
  4. Validación del CLI de NinjaOne RMM. El script comprueba la existencia de la herramienta CLI de NinjaOne RMM, que es necesaria para actualizar los campos personalizados.
  5. Recuperación del nombre del nodo. El script define una función para recuperar el nombre del nodo Proxmox, necesario para consultar detalles específicos del almacenamiento.
  6. Recuperación y formateo de la información de almacenamiento. El script para recuperar el estado de almacenamiento de los nodos Proxmox recupera la lista de almacenamiento e itera sobre cada elemento de almacenamiento para recopilar información de estado detallada, incluido el espacio libre y total. Esta información se formatea tanto para los campos personalizados multilínea como para los WYSIWYG.
  7. Creación de tabla HTML. El script construye una tabla HTML para el campo personalizado WYSIWYG, resumiendo el estado de almacenamiento en un formato tabular.
  8. Guardado de resultados. Finalmente, el script para recuperar el estado de almacenamiento de los nodos Proxmox guarda la información de almacenamiento formateada en los campos personalizados especificados utilizando la herramienta CLI de NinjaOne RMM.

Posibles casos de uso

Imagina a un MSP que gestiona entornos de múltiples clientes con Proxmox. Debe comprobar periódicamente el estado del almacenamiento de los nodos Porxmox para asegurarse de que hay suficiente espacio libre para las copias de seguridad y las operaciones de las máquinas virtuales. Con este script, el MSP puede automatizar la recuperación de la información de almacenamiento y guardarla en campos personalizados para cada cliente, lo que permite un acceso rápido a los datos críticos sin intervención manual. Esta automatización reduce el riesgo de error humano y garantiza actualizaciones puntuales sobre el estado del almacenamiento.

Comparaciones

Mientras que este script ofrece una solución a medida para entornos Proxmox integrados con NinjaOne RMM, otros métodos para recuperar información de almacenamiento incluyen el uso de herramientas nativas Proxmox como la interfaz web o scripts personalizados sin integración NinjaOne RMM.

Sin embargo, estos métodos pueden carecer de las funciones de automatización y gestión centralizada que ofrece la combinación de este script y NinjaOne RMM, lo que los hace menos eficientes para los MSP que gestionan múltiples entornos.

FAQ

¿Qué es Proxmox VE?

Proxmox VE es una plataforma de gestión de virtualización de servidores de código abierto que permite gestionar máquinas virtuales, contenedores, almacenamiento y redes.

¿Qué es NinjaOne RMM?

NinjaOne RMM es una herramienta de supervisión y gestión remota (RMM) que ayuda a los MSP y a los profesionales de TI a gestionar los entornos de los clientes desde una plataforma centralizada.

¿Necesito acceso root para ejecutar este script para recuperar el estado de almacenamiento de los nodos Proxmox?

Sí, se requiere acceso root para recuperar información de almacenamiento de los nodos Proxmox.

¿Se puede utilizar este script sin NinjaOne RMM?

El script para recuperar el estado de almacenamiento de los nodos Proxmox está diseñado para integrarse con NinjaOne RMM para almacenar datos de campos personalizados. Sin NinjaOne RMM, todavía puede recuperar y mostrar la información de almacenamiento, pero no la guardará en campos personalizados.

Implicaciones

La automatización de la recuperación y documentación del estado del almacenamiento mejora la eficacia operativa y reduce el riesgo de que los problemas relacionados con el almacenamiento pasen desapercibidos. Este enfoque proactivo de la gestión del almacenamiento puede evitar tiempos de inactividad y garantizar que la infraestructura de TI se mantenga en buen estado y rinda al máximo.

Recomendaciones

  • Asegúrate de que la herramienta API de Proxmox (pvesh) y la herramienta CLI de NinjaOne RMM están correctamente instaladas y configuradas antes de ejecutar el script.
  • Revisa y actualiza periódicamente los campos personalizados para mantener la información de almacenamiento actualizada y precisa.
  • Prueba el script para recuperar el estado de almacenamiento de los nodos Proxmox en un entorno que no sea de producción para asegurarte de que satisface tus necesidades y se integra perfectamente en los procesos actuales.

Reflexiones finales

El uso de scripts de automatización como éste para recuperar el estado de almacenamiento de los nodos Proxmox puede mejorar significativamente la eficacia de las operaciones de TI, en particular para los MSP que gestionan entornos de varios clientes. NinjaOne, con sus potentes capacidades RMM, proporciona una excelente plataforma para integrar dichos scripts, ofreciendo un enfoque centralizado y racionalizado de la gestión de TI. Al utilizar estas herramientas, los profesionales de TI pueden garantizar que su infraestructura funcione siempre de forma óptima y estar mejor preparados para afrontar cualquier reto que pueda surgir relacionado con el almacenamiento.

Próximos pasos

La creación de un equipo de TI próspero y eficaz requiere contar con una solución centralizada que se convierta en tu principal herramienta de prestación de servicios. NinjaOne permite a los equipos de TI supervisar, gestionar, proteger y dar soporte a todos sus dispositivos, estén donde estén, sin necesidad de complejas infraestructuras locales.

Obtén más información sobre NinjaOne Endpoint Management, echa un vistazo a un tour en vivoo tu prueba gratuita de la plataforma NinjaOne.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón «Acepto» que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona «tal cual» y «según disponibilidad», sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).