Cómo encontrar una VM o contenedor por dirección IP en Proxmox VE

Este artículo explica cómo localizar una máquina virtual o contenedor en un cluster de Proxmox VE utilizando su dirección IP.

Requisitos previos

  • Acceso SSH al nodo de Proxmox con privilegios de root
  • QEMU Guest Agent instalado y ejecutándose en las VMs (para máquinas virtuales QEMU)
  • La utilidad jq disponible en el sistema

Script

#!/bin/bash
TARGET_IP="192.0.2.100"

pvesh get /cluster/resources --type vm --output-format json | \
  jq -r '.[] | select(.status=="running") | "\(.type) \(.node) \(.vmid) \(.name)"' | \
  xargs -P 10 -L 1 bash -c '
    type=$1; node=$2; vmid=$3; name=$4
    if [ "$type" = "qemu" ]; then
      result=$(timeout 3 pvesh get /nodes/$node/qemu/$vmid/agent/network-get-interfaces --output-format json 2>/dev/null)
      if echo "$result" | jq -e ".result[].\"ip-addresses\"[]? | select(.\"ip-address\" == \"'"$TARGET_IP"'\")" > /dev/null 2>&1; then
        echo "Found: VMID $vmid ($name) on node $node [QEMU]"
      fi
    elif [ "$type" = "lxc" ]; then
      result=$(timeout 3 pvesh get /nodes/$node/lxc/$vmid/interfaces --output-format json 2>/dev/null)
      if echo "$result" | jq -e ".[] | select(.inet == \"'"$TARGET_IP"'\" or (.inet | startswith(\"'"$TARGET_IP"'/\")))" > /dev/null 2>&1; then
        echo "Found: VMID $vmid ($name) on node $node [LXC]"
      fi
    fi
  ' _

Reemplaza 192.0.2.100 con la dirección IP que deseas buscar.

Cómo funciona

  1. Obtiene la lista de recursos: Consulta la API de Proxmox para obtener todos los recursos de tipo VM en el cluster.
  2. Filtra por tipo: Separa las máquinas virtuales QEMU de los contenedores LXC.
  3. Consulta en paralelo: Ejecuta hasta 10 consultas simultáneas para acelerar la búsqueda.
  4. Consulta las interfaces:
    • Para QEMU: Usa el endpoint del Guest Agent (/agent/network-get-interfaces).
    • Para LXC: Usa el endpoint de interfaces (/interfaces).
  5. Muestra el resultado: Si encuentra la IP, muestra el VMID, nombre, nodo y tipo (QEMU o LXC).

Ejemplo de salida

Found: VMID 105 (web-server) on node pve1 [QEMU]
Found: VMID 200 (dns-server) on node pve2 [LXC]

Notas

  • Para VMs QEMU, el script requiere que el QEMU Guest Agent esté instalado y en ejecución.
  • Para contenedores LXC, no se requiere ningún agente adicional.
  • El timeout de 3 segundos evita que VMs sin Guest Agent o con problemas de comunicación bloqueen la búsqueda.