Cómo monitorizar el estado del nodo Proxmox con un script Bash automatizado

La gestión eficiente de la infraestructura informática es crucial para mantener la estabilidad y el rendimiento del entorno digital de una organización. Una de las tareas esenciales para los profesionales de TI y los proveedores de servicios gestionados (MSP) es monitorizar el estado del nodo Proxmox Virtual Environment (PVE). El script proporcionado ofrece una solución sólida para automatizar este proceso, garantizando que la información sobre el estado de los nodos esté disponible y actualizada.

Background

Proxmox VE es un entorno de virtualización de servidores de código abierto utilizado por muchos profesionales de TI para gestionar máquinas virtuales, contenedores y almacenamiento. La supervisión del estado de los nodos dentro de un clúster Proxmox es fundamental para el mantenimiento proactivo y la solución de problemas.

Este script para monitorizar el estado del nodo Proxmox simplifica el proceso recuperando información sobre el estado de los nodos y guardándola en campos personalizados para facilitar el acceso y el análisis. Esta automatización es especialmente valiosa para los MSP que gestionan entornos de múltiples clientes, ya que reduce el esfuerzo manual y minimiza el riesgo de supervisión.

El script para monitorizar el estado del nodo Proxmox

#!/usr/bin/env bash

# Description: Get the Proxmox Node Status 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 custom fields are set to null
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 custom fields 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 custom fields are not 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

# Get the version of proxmox-ve
_version=$(pveversion --verbose | grep "proxmox-ve" | awk '{print $2}')

# Check if the version
if [[ "$(echo "${_version}" | awk -F. '{print $1}')" -eq 7 ]]; then
    echo "[Info] Proxmox VE $_version is greater than or equal to 8."
else
    echo "[Warn] Proxmox VE $_version is less than 8. Some data may not be formatted as expected. See: https://pve.proxmox.com/pve-docs/chapter-pve-faq.html#faq-support-table"
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

# Run the pvesh command to get the status information
if ! pvesh_status_output=$(pvesh get /cluster/status --noborder); then
    echo "[Error] Failed to get the Proxmox Node Status."
    echo "$pvesh_status_output"
    exit 1
fi
# Example Output from: pvesh get /cluster/status --noborder
# id        name     type    ip            level local nodeid nodes online quorate version
# cluster   cluster1 cluster                                      4        1       4
# node/pve1 pve1     node    192.168.1.10  c     0          1       1
# node/pve2 pve2     node    192.168.1.20  c     0          2       1
# node/pve3 pve3     node    192.168.1.30  c     0          3       1
# node/pve4 pve4     node    192.168.1.40  c     1          4       1

# Exclude the cluster information then skip the first line
node_status=$(echo "$pvesh_status_output" | grep -v "cluster" | tail -n +2)

# Create a table with the node status information with only the columns named id, name, ip, and online
if [[ "$(echo "${_version}" | awk -F. '{print $1}')" -ge 8 ]]; then
    data_table=$(echo "$node_status" | awk '{print $7, $2, $4, $8}' | column -t)
else
    data_table=$(echo "$node_status" | awk '{print $7, $2, $4, $7}' | column -t)
fi

# Convert the table to an HTML table with headers
result_table=$(echo "$data_table" | awk 'BEGIN {print "<table style=\"white-space:nowrap;\"><tr><th>Node ID</th><th>Node Name</th><th>IP Address</th><th>Online Status</th><th>Votes</th></tr>"} {print "<tr>"; for(i=1;i<=NF;i++) print "<td>" $i "</td>"; print "<td>1</td></tr>"} END {print "</table>"}')

