2026-03-02 11:37:34 -08:00
|
|
|
#!/usr/bin/env bash
|
2026-02-12 15:46:57 -08:00
|
|
|
# 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 ""
|