Some checks failed
Test / test (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
239 lines
7.6 KiB
Bash
Executable File
239 lines
7.6 KiB
Bash
Executable File
#!/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 "$@"
|
|
|