#!/usr/bin/env bash # Quick Proxmox inventory script - queries all hosts and lists VMIDs with details set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true PROXMOX_HOST_ML110="${PROXMOX_HOST_ML110:-192.168.11.10}" PROXMOX_HOST_R630_01="${PROXMOX_HOST_R630_01:-192.168.11.11}" PROXMOX_HOST_R630_02="${PROXMOX_HOST_R630_02:-192.168.11.12}" SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=5" echo "================================================================================" echo "COMPREHENSIVE PROXMOX INVENTORY" echo "================================================================================" echo "" # Function to get container info get_container_info() { local host=$1 local vmid=$2 ssh $SSH_OPTS root@"$host" " name=\$(pct config $vmid 2>/dev/null | grep '^name:' | cut -d: -f2 | tr -d ' ' || echo 'unnamed') hostname=\$(pct config $vmid 2>/dev/null | grep '^hostname:' | cut -d: -f2 | tr -d ' ' || echo 'N/A') status=\$(pct status $vmid 2>/dev/null | awk '/status:/ {print \$2}' || echo 'unknown') ip=\$(pct config $vmid 2>/dev/null | grep -oP 'ip=\K[^/]+' | head -1 || echo 'N/A') if [ \"\$ip\" = 'dhcp' ] || [ \"\$ip\" = 'auto' ] || [ -z \"\$ip\" ]; then if [ \"\$status\" = 'running' ]; then ip=\$(pct exec $vmid -- hostname -I 2>/dev/null | awk '{print \$1}' || echo 'N/A') fi fi echo \"\$vmid|\$name|\$hostname|\$status|\$ip\" " 2>/dev/null || echo "$vmid|N/A|N/A|unknown|N/A" } # Function to get VM info get_vm_info() { local host=$1 local vmid=$2 ssh $SSH_OPTS root@"$host" " name=\$(qm config $vmid 2>/dev/null | grep '^name:' | cut -d: -f2 | tr -d ' ' || echo 'unnamed') hostname=\$(qm config $vmid 2>/dev/null | grep '^hostname:' | cut -d: -f2 | tr -d ' ' || echo 'N/A') status=\$(qm status $vmid 2>/dev/null | awk '/status:/ {print \$2}' || echo 'unknown') # Try to get IP via agent ip=\$(pvesh get /nodes/\$(hostname)/qemu/$vmid/agent/network-get-interfaces --output-format json 2>/dev/null | \ python3 -c \" import sys, json try: data = json.load(sys.stdin) if 'result' in data: for iface in data['result']: if 'ip-addresses' in iface: for ip_info in iface['ip-addresses']: if ip_info.get('ip-address-type') == 'ipv4' and not ip_info.get('ip-address', '').startswith('127.'): print(ip_info['ip-address']) sys.exit(0) except: pass \" 2>/dev/null | head -1 || echo 'N/A') echo \"\$vmid|\$name|\$hostname|\$status|\$ip\" " 2>/dev/null || echo "$vmid|N/A|N/A|unknown|N/A" } # Process each host for host_info in "ml110:$PROXMOX_HOST_ML110" "r630-01:$PROXMOX_HOST_R630_01" "r630-02:$PROXMOX_HOST_R630_02"; do IFS=: read -r hostname host_ip <<< "$host_info" echo "📡 Querying $hostname ($host_ip)..." # Get all containers containers=$(ssh $SSH_OPTS root@"$host_ip" "pct list 2>/dev/null | tail -n +2 | awk '{print \$1}'" 2>/dev/null || true) # Get all VMs vms=$(ssh $SSH_OPTS root@"$host_ip" "qm list 2>/dev/null | tail -n +2 | awk '{print \$1}'" 2>/dev/null || true) echo " Found $(echo "$containers" | grep -c . || echo 0) containers and $(echo "$vms" | grep -c . || echo 0) VMs" # Process containers while IFS= read -r vmid; do [ -z "$vmid" ] && continue info=$(get_container_info "$host_ip" "$vmid") IFS='|' read -r vmid name hostname_vm status ip <<< "$info" printf " %-8s %-6s %-30s %-12s %-18s %-30s %-10s\n" \ "$vmid" "LXC" "${name:0:28}" "$hostname" "${ip:0:16}" "${hostname_vm:0:28}" "$status" done <<< "$containers" # Process VMs while IFS= read -r vmid; do [ -z "$vmid" ] && continue info=$(get_vm_info "$host_ip" "$vmid") IFS='|' read -r vmid name hostname_vm status ip <<< "$info" printf " %-8s %-6s %-30s %-12s %-18s %-30s %-10s\n" \ "$vmid" "QEMU" "${name:0:28}" "$hostname" "${ip:0:16}" "${hostname_vm:0:28}" "$status" done <<< "$vms" echo "" done echo "================================================================================" echo "NPMPLUS INSTANCES" echo "================================================================================" echo "" # Find NPMplus instances npmplus_found=false for host_info in "ml110:$PROXMOX_HOST_ML110" "r630-01:$PROXMOX_HOST_R630_01" "r630-02:$PROXMOX_HOST_R630_02"; do IFS=: read -r hostname host_ip <<< "$host_info" containers=$(ssh $SSH_OPTS root@"$host_ip" "pct list 2>/dev/null | tail -n +2 | awk '{print \$1}'" 2>/dev/null || true) while IFS= read -r vmid; do [ -z "$vmid" ] && continue name=$(ssh $SSH_OPTS root@"$host_ip" "pct config $vmid 2>/dev/null | grep '^name:' | cut -d: -f2 | tr -d ' '" 2>/dev/null || echo "") if echo "$name" | grep -qi "npmplus"; then npmplus_found=true info=$(get_container_info "$host_ip" "$vmid") IFS='|' read -r vmid name hostname_vm status ip <<< "$info" echo "VMID: $vmid" echo " Name: $name" echo " Host: $hostname ($host_ip)" echo " IP: $ip" echo " FQDN: $hostname_vm" echo " Status: $status" echo "" fi done <<< "$containers" done if [ "$npmplus_found" = false ]; then echo "No NPMplus instances found" echo "" fi echo "================================================================================" echo "NPMPLUS CONFIGURATION" echo "================================================================================" echo "" # Try to get NPMplus config using Python script if available if [ -f "$SCRIPT_DIR/get-npmplus-mappings.py" ]; then python3 "$SCRIPT_DIR/get-npmplus-mappings.py" 2>/dev/null || echo "Could not retrieve NPMplus configuration" else echo "NPMplus configuration script not found" fi echo ""