Replicate VMs to a DR site Using RBD

Script to replicate VMs to a DR site using RBD Snapshots.

#!/bin/bash

LOG_FILE="/var/log/vm-snapshots.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")
DR_USER="root"
DR_HOST="HOST-DR-001"
SSH_OPTS="-o ConnectTimeout=10 -o StrictHostKeyChecking=no"


VMS=(
    "ceph/vm-107-disk-1"
    "ceph/vm-107-disk-2"
    "ceph/vm-116-disk-0"
    "ceph/vm-116-disk-1"
    "ceph/vm-116-disk-2"
    "ceph/vm-120-disk-0"
    "ceph/vm-120-disk-1"
    "ceph/vm-120-disk-2"
    "ceph/vm-120-disk-3"
    "ceph/vm-124-disk-0"
    "ceph/vm-124-disk-1"
    "ceph/vm-124-disk-2"
    "ceph/vm-124-disk-3"
    "ceph/vm-134-disk-0"
    "ceph/vm-134-disk-1"
    "ceph/vm-151-disk-1"
    "ceph/vm-151-disk-2"
)

# Function to check mirror status on DR server
check_can_snapshot() {
    local image=$1
    local ssh_command="rbd mirror image status $image 2>&1"
    
    # Execute status check on DR server via SSH
    local status_output=$(ssh $SSH_OPTS $DR_USER@$DR_HOST "$ssh_command" 2>&1)
    local exit_code=$?
    
    if [[ $exit_code -ne 0 ]]; then
        echo "[$DATE] ERROR: Status check failed for $image (Exit $exit_code): $status_output" >> $LOG_FILE
        return 1
    fi

    # Check if replay_state is idle
    if echo "$status_output" | grep -q '"replay_state":"idle"'; then
        return 0
    else
        echo "[$DATE] Skipping $image: $(echo "$status_output" | grep 'replay_state')" >> $LOG_FILE
        return 1
    fi
}

# Main execution
echo "---- Distributed Snapshot Job Started at $DATE ----" >> $LOG_FILE

for vm in "${VMS[@]}"; do
    echo "[$DATE] Processing $vm" >> $LOG_FILE
    
    if check_can_snapshot "$vm"; then
        echo "[$DATE] Creating local snapshot for $vm" >> $LOG_FILE
        snapshot_output=$(rbd mirror image snapshot "$vm" 2>&1)
        
        if [[ $? -eq 0 ]]; then
            echo "[$DATE] SUCCESS: Snapshot created for $vm" >> $LOG_FILE
        else
            echo "[$DATE] ERROR: Snapshot failed for $vm: $snapshot_output" >> $LOG_FILE
        fi
    fi
done

echo "---- Job Completed at $(date) ----" >> $LOG_FILE