Guía de scripts de Linux: cómo automatizar la recopilación de información de Proxmox VM

En el panorama informático actual, la gestión y supervisión eficaces de los entornos virtuales son cruciales para los administradores de sistemas y los proveedores de servicios gestionados (MSP). Los entornos virtuales, como los gestionados por Proxmox VM, requieren una supervisión periódica para garantizar un funcionamiento sin problemas y un rendimiento óptimo.

La automatización de la recopilación del estado de las máquinas virtuales (VM) y la información básica no sólo ahorra tiempo, sino que también reduce el riesgo de error humano. Este post explora un script bash diseñado para obtener y mostrar el estado y los detalles de los invitados de Proxmox VM, demostrando su utilidad y cómo puede agilizar las operaciones de TI.

Contexto

Proxmox VM es una popular solución de gestión de virtualización de código abierto que combina KVM y la virtualización basada en contenedores en una única plataforma. Para los profesionales de TI y los MSP, supervisar el estado de las máquinas virtuales y los contenedores es una tarea rutinaria pero vital. Este script responde a la necesidad de disponer de un método automatizado y coherente para recopilar y mostrar información sobre la MV, presentándola en un formato de fácil manejo, acceso e interpretación.

El script para visualizar la información de Proxmox VM

#!/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 "&nbsp;"
    qemu_name = qemu_name if qemu_name else "&nbsp;"
    qemu_mem = qemu_mem if qemu_mem else "&nbsp;"
    qemu_cpus = qemu_cpus if qemu_cpus else "&nbsp;"
    qemu_disk = qemu_disk if qemu_disk else "&nbsp;"

    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 "&nbsp;"
    lxc_name = lxc_name if lxc_name else "&nbsp;"
    lxc_mem = lxc_mem if lxc_mem else "&nbsp;"
    lxc_cpus = lxc_cpus if lxc_cpus else "&nbsp;"
    lxc_disk = lxc_disk if lxc_disk else "&nbsp;"

    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"

 

Análisis detallado

El script bash proporcionado recupera el estado y la información esencial de todos los invitados Proxmox VM en un host y guarda estos datos en un campo personalizado. Esto resulta especialmente útil en entornos con numerosas máquinas virtuales, en los que las comprobaciones manuales pueden llevar mucho tiempo y dar lugar a errores.

Explicación paso a paso

1. Inicializar scripts y gestionar parámetros:

  • El script para visualizar la información de Proxmox VM comienza definiendo el nombre del campo personalizado, que es un parámetro obligatorio. Este nombre de campo almacenará la información de la máquina virtual.
  • Si el nombre del campo personalizado no se proporciona o no es válido, el script para visualizar la información de Proxmox VM se cierra con un mensaje de error.

2. Comprobar disponibilidad de herramientas:

  • El script para visualizar la información de Proxmox VM verifica la disponibilidad de las herramientas necesarias: pvesh (Proxmox VE API tool) y python3. Si no se encuentran estas herramientas, el script sale con un mensaje de error apropiado.

3. Verificar privilegios de root:

  • El script para visualizar la información de Proxmox VM comprueba si se está ejecutando con privilegios de root. Si no, sale con un mensaje de error.

4. Obtener información de máquinas virtuales:

  • Usando pvesh, el script recupera información sobre las máquinas virtuales QEMU y los contenedores LXC del host Proxmox.
  • Esta información se procesa utilizando Python para generar una tabla HTML con detalles como el estado, ID, nombre, memoria, CPUs y tamaños de disco combinados.

5. Generar una tabla HTML:

  • El script Python incrustado dentro del script bash formatea los datos JSON recuperados en una tabla HTML. Esta tabla tiene un estilo diferente para resaltar las máquinas virtuales en ejecución y detenidas.

6. Guardar la tabla en un campo personalizado:

  • La tabla HTML generada se guarda en el campo personalizado especificado utilizando la herramienta CLI de NinjaOne RMM.

Posibles casos de uso

Imagina un MSP que gestiona múltiples entornos Proxmox para varios clientes. Comprobar manualmente el estado y la asignación de recursos de cada máquina virtual en distintos hosts puede resultar engorroso. Al desplegar este script para visualizar la información de Proxmox VM, el MSP puede automatizar la recopilación de estos datos y tenerlos disponibles en un campo personalizado, accesible a través de su interfaz de gestión. Esto no sólo aumenta la eficacia, sino que también garantiza que puedan responder rápidamente a cualquier problema que surja.

Comparaciones

Otros métodos para recopilar información sobre máquinas virtuales pueden implicar la ejecución manual de scripts y la compilación de resultados, lo que lleva mucho tiempo y es propenso a errores. Herramientas como la interfaz web de Proxmox proporcionan la información necesaria, pero requieren una navegación y comprobación manuales. En cambio, este script para visualizar la información de Proxmox VM automatiza todo el proceso, garantizando la coherencia y ahorrando un tiempo valioso.

FAQ

P: ¿Qué pasa si el script para visualizar la información de Proxmox VM no encuentra pvesh o python3?
R: El script comprueba estas dependencias al inicio y sale con un mensaje de error claro si no se encuentran, guiando al usuario para que instale las herramientas que faltan.

P: ¿Se puede ejecutar el script sin privilegios de root?
R: No, el script para visualizar la información de Proxmox VM debe ejecutarse como root para acceder a la información necesaria del sistema.

P: ¿Qué ocurre si no se indica el nombre del campo personalizado?
R: El script para visualizar la información de Proxmox VM requiere el nombre del campo personalizado como parámetro. Si no se proporciona, el script saldrá con un mensaje de error.

Implicaciones

La automatización de la recopilación de información sobre máquinas virtuales no sólo mejora la eficacia operativa, sino que también refuerza la seguridad informática. Las comprobaciones periódicas y automatizadas garantizan que todas las máquinas virtuales se contabilizan y funcionan según lo previsto, lo que reduce el riesgo de paradas inadvertidas o asignaciones erróneas de recursos.

Recomendaciones

Cuando utilices este script, asegúrate de que:

  • El script se ejecuta periódicamente para mantener actualizada la información de la máquina virtual.
  • Se han establecido los permisos adecuados para que el script se ejecute como root.
  • Las dependencias (pvesh, python3, NinjaOne CLI) están instaladas y configuradas correctamente.

Reflexiones finales

Este script es una herramienta valiosa para los profesionales de TI que gestionan entornos Proxmox, ya que agiliza el proceso de recopilación y visualización de información de máquinas virtuales. Para aquellos que utilizan NinjaOne, este script se integra aún más en su flujo de trabajo, facilitando el mantenimiento de una visión clara y actualizada de su infraestructura virtual. Al automatizar las tareas rutinarias, los profesionales de TI pueden centrarse en actividades más estratégicas, mejorando la productividad general y la fiabilidad del sistema.

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