#!/bin/bash #set -vx hosts=("1.1.1.1" "2.2.2.2" "3.3.3.3") get_host_info() { echo "Refreshing host info..." for h in "${hosts[@]}"; do virsh -c qemu+ssh://root@${h}/system pool-refresh --pool kvm_guests > /dev/null virsh -c qemu+ssh://root@${h}/system pool-refresh --pool nvme_guests > /dev/null virsh -c qemu+ssh://root@${h}/system pool-refresh --pool ISO > /dev/null echo "+++++++++++++++++" echo -e "Host ${h}\n" echo "+++++++++++++++++" virsh -c qemu+ssh://root@${h}/system list --all done echo "+++++++++++++++++" echo "Disk Volumes" echo "+++++++++++++++++" virsh -c qemu+ssh://root@${hosts[0]}/system vol-list --pool kvm_guests --details echo "+++++++++++++++++" echo "nVME Volumes" echo "+++++++++++++++++" virsh -c qemu+ssh://root@${hosts[0]}/system vol-list --pool nvme_guests --details echo "+++++++++++++++++" echo "ISO Volumes" echo "+++++++++++++++++" virsh -c qemu+ssh://root@${hosts[0]}/system vol-list --pool ISO --details $0 } mass_startup(){ read -p "Which host?" KVM_HOST guests=($(virsh -c qemu+ssh://root@${h}/system list --inactive | '/shut off/{print $2}')) for g in "${guests[@]}" do virsh -c qemu+ssh://root@${h}/system start ${g} done } migrate_domain(){ echo "Migration Types 1). Single Domain 2). Offline Domain 3). Mass Domain Migration " read -p "Select Migration Type: " MIG if [ $MIG == 1 ]; then read -p "Select source host. " SRC_URI virsh -c qemu+ssh://root@${SRC_URI}/system list | '/running/{print $2}' read -p "Select destination host. " DEST_URI read -p "Select domain. " DOM virsh -c qemu+ssh://root@${SRC_URI}/system migrate \ --domain $DOM \ --live \ --p2p \ --tunnelled \ --desturi qemu+ssh://root@${DEST_URI}/system \ --persistent \ --undefinesource \ --verbose rerun elif [ $MIG == 2 ]; then read -p "Select source host. " SRC_URI read -p "Select destination host. " DEST_URI domain=($(virsh -c qemu+ssh://root@${SRC_URI}/system list --inactive | '/shut off/{print $2}')) for dom in "${domain[@]}"; do read -p "Select destination host. " DEST_URI virsh -c qemu+ssh://root@${SRC_URI}/system migrate \ --domain $DOM \ --live \ --p2p \ --tunnelled \ --desturi qemu+ssh://root@${DEST_URI}/system \ --persistent \ --undefinesource \ --verbose rerun done elif [ $MIG == 3]; then read -p "Select source host. " SRC_URI read -p "Select destination host. " DEST_URI domain=($(virsh -c qemu+ssh://root@${SRC_URI}/system list | '/running/{print $2}')) for dom in "${domain[@]}"; do read -p "Select destination host. " DEST_URI virsh -c qemu+ssh://root@${SRC_URI}/system migrate \ --domain $DOM \ --live \ --p2p \ --tunnelled \ --desturi qemu+ssh://root@${DEST_URI}/system \ --persistent \ --undefinesource \ --verbose done else echo "Invalid type..." $0 fi $0 } backup_guest () { read -p "Enter the desired host: " KVM_HOST # declare/initialize global array guests=($(virsh -c qemu+ssh://root@${KVM_HOST}/system list | awk '/running/{print $2}')) # global variables SNAP_DEST=/mnt/snap/ CPY_DEST=/mnt/backup/ for n in "${guests[@]}" do # initialize block storage array list and sets array variable blks=($(virsh -c qemu+ssh://root@${KVM_HOST}/system domblklist --domain ${n} | awk '/vda/{print $2}')) BLK_CALL=$(echo ${blks[0]}) # create external snapshot virsh -c qemu+ssh://root@${KVM_HOST}/system snapshot-create-as --domain ${n} --name ${n} --diskspec vda,file=${SNAP_DEST}${n}.qcow2 \ --disk-only --atomic --no-metadata --quiesce | logger -t guest_snap # syncs with backup destination rsync -azq ${BLK_CALL} ${CPY_DEST}${n} | logger -t guest_sync # active blockcommit virsh -c qemu+ssh://root@${KVM_HOST}/system blockcommit --domain ${n} vda --active --pivot --verbose | logger -t guest_pivot rm -rf ${SNAP_DEST}${n}.qcow2 done $0 } test_node(){ read -p "Enter the desired host: " KVM_HOST read -p "Enter the name of guest: " GUEST read -p "Enter OS 1). AlmaLinux 10 2). Debian 13 " OS_CHO if [ $OS_CHO == 1 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool kvm_guests --name ${GUEST} --format qcow2 --capacity 500G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 2 \ --memory 2048 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_servers \ --disk /mnt/kvm_guests/$GUEST \ --cloud-init user-data=./user-data/cloud-init-configs/alma-node.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole elif [ $OS_CHO == 2 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool kvm_guests --name ${GUEST} --format qcow2 --capacity 500G --backing-vol /mnt/iso/debian-13-genericcloud-amd64-20250806-2196.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 2 \ --memory 2048 \ --os-variant debian13 \ --boot uefi \ --network bridge=_servers \ --disk /mnt/kvm_guests/$GUEST \ --cloud-init user-data=./user-data/debian-node.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole fi $0 } pg_node(){ read -p "Enter the desired host: " KVM_HOST read -p "Enter the name of guest: " GUEST virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool kvm_guests --name ${GUEST} --format qcow2 --capacity 500G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 4 \ --memory 4096 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_servers \ --disk /mnt/kvm_guests/$GUEST \ --cloud-init user-data=./user-data/postgres.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole $0 } zed_lake_node(){ read -p "Enter the desired host: " KVM_HOST read -p "Enter the name of guest: " GUEST virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool kvm_guests --name ${GUEST} --format qcow2 --capacity 500G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 4 \ --memory 4096 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_servers \ --disk /mnt/kvm_guests/$GUEST \ --cloud-init user-data=./user-data/zed-lake.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole $0 } int_docker_node(){ read -p "Enter the desired host: " KVM_HOST read -p "Enter the name of guest: " GUEST read -p "1). Leader or 2). Worker: " NODE_TYPE if [ $NODE_TYPE == 1 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool nvme_guests --name ${GUEST} --format qcow2 --capacity 100G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 4 \ --memory 4096 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_servers \ --disk /mnt/nvme_guests/$GUEST \ --cloud-init user-data=./user-data/docker-leader.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole elif [ $NODE_TYPE == 2 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool nvme_guests --name ${GUEST} --format qcow2 --capacity 100G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 8 \ --memory 8192 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_servers \ --disk /mnt/nvme_guests/$GUEST \ --cloud-init user-data=./user-data/docker-worker.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole else echo "Invalid type..."; $0 fi $0 } host_docker_node(){ read -p "Enter the desired host: " KVM_HOST read -p "Enter the name of guest: " GUEST read -p "1). Leader or 2). Worker: " NODE_TYPE if [ $NODE_TYPE == 1 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool nvme_guests --name ${GUEST} --format qcow2 --capacity 100G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 4 \ --memory 4096 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_hosting \ --disk /mnt/nvme_guests/$GUEST \ --cloud-init user-data=./user-data//docker-leader.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole elif [ $NODE_TYPE == 2 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool nvme_guests --name ${GUEST} --format qcow2 --capacity 100G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 echo "local-hostname: ${GUEST}" > ./meta-data virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 8 \ --memory 8192 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_hosting \ --disk /mnt/nvme_guests/$GUEST \ --cloud-init user-data=./user-data/docker-worker.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole else echo "Invalid type..."; $0 fi $0 } elastic_node(){ read -p "Enter the desired host: " KVM_HOST read -p "Enter the name of guest: " GUEST read -p "Elastic Node or Fleet Server (1=Node or 2=Fleet): " E_TYPE echo "local-hostname: ${GUEST}" > ./meta-data if [ $E_TYPE == 1 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool kvm_guests --name ${GUEST} --format qcow2 --capacity ${VOL_SIZE}G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 4 \ --memory 8192 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_elastic \ --disk /mnt/kvm_guests/$GUEST \ --cloud-init user-data=./user-data//elastic-stack.yaml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole elif [ $E_TYPE == 2 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool kvm_guests --name ${GUEST} --format qcow2 --capacity 100G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 2 \ --memory 2048 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_elastic \ --disk /mnt/kvm_guests/$GUEST \ --cloud-init user-data=./user-data//elastic-fleet.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole else echo "Invalid option..."; $0 fi $0 } kube_node(){ read -p "Enter the desired host: " KVM_HOST read -p "Enter the name of guest: " GUEST read -p "Dev or Prod (1=Prod or 2=Dev): " KUBE_E echo "local-hostname: ${GUEST}" > ./meta-data if [ ${KUBE_E} == 1 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool nvme_guests --name ${GUEST} --format qcow2 --capacity 100G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 2 \ --memory 4096 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_hosting \ --disk /mnt/nvme_guests/$GUEST \ --cloud-init user-data=./user-data//k3s-install.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole elif [ ${KUBE_E} == 2 ]; then virsh -c qemu+ssh://root@${KVM_HOST}/system vol-create-as --pool nvme_guests --name ${GUEST} --format qcow2 --capacity 100G --backing-vol /mnt/iso/AlmaLinux-10-GenericCloud-latest.x86_64_v2.qcow2 --backing-vol-format qcow2 virt-install \ --connect qemu+ssh://root@${KVM_HOST}/system \ --name $GUEST \ --vcpus 4 \ --memory 4096 \ --os-variant almalinux9 \ --boot uefi \ --network bridge=_servers \ --disk /mnt/nvme_guests/$GUEST \ --cloud-init user-data=./user-data//k3s-install.yml,meta-data=./meta-data \ --import \ --autostart \ --noautoconsole else echo "Invalid option..."; $0 fi $0 } echo "Available options: 1). Create Basic Node 2). Create Internal Docker Node 3). Create Hosting Docker Node 4). Create Elastic Node 5). Create k3s node 6). Create kubeadm node 7). Postgresql node 8). Zed Lake node a). Get info on a host b). Domain migration 00). Exit " read -p "Select an option: " OPT case "$OPT" in 1) test_node ;; 2) int_docker_node ;; 3) host_docker_node ;; 4) elastic_node ;; 5) kube_node ;; 6) kubeadm_node ;; 7) pg_node ;; 8) zed_lake_node ;; a|A) get_host_info ;; b|B) migrate_domain ;; 00|0) echo "Exiting..."; exit 0 ;; *) echo "Invalid option."; sleep 1; $0 ;; esac