#!/bin/bash source ~/.bashrc # Execute All Todo Items - Proxmox Deployment # Automates execution of all remaining deployment tasks set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # Load environment variables if [ -f "$PROJECT_ROOT/.env" ]; then set -a source <(grep -v '^#' "$PROJECT_ROOT/.env" | grep -v '^$' | sed 's/#.*$//' | grep '=') set +a fi # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' ML110_IP="192.168.1.206" R630_IP="192.168.1.49" CLUSTER_NAME="${CLUSTER_NAME:-hc-cluster}" NFS_SERVER="${NFS_SERVER:-10.10.10.1}" NFS_PATH="${NFS_PATH:-/mnt/storage}" STORAGE_NAME="${STORAGE_NAME:-router-storage}" PVE_ROOT_PASS="${PVE_ROOT_PASS:-}" log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "\n${BLUE}=== $1 ===${NC}" } execute_remote() { local host=$1 local command=$2 local description=$3 log_info "$description on $host" if ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 "root@$host" "$command"; then log_info "✓ $description completed on $host" return 0 else log_error "✗ $description failed on $host" return 1 fi } copy_file_remote() { local host=$1 local source=$2 local dest=$3 log_info "Copying $source to root@$host:$dest" scp -o StrictHostKeyChecking=no "$source" "root@$host:$dest" } # Step 1: Create cluster on ML110 create_cluster_ml110() { log_step "Creating Proxmox Cluster on ML110" # Copy cluster setup script copy_file_remote "$ML110_IP" "$PROJECT_ROOT/infrastructure/proxmox/cluster-setup.sh" "/tmp/cluster-setup.sh" # Execute cluster creation execute_remote "$ML110_IP" \ "chmod +x /tmp/cluster-setup.sh && CLUSTER_NAME=$CLUSTER_NAME NODE_ROLE=create /tmp/cluster-setup.sh" \ "Cluster creation" # Verify execute_remote "$ML110_IP" "pvecm status && pvecm nodes" "Cluster verification" } # Step 2: Join R630 to cluster join_cluster_r630() { log_step "Joining R630 to Proxmox Cluster" # Copy cluster setup script copy_file_remote "$R630_IP" "$PROJECT_ROOT/infrastructure/proxmox/cluster-setup.sh" "/tmp/cluster-setup.sh" # Execute cluster join if [ -n "$PVE_ROOT_PASS" ]; then execute_remote "$R630_IP" \ "chmod +x /tmp/cluster-setup.sh && CLUSTER_NAME=$CLUSTER_NAME NODE_ROLE=join CLUSTER_NODE_IP=$ML110_IP ROOT_PASSWORD='$PVE_ROOT_PASS' /tmp/cluster-setup.sh" \ "Cluster join" else log_warn "PVE_ROOT_PASS not set, cluster join may require manual password entry" execute_remote "$R630_IP" \ "chmod +x /tmp/cluster-setup.sh && CLUSTER_NAME=$CLUSTER_NAME NODE_ROLE=join CLUSTER_NODE_IP=$ML110_IP /tmp/cluster-setup.sh" \ "Cluster join" fi # Verify execute_remote "$R630_IP" "pvecm status && pvecm nodes" "Cluster verification" } # Step 3: Verify cluster verify_cluster() { log_step "Verifying Cluster Health" log_info "Checking cluster status on ML110..." execute_remote "$ML110_IP" "pvecm status && pvecm nodes && pvecm expected" "Cluster status check" log_info "Checking cluster status on R630..." execute_remote "$R630_IP" "pvecm status && pvecm nodes && pvecm expected" "Cluster status check" } # Step 4: Configure NFS storage on ML110 configure_nfs_ml110() { log_step "Configuring NFS Storage on ML110" # Copy NFS storage script copy_file_remote "$ML110_IP" "$PROJECT_ROOT/infrastructure/proxmox/nfs-storage.sh" "/tmp/nfs-storage.sh" # Execute NFS storage setup execute_remote "$ML110_IP" \ "chmod +x /tmp/nfs-storage.sh && NFS_SERVER=$NFS_SERVER NFS_PATH=$NFS_PATH STORAGE_NAME=$STORAGE_NAME CONTENT_TYPES=images,iso,vztmpl,backup /tmp/nfs-storage.sh" \ "NFS storage configuration" # Verify execute_remote "$ML110_IP" "pvesm status" "Storage verification" } # Step 5: Configure NFS storage on R630 configure_nfs_r630() { log_step "Configuring NFS Storage on R630" # Copy NFS storage script copy_file_remote "$R630_IP" "$PROJECT_ROOT/infrastructure/proxmox/nfs-storage.sh" "/tmp/nfs-storage.sh" # Execute NFS storage setup execute_remote "$R630_IP" \ "chmod +x /tmp/nfs-storage.sh && NFS_SERVER=$NFS_SERVER NFS_PATH=$NFS_PATH STORAGE_NAME=$STORAGE_NAME CONTENT_TYPES=images,iso,vztmpl,backup /tmp/nfs-storage.sh" \ "NFS storage configuration" # Verify execute_remote "$R630_IP" "pvesm status" "Storage verification" } # Step 6: Verify shared storage verify_storage() { log_step "Verifying Shared Storage" log_info "Checking storage on ML110..." execute_remote "$ML110_IP" "pvesm status && pvesm list" "Storage check" log_info "Checking storage on R630..." execute_remote "$R630_IP" "pvesm status && pvesm list" "Storage check" } # Step 7: Configure VLAN bridges on ML110 configure_vlans_ml110() { log_step "Configuring VLAN Bridges on ML110" # Check if script exists if [ -f "$PROJECT_ROOT/infrastructure/network/configure-proxmox-vlans.sh" ]; then copy_file_remote "$ML110_IP" "$PROJECT_ROOT/infrastructure/network/configure-proxmox-vlans.sh" "/tmp/configure-vlans.sh" execute_remote "$ML110_IP" "chmod +x /tmp/configure-vlans.sh && /tmp/configure-vlans.sh" "VLAN configuration" else log_warn "VLAN configuration script not found, skipping" fi # Verify execute_remote "$ML110_IP" "ip addr show | grep -E 'vmbr|vlan'" "Network verification" } # Step 8: Configure VLAN bridges on R630 configure_vlans_r630() { log_step "Configuring VLAN Bridges on R630" # Check if script exists if [ -f "$PROJECT_ROOT/infrastructure/network/configure-proxmox-vlans.sh" ]; then copy_file_remote "$R630_IP" "$PROJECT_ROOT/infrastructure/network/configure-proxmox-vlans.sh" "/tmp/configure-vlans.sh" execute_remote "$R630_IP" "chmod +x /tmp/configure-vlans.sh && /tmp/configure-vlans.sh" "VLAN configuration" else log_warn "VLAN configuration script not found, skipping" fi # Verify execute_remote "$R630_IP" "ip addr show | grep -E 'vmbr|vlan'" "Network verification" } # Main execution main() { log_info "Starting Proxmox deployment automation..." log_info "This script will execute all automated tasks" log_warn "Note: Some tasks (OS installation, manual configuration) require manual intervention" # Check SSH access log_info "Testing SSH access..." if ! ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 "root@$ML110_IP" "echo 'ML110 accessible'" &>/dev/null; then log_error "Cannot SSH to ML110 ($ML110_IP). Please ensure SSH access is configured." exit 1 fi if ! ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 "root@$R630_IP" "echo 'R630 accessible'" &>/dev/null; then log_error "Cannot SSH to R630 ($R630_IP). Please ensure SSH access is configured." exit 1 fi log_info "SSH access confirmed" # Execute tasks create_cluster_ml110 join_cluster_r630 verify_cluster configure_nfs_ml110 configure_nfs_r630 verify_storage configure_vlans_ml110 configure_vlans_r630 log_info "Automated tasks completed!" log_warn "Remaining manual tasks:" log_warn " - VM template verification/creation" log_warn " - VM deployment" log_warn " - OS installation on VMs (requires console access)" log_warn " - Service configuration" } main "$@"