可实现如下功能:
你正在运行Xenserver脚本程序,有如下功能可选择
1 显示当前系统虚拟机列表
2 批量添加虚拟机磁盘
3 批量设置防鼠标漂移
4 虚拟机异常卡死处理
5 虚拟机后缀占位符设置,默认VDI-001 占位符3 若VDI-01 占位符2
6 功能说明手册
0 退出程序运行
#!/bin/bash
pdd=3 # 虚拟机后缀占位符,默认值为3显示001开始
add_disk() {
echo "你的存储存储信息如下"
display=$(xe sr-list | awk -F ":" '/name-label/{print $NF}' | cat -n)
echo "$display"
read -p "请输入你选择的序号:" num
chosen_name=$(xe sr-list | awk -F ":" '/name-label/{print $NF}' | sed -n "${num}p" | sed -e 's/^[[:space:]]*//')
uid=$(xe sr-list name-label="$chosen_name" params=uuid --minimal)
echo "已选出存储$chosen_name $uid"
read -p "请输入你要添加的虚拟磁盘大小GB:" size
read -p "请输入虚拟机前缀:" vmname
read -p "请输入虚拟机开始编号:" num01
read -p "请输入虚拟机结束编号:" num02
read -p "请输入虚拟机未添加磁盘前的磁盘数量:" num05
echo "确认是否要执行如下虚拟机添加磁盘操作"
printf "$vmname%0${pdd}d\n" $(seq $num01 $num02)
read -p "确认请输入 y 确认 或 n 退出:" xuanze
[ "$xuanze" == "y" ] && echo "开始批量操作虚拟机" || continue
for i in $(seq $num01 $num02); do
num03=$(printf "%0${pdd}d" $i)
vm01=$vmname$num03
if ! [[ $(xe vm-list name-label="$vm01") ]]; then
echo -e "\033[31m虚拟机$vm01不存在,未创建磁盘成功\033[0m"
sleep 1
else
num_conut=$(xe vm-disk-list name-label=$vm01 | grep VBD | wc -l)
if [ $num_conut -eq $num05 ]; then
Nvdi=$(xe vdi-create name-label=$vm01-date-$((num05+1)) type=user virtual-size="$size"GiB sr-uuid=$uid)
vm=$(xe vm-list name-label=$vm01 --minimal)
vbd=$(xe vbd-create device=$((num05+1)) vdi-uuid=$Nvdi vm-uuid=$vm type=Disk mode=RW)
xe vbd-plug uuid=$vbd &>/dev/null
sleep 1
echo -e "\033[32m已完成虚拟机$vm01磁盘添加,添加大小为"$size"GB\033[0m"
else
echo -e "\033[31m虚拟机$vm01存在,但磁盘数量不满足要求$num05,未成功创建磁盘\033[0m"
fi
fi
done
}
set_mouse() {
read -p "请输入要设置鼠标防漂移的虚拟机前缀:" vmname
read -p "请输入虚拟机开始编号:" num01
read -p "请输入虚拟机结束编号:" num02
echo "确认是否要执行如下虚拟机操作放鼠标漂移设置"
printf "$vmname%0${pdd}d\n" $(seq $num01 $num02)
read -p "确认请输入 y 确认 或 n 退出:" num04
[ "$num04" == "y" ] && echo "开始批量操作虚拟机" || continue
for i in $(seq $num01 $num02); do
num03=$(printf "%0${pdd}d" $i)
vm01=$vmname$num03
# 检查虚拟机是否存在
if ! [[ $(xe vm-list name-label="$vm01") ]]; then
echo -e "\033[31m请确认虚拟机$vm01是否存在\033[0m"
sleep 1
continue
fi
uid=$(xe vm-list name-label=$vm01 --minimal)
xe vm-param-set uuid=$uid platform:usb=true platform:usb_tablet=true
echo -e "\033[32m已完成虚拟机$vm01鼠标防漂移设置\033[0m"
done
}
vm_list() {
xe vm-list | awk '/name-label/||/power-state/{print $NF}' | xargs -n2 | sort | sed '/ng$/s/running/已开机/g' | sed '/ed$/s/halted/已关机/g' | cat -n
read -p "请选择是否继续操作开机或者关机,按y继续 | 按n退出:" power
if [ "$power" == "y" ]; then
read -p "请输入要启动或者关闭的虚拟机前缀:" vmname
read -p "请输入虚拟机开始编号:" num01
read -p "请输入虚拟机结束编号:" num02
read -p "请输入start|stop:" set
echo "确认是否要执行如下虚拟机$set操作"
printf "$vmname%0${pdd}d\n" $(seq $num01 $num02)
read -p "确认请输入 y 确认 或 n 退出:" num04
[ "$num04" == "y" ] && echo "开始批量操作虚拟机" || continue
for i in $(seq $num01 $num02); do
num03=$(printf "%0${pdd}d" $i)
vm=$vmname$num03
if [ "$set" == "start" ]; then
xe vm-start name-label=$vm
[ $? -eq 0 ] && echo -e "\033[32m已启动虚拟机$vm\033[0m" || echo -e "\033[31m虚拟机$vm启动失败,请检测虚拟机状态\033[0m"
elif [ "$set" == "stop" ]; then
xe vm-shutdown name-label=$vm
[ $? -eq 0 ] && echo -e "\033[32m已关闭虚拟机$vm\033[0m" || echo -e "\033[31m虚拟机$vm关闭失败,请检测虚拟机状态\033[0m"
else
echo -e "\033[31m输入指令错误,请输入start或stop\033[0m"
fi
done
else
echo "退出不做操作"
fi
}
quit() {
exit 0
}
vm_dead() {
echo "1 销毁卡死的VM对应的domain id,迫使VM自动重启"
echo "2 迫使VM卡死崩溃重启"
echo "3 强制关闭 | 强制重启"
read -p "请根据实际情况选择对应的功能:" vm_dead01
if [ $vm_dead01 -eq 1 ]; then
read -p "请输入你要执行销毁domain id的虚拟机名称:" vm_name
uuid=$(xe vm-list name-label=$vm_name --minimal)
domain_id=$(list_domains | grep $uuid | awk '{print $1}')
sleep 2
/opt/xensource/debug/destroy_domain -domid $domain_id
[ $? -eq 0 ] && echo "已完完成虚拟机$vm_name的domain id销毁,对应的UUID:$uuid" || echo -e "\033[31m$vm_name执行失败,失败虚拟机的uuid$uuid\033[0m"
elif [ $vm_dead01 -eq 2 ]; then
read -p "请输入你要迫使卡死的虚拟机名称:" vm_name
xe vm-list params=actions-after-crash name-label=$vm_name
uuid=$(xe vm-list name-label=$vm_name --minimal)
sleep 2
domain_id=$(list_domains | grep $uuid | awk '{print $1}')
/usr/lib/xen/bin/crash_guest $domain_id
[ $? -eq 0 ] && echo "已完成迫使$vm_name卡死崩溃并重启,对应的UUID:$uuid" || echo -e "\033[31m$vm_name执行失败,失败虚拟机的uuid$uuid\033[0m"
elif [ $vm_dead01 -eq 3 ]; then
read -p "请输入你要操作的虚拟机名称:" vm_name
read -p "输入0强制关闭 | 输入1强制重启:" vm_stop
[ $vm_stop -eq 0 ] && xe vm-shutdown force=true name-label=$vm_name || xe vm-reboot force=true name-label=$vm_name
sleep 3
echo -e "\033[32m已完成虚拟机$vm_name的强制操作\033[0m"
else
echo -e "\033[31m指令输入有误,请重新运行\033[0m"
fi
}
caidan() {
echo ""
echo "==========================================================================================="
echo ""
echo "温馨提示:此程序仅供测试学习,请谨慎使用。若因使用和操作不当导致一切后果自负。"
echo ""
echo "1. 此程序可能在某些较低版本的Xenserver系统上存在命令差异,导致执行失败。请在适当环境中进行严格验证测试"
echo "2. 建议在生产环境使用前,在测试环境中对所有功能进行严格验证测试,以确保程序能在生产环境稳定运行"
echo "3. 此程序已在Xenserver 8.0及以上版本进行过测试,可正常运行。"
echo ""
echo "功能使用说明:"
echo ""
echo "1. 关于输入的虚拟机前缀问题,例如你的虚拟机名称为VDI-001,前缀请输入VDI-。"
echo "2. 关于虚拟机开始编号和结束编号,例如VDI-001至VDI-009,开始编号输入1,结束编号输入9即可"
echo "3. 关于虚拟机占位符,例如你的虚拟机名称为VDI-001,则占位符为3代表三个位置,VDI-002的占位符为2"
echo "4. 关于批量添加磁盘,请添加前务必确认存储空间容量足够分配,并确保程序显示的存储名称与控制台对应"
echo "5 关于虚拟机虚拟机未添加磁盘数据说明,主要为了防止已经添加过的虚拟机重复添加,只有满足输入的指定磁盘数量虚拟机才会添加磁盘"
echo "==========================================================================================="
echo ""
}
while true; do
echo "你正在运行Xenserver脚本程序,有如下功能可选择"
echo "1 显示当前系统虚拟机列表"
echo "2 批量添加虚拟机磁盘"
echo "3 批量设置防鼠标漂移"
echo "4 虚拟机异常卡死处理"
echo "5 虚拟机后缀占位符设置,默认VDI-001 占位符3 若VDI-01 占位符2"
echo "6 功能说明手册"
echo "0 退出程序运行"
read -p "请输入你要选择的序号:" num
if [ $num -eq 1 ]; then
vm_list
elif [ $num -eq 2 ]; then
add_disk
elif [ $num -eq 3 ]; then
set_mouse
elif [ $num -eq 4 ]; then
vm_dead
elif [ $num -eq 5 ]; then
read -p "请输入你要设置的占位符数量:" pdd
echo -e "\033[34m当前占位符已设置为$pdd,本次程序退出之前有效\033[0m"
elif [ $num -eq 6 ]; then
caidan
elif [ $num -eq 0 ]; then
quit
else
echo -e "\033[31m指令输入有误,请重新运行\033[0m"
fi
done
标签:运维,批量,read,虚拟机,vm,echo,Xenserver,033,name
From: https://blog.51cto.com/dengpeng2025/6940257