# Save the result to the WYSIWYG custom field
if [[ -n "$wysiwyg_custom_field" ]]; then
    # Check if the NinjaRMM CLI exists and is executable
    if [[ -x "$ninjarmm_cli" ]]; then
        # Save the result to the custom field
        if hideOutput=$("$ninjarmm_cli" set "$wysiwyg_custom_field" "$result_table" 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

# Format the output for the multiline custom field
pvesh_status_output=$(
    # Exclude the cluster information then skip the first line
    echo "$data_table" | awk '{if (NR == 1) print "--------"; print "Node ID: " $1 "\nNode Name: " $2 "\nIP Address: " $3 "\nOnline Status: " $4 "\nVotes: 1\n"; if (NR != NF) print "--------"}'
)

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

exit $_exit_code

 

Análisis detallado

El script está diseñado para monitorizar el estado del nodo Proxmox y guardar la información en un campo personalizado multilínea o en un campo personalizado WYSIWYG. Desglosemos su funcionalidad paso a paso:

1. Argumentos de la línea de comandos

  • El script acepta dos argumentos de línea de comandos: los nombres del campo personalizado multilínea y del campo personalizado WYSIWYG.

2. Validación de campos personalizados

  • Comprueba si los campos personalizados están configurados y se asegura de que no sean nulos o iguales.

3. Comprobación de herramientas y permisos

  • El script para monitorizar el estado del nodo Proxmox verifica la presencia de las herramientas necesarias (pvesh y ninjarmm-cli) y comprueba si se está ejecutando con privilegios de root.

4. Recuperar estado del nodo

  • Ejecuta el comando pvesh get /cluster/status –noborder para recuperar el estado de los nodos del clúster Proxmox.

5. Tratamiento de datos

  • La salida se procesa para extraer información relevante, como el ID del nodo, el nombre, la dirección IP y el estado en línea. Esta información se formatea en una tabla.

6. Guardar en campos personalizados

  • Los datos formateados se guardan en los campos personalizados especificados mediante el comando ninjarmm-cli. Si se especifica el campo WYSIWYG, los datos se convierten en una tabla HTML.

7. Salida

  • Si no se especifica ningún campo personalizado, el script para monitorizar el estado del nodo Proxmox muestra el estado del nodo directamente en la consola.

Posibles casos de uso

Estudio de caso: un profesional de TI gestiona un clúster Proxmox

Imaginemos a un profesional de TI llamado Alex, que gestiona un clúster Proxmox para una empresa mediana. Alex debe supervisar periódicamente el estado de los nodos para asegurarse de que están en línea y funcionan correctamente. Utilizando este script para monitorizar el estado del nodo Proxmox, Alex puede automatizar la recuperación y el registro de los estados de los nodos en campos personalizados dentro de su sistema de monitorización. Esta automatización ahorra a Alex un tiempo considerable y garantiza la rápida detección y resolución de cualquier problema.

Comparaciones

Supervisión manual vs. scripts automatizados

Tradicionalmente, la supervisión del estado de los nodos implica la ejecución manual de comandos y el registro de los resultados, un proceso que requiere mucho tiempo y es propenso a errores. Este script para monitorizar el estado del nodo Proxmox automatiza todo el flujo de trabajo, garantizando una recogida de datos coherente y precisa. En comparación con otros métodos, como el uso de herramientas de monitorización de terceros, este script para monitorizar el estado del nodo Proxmox ofrece una solución ligera y personalizable adaptada a los entornos Proxmox.

FAQ

  1. ¿Qué es Proxmox VE? Proxmox VE es un entorno de virtualización de servidores de código abierto utilizado para gestionar máquinas virtuales, contenedores y almacenamiento.
  2. ¿Por qué tengo que ejecutar el script como root? El script para monitorizar el estado del nodo Proxmox requiere privilegios de root para acceder a la información de estado del nodo Proxmox y realizar las comprobaciones necesarias del sistema.
  3. ¿Qué ocurre si falla el comando pvesh? Si el comando pvesh falla, el script mostrará un mensaje de error y terminará.
  4. ¿Puedo utilizar este script sin la herramienta ninjarmm-cli? No, el script para monitorizar el estado del nodo Proxmox depende de ninjarmm-cli para guardar la información del estado del nodo en campos personalizados.

Implicaciones

El uso de este script para monitorizar el estado del nodo Proxmox garantiza que la información sobre el estado de los nodos se recopile y registre de forma coherente, lo que resulta crucial para mantener el correcto estado de la infraestructura de TI. Al automatizar este proceso, los profesionales de TI pueden centrarse en tareas más estratégicas, mejorando la eficacia general y reduciendo el riesgo de que surjan problemas inadvertidos.

Recomendaciones

  • Ejecuta el script con regularidad: programa la ejecución del script para monitorizar el estado del nodo Proxomox a intervalos regulares para garantizar la actualización de la información sobre el estado de los nodos.
  • Monitoriza las salidas: comprueba regularmente los campos personalizados o los registros de salida para detectar cualquier anomalía.
  • Asegúrate de que las herramientas están instaladas: comprueba que tanto pvesh como ninjarmm-cli están instalados y accesibles en el sistema.

Reflexiones finales

Este script para monitorizar el estado del nodo Proxomox con emejora la eficiencia y fiabilidad de la gestión de clusters Proxmox. Al integrar este script para monitorizar el estado del nodo Proxmox en tu flujo de trabajo, puedes garantizar actualizaciones de estado puntuales y precisas, mejorando en última instancia la estabilidad y el rendimiento de tu entorno de TI.

El conjunto de herramientas de NinjaOne, incluyendo NinjaOne RMM, proporciona capacidades adicionales para la gestión integral de TI, complementando la funcionalidad de este script.

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 vivo o comienza 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).