当前位置:首页 > Citrix > 正文内容

Xenserver批量运维脚本

邓鹏1年前 (2024-01-16)Citrix330

可实现如下功能:

你正在运行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


扫描二维码推送至手机访问

版权声明:本文由PowerShell中文社区发布,如需转载请注明出处。

本文链接:https://www.powershell.com.cn/?id=46

标签: Xenserver

“Xenserver批量运维脚本” 的相关文章

云桌面-Windows 服务器常规性设置-Powershell 脚本

云桌面-Windows 服务器常规性设置-Powershell 脚本

程序是用PowerShell语言编写的Windows服务器常规性设置工具,可以帮助你快速进行Windows服务器设置。以下是使用说明:运行程序后,会显示菜单,其中包括了常见的Windows服务器设置选项,比如设置IP地址、设置主机名、计算机加域、计算机退域等。输入对应的序号即可执行相应的操作,例如输...

Citrix视频课程在线学习推荐

Citrix视频课程在线学习推荐

🚀 全新 Citrix Virtual Apps and Desktops 2203CU1 课程上线啦! 🚀  🎯 课程亮点:专为Citrix项目实施人员设计:深入探讨Citrix架构规划的关键注意事项,确保项目实施的成功。比1912CU3更全面的内容:相较于之前版本,本课程提供...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。