Files
proxmox/scripts/quick-proxmox-inventory.sh
defiQUG b3a8fe4496
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
chore: sync all changes to Gitea
- Config, docs, scripts, and backup manifests
- Submodule refs unchanged (m = modified content in submodules)

Made-with: Cursor
2026-03-02 11:37:34 -08:00

150 lines
6.0 KiB
Bash
Executable File

#!/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 ""