Xenserver批量运维脚本
可实现如下功能:
你正在运行Xenserver脚本程序,有如下功能可选择
1 显示当前系统虚拟机列表
2 批量添加虚拟机磁盘
3 批量设置防鼠标漂移
4 虚拟机异常卡死处理
5 虚拟机后缀占位符设置,默认VDI-001 占位符3 若VDI-01 占位符2
6 功能说明手册
0 退出程序运行
#!/bin/bash pdd=3 # 虚拟机后缀占位符,默认值为3显示001开始 add_disk() { clear 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" echo "-------------------------------------------------------------" echo -e "| 例如:虚拟机CVAD-001;计划对CVAD-001到CVAD-020添加数据盘, \n| 虚拟机前缀为:CVAD- \n| 虚拟机占位符: 3 #虚拟机名称CVAD-001其中001位数 \n| 虚拟机开始编号:1 \n| 虚拟机结束编号:20 " echo "-------------------------------------------------------------" read -p "请输入虚拟机前缀:" vmname read -p "请输入虚拟机开始编号:" num01 read -p "请输入虚拟机结束编号:" num02 read -p "请输入你要添加的虚拟磁盘大小GB:" size 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