177 lines
5.7 KiB
Bash
177 lines
5.7 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
# Check Proxmox resources via SSH
|
|||
|
|
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|||
|
|
|
|||
|
|
# Colors
|
|||
|
|
GREEN='\033[0;32m'
|
|||
|
|
YELLOW='\033[1;33m'
|
|||
|
|
RED='\033[0;31m'
|
|||
|
|
BLUE='\033[0;34m'
|
|||
|
|
CYAN='\033[0;36m'
|
|||
|
|
NC='\033[0m'
|
|||
|
|
|
|||
|
|
# Load environment
|
|||
|
|
load_env() {
|
|||
|
|
if [ -f "${PROJECT_ROOT}/.env" ]; then
|
|||
|
|
source "${PROJECT_ROOT}/.env"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
PROXMOX_1_HOST="${PROXMOX_1_HOST:-192.168.11.10}"
|
|||
|
|
PROXMOX_2_HOST="${PROXMOX_2_HOST:-192.168.11.11}"
|
|||
|
|
PROXMOX_PASS="${PROXMOX_ROOT_PASS:-L@kers2010}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log() {
|
|||
|
|
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log_success() {
|
|||
|
|
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✅${NC} $*"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log_warning() {
|
|||
|
|
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠️${NC} $*"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log_error() {
|
|||
|
|
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ❌${NC} $*"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log_info() {
|
|||
|
|
echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')] ℹ️${NC} $*"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
check_node_via_ssh() {
|
|||
|
|
local host=$1
|
|||
|
|
local node_name=$2
|
|||
|
|
local site_name=$3
|
|||
|
|
local password=$4
|
|||
|
|
|
|||
|
|
log "Checking ${site_name} (${host})..."
|
|||
|
|
|
|||
|
|
if ! command -v sshpass &> /dev/null; then
|
|||
|
|
log_error "sshpass is required. Install with: apt-get install sshpass"
|
|||
|
|
return 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# Get CPU info
|
|||
|
|
local cpu_total cpu_avail
|
|||
|
|
cpu_total=$(sshpass -p "${password}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${host} "nproc" 2>/dev/null || echo "0")
|
|||
|
|
|
|||
|
|
# Get memory info
|
|||
|
|
local mem_total mem_available mem_used
|
|||
|
|
mem_total=$(sshpass -p "${password}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${host} "free -g | awk '/^Mem:/ {print \$2}'" 2>/dev/null || echo "0")
|
|||
|
|
mem_available=$(sshpass -p "${password}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${host} "free -g | awk '/^Mem:/ {print \$7}'" 2>/dev/null || echo "0")
|
|||
|
|
mem_used=$(sshpass -p "${password}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${host} "free -g | awk '/^Mem:/ {print \$3}'" 2>/dev/null || echo "0")
|
|||
|
|
|
|||
|
|
# Get VM resource usage
|
|||
|
|
local vm_cpu_total vm_mem_total
|
|||
|
|
vm_cpu_total=$(sshpass -p "${password}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${host} "qm list 2>/dev/null | tail -n +2 | awk '{sum+=\$3} END {print sum+0}'" 2>/dev/null || echo "0")
|
|||
|
|
vm_mem_total=$(sshpass -p "${password}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${host} "qm list 2>/dev/null | tail -n +2 | awk '{sum+=\$4} END {print sum+0}'" 2>/dev/null || echo "0")
|
|||
|
|
|
|||
|
|
# Calculate available
|
|||
|
|
local cpu_avail mem_avail_gib
|
|||
|
|
cpu_avail=$((cpu_total - vm_cpu_total))
|
|||
|
|
mem_avail_gib=${mem_available}
|
|||
|
|
|
|||
|
|
log_info "=== Node: ${node_name} ==="
|
|||
|
|
echo " CPU: ${cpu_avail} / ${cpu_total} cores available (${vm_cpu_total} used by VMs)"
|
|||
|
|
echo " Memory: ${mem_avail_gib} GiB / ${mem_total} GiB available (${vm_mem_total} GiB used by VMs, ${mem_used} GiB system used)"
|
|||
|
|
|
|||
|
|
# Check storage
|
|||
|
|
log_info "=== Storage Pools ==="
|
|||
|
|
sshpass -p "${password}" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${host} "pvesm status 2>/dev/null" | tail -n +2 | while read -r line; do
|
|||
|
|
if [ -n "$line" ]; then
|
|||
|
|
echo " - $line"
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
echo "${cpu_avail}|${cpu_total}|${mem_avail_gib}|${mem_total}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Required resources
|
|||
|
|
REQUIRED_CPU=72
|
|||
|
|
REQUIRED_RAM=140
|
|||
|
|
REQUIRED_DISK=278
|
|||
|
|
|
|||
|
|
main() {
|
|||
|
|
log "=========================================="
|
|||
|
|
log "Proxmox Resource Quota Check (SSH Method)"
|
|||
|
|
log "=========================================="
|
|||
|
|
log ""
|
|||
|
|
log_info "Required Resources:"
|
|||
|
|
log " CPU: ${REQUIRED_CPU} cores"
|
|||
|
|
log " RAM: ${REQUIRED_RAM} GiB"
|
|||
|
|
log " Disk: ${REQUIRED_DISK} GiB"
|
|||
|
|
log ""
|
|||
|
|
|
|||
|
|
load_env
|
|||
|
|
|
|||
|
|
# Check Site 1
|
|||
|
|
site1_result=$(check_node_via_ssh "${PROXMOX_1_HOST}" "ml110-01" "Site 1" "${PROXMOX_PASS}" 2>&1)
|
|||
|
|
site1_status=$?
|
|||
|
|
|
|||
|
|
if [ $site1_status -eq 0 ]; then
|
|||
|
|
IFS='|' read -r cpu1_avail cpu1_total mem1_avail mem1_total <<< "$(echo "$site1_result" | tail -1)"
|
|||
|
|
else
|
|||
|
|
log_warning "Could not check Site 1"
|
|||
|
|
cpu1_avail=0
|
|||
|
|
cpu1_total=0
|
|||
|
|
mem1_avail=0
|
|||
|
|
mem1_total=0
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Check Site 2
|
|||
|
|
site2_result=$(check_node_via_ssh "${PROXMOX_2_HOST}" "r630-01" "Site 2" "${PROXMOX_PASS}" 2>&1)
|
|||
|
|
site2_status=$?
|
|||
|
|
|
|||
|
|
if [ $site2_status -eq 0 ]; then
|
|||
|
|
IFS='|' read -r cpu2_avail cpu2_total mem2_avail mem2_total <<< "$(echo "$site2_result" | tail -1)"
|
|||
|
|
else
|
|||
|
|
log_warning "Could not check Site 2"
|
|||
|
|
cpu2_avail=0
|
|||
|
|
cpu2_total=0
|
|||
|
|
mem2_avail=0
|
|||
|
|
mem2_total=0
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
log "=========================================="
|
|||
|
|
log_info "=== Summary ==="
|
|||
|
|
|
|||
|
|
total_cpu_avail=$((cpu1_avail + cpu2_avail))
|
|||
|
|
total_cpu=$((cpu1_total + cpu2_total))
|
|||
|
|
total_mem_avail=$((mem1_avail + mem2_avail))
|
|||
|
|
total_mem=$((mem1_total + mem2_total))
|
|||
|
|
|
|||
|
|
echo " Total CPU Available: ${total_cpu_avail} / ${total_cpu} cores"
|
|||
|
|
echo " Total Memory Available: ${total_mem_avail} / ${total_mem} GiB"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Compare with requirements
|
|||
|
|
log_info "=== Resource Comparison ==="
|
|||
|
|
if [ ${total_cpu_avail} -ge ${REQUIRED_CPU} ]; then
|
|||
|
|
log_success "CPU: ${total_cpu_avail} >= ${REQUIRED_CPU} ✅"
|
|||
|
|
else
|
|||
|
|
log_error "CPU: ${total_cpu_avail} < ${REQUIRED_CPU} ❌ (Shortfall: $((REQUIRED_CPU - total_cpu_avail)) cores)"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ ${total_mem_avail} -ge ${REQUIRED_RAM} ]; then
|
|||
|
|
log_success "RAM: ${total_mem_avail} GiB >= ${REQUIRED_RAM} GiB ✅"
|
|||
|
|
else
|
|||
|
|
log_error "RAM: ${total_mem_avail} GiB < ${REQUIRED_RAM} GiB ❌ (Shortfall: $((REQUIRED_RAM - total_mem_avail)) GiB)"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
log "=========================================="
|
|||
|
|
log_success "Quota check completed!"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main "$@"
|