#!/bin/bash source ~/.bashrc # Verify Cloud-init Installation on VMs # Checks if cloud-init is installed and working set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # SSH user SSH_USER="${SSH_USER:-ubuntu}" SSH_KEY="${SSH_KEY:-$HOME/.ssh/id_ed25519_proxmox}" PROXMOX_HOST="${PROXMOX_ML110_IP:-192.168.1.206}" # Import helper library if [ -f "$PROJECT_ROOT/scripts/lib/proxmox_vm_helpers.sh" ]; then source "$PROJECT_ROOT/scripts/lib/proxmox_vm_helpers.sh" else echo "[ERROR] Helper library not found. Run this script on Proxmox host or via SSH." >&2 exit 1 fi # VMID NAME (no IP - discovered via guest agent) VMS=( "100 cloudflare-tunnel" "101 k3s-master" "102 git-server" "103 observability" ) # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } check_cloud_init() { local vmid=$1 local name=$2 log_info "Checking cloud-init on $name (VM $vmid)..." # Ensure guest agent is enabled ensure_guest_agent_enabled "$vmid" || true # Get IP from guest agent local ip ip="$(get_vm_ip_or_warn "$vmid" "$name" || true)" if [[ -z "$ip" ]]; then log_warn "$name (VM $vmid) - cannot get IP from guest agent" return 1 fi log_info " Discovered IP: $ip" # Test connectivity if ! ping -c 1 -W 2 "$ip" &> /dev/null; then log_warn "$name ($ip) is not reachable - may still be booting" return 1 fi # Try SSH connection if ssh -i "$SSH_KEY" -o StrictHostKeyChecking=accept-new -o ConnectTimeout=5 "$SSH_USER@$ip" "echo 'Connected'" &>/dev/null; then log_info " SSH connection successful" # Check cloud-init local cloud_init_status=$(ssh -i "$SSH_KEY" -o StrictHostKeyChecking=accept-new "$SSH_USER@$ip" \ "systemctl is-active cloud-init 2>/dev/null || echo 'not-installed'" 2>/dev/null) if [ "$cloud_init_status" = "active" ] || [ "$cloud_init_status" = "inactive" ]; then log_info " ✓ Cloud-init is installed" ssh -i "$SSH_KEY" -o StrictHostKeyChecking=accept-new "$SSH_USER@$ip" \ "cloud-init status 2>/dev/null || echo 'Status unknown'" 2>/dev/null return 0 else log_warn " Cloud-init may not be installed" return 1 fi else log_warn " Cannot SSH to $name ($ip) - may need password or key" log_info " To verify manually: ssh -i $SSH_KEY $SSH_USER@$ip" return 1 fi } main() { log_info "Verifying cloud-init installation on VMs" log_warn "This requires SSH access to VMs" log_info "Using guest-agent IP discovery" echo "" local all_ok=true for vm_spec in "${VMS[@]}"; do read -r vmid name <<< "$vm_spec" if ! check_cloud_init "$vmid" "$name"; then all_ok=false fi echo "" done if [ "$all_ok" = true ]; then log_info "All VMs have cloud-init installed!" else log_warn "Some VMs may not have cloud-init or are not accessible" log_info "If cloud-init is not installed, install it:" log_info " sudo apt update && sudo apt install cloud-init" fi } main "$@"