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