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