脚本管理KVM
脚本管理KVM
1、快速开启/关闭所有虚拟机
#/bin/bash virsh list --all HELP(){ echo "功能:快速开启/关闭所有虚拟机" echo "用法:$(basename $0) <domain> [1 open all|2 close all]" } echo "0. close all 1. open all" read -p "choose your option(1/2): " op #close_all函数:强制关闭所有的虚拟机 close_all(){ for i in `virsh list|egrep -v "^$"|awk 'NR>2{print $2}'`;do virsh destroy $i done } #open_all函数:开启所有关闭的虚拟机 open_all(){ for i in `virsh list --inactive|egrep -v "^$"|awk 'NR>2{print $2}'`;do virsh start $i done } case "$op" in 0) close_all;; 1) open_all;; *) echo "error: Please again choose" && HELP && exit;; esac
2、快速添加、删除、列出虚拟机磁盘
#/bin/bash virsh list --all HELP(){ echo "功能:快速添加、删除、列出虚拟机磁盘" echo "用法:$(basename $0) <domain> [1 add|2 del|3 list]" } read -p "Please input disk on which virtual: " v [[ -z "$v" || "$v" == "-h" || "$v" == "--help" ]] && HELP && exit #判断输入是否存在 stats=$(virsh list --all |awk '$2=="'$v'"{print $3}') [ -z $stats ] && echo "error: virtual not exist" && exit [ "$stats" != "running" ] && echo "error: virtual $v not running" && exit #热添加判断运行情况 echo "1. add 2. delect 3. list" read -p "choose your option(1/2/3): " op case "$op" in 1) read -p "Please input your disk size(G):" size [[ !$size =~ ^[0-9] ]] && echo "error: size must munber" && exit pool=/mnt/lvm1 cd $pool i=1 while :;do #遍历查找,防止重命名qcow... [ -f "$v-add-$i.qcow2" ] && let i++ && continue diskfile=$v-add-$i.qcow2&& break done qemu-img create -f qcow2 $diskfile $size bus=$(virsh dumpxml centos7.0 |awk -F "'" '/[shv]da/{print $4}'|sed -n "1p") #磁盘类型 FirstDiskName=$(virsh domblklist $v |awk 'NR==3{print $1}') DiskType=${FirstDiskName::-1} #第一块磁盘前缀 for j in {b..z};do #循环查找,防止重命名vdb... ! virsh domblklist $v|grep "^$DiskType$j" &> /dev/null && diskName=$DiskType$j && break done #磁盘配置文件 tmpfile=/tmp/diskfile cat > $tmpfile <<- eof <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='$pool/$diskfile'/> <target dev='$diskName' bus='$bus'/> </disk> eof #热添加磁盘并列出 virsh attach-device $v $tmpfile --persistent virsh domblklist $v ;; 2) virsh domblklist $v read -p "Please input delete disk: " disk ! virsh domblklist $v |grep -w "^$disk" && echo "error: disk $disk not exist" && exit #判断输入磁盘是否存在 [[ $disk =~ a$ ]] && echo "error: systemd disk $disk not allow delete" && exit #系统磁盘不允许删除 virsh detach-disk $v $disk --persistent rm -rf $pool/$diskfile ;; 3) virsh domblklist $v ;; *) echo "error: Please again choose" && HELP && exit ;; esac
3、虚拟机网卡
#/bin/bash HELP(){ echo "功能:添加虚拟机网卡" } virsh list --all read -p"输入你要添加硬件虚拟机: " h [[ -z "$v" || "$v" == "-h" || "$v" == "--help" ]] && HELP && exit #判断输入是否>存在 stats=$(virsh list --all |awk '$2=="'$v'"{print $3}') [ -z $stats ] && echo "error: virtual not exist" && exit ##创建网卡配置文件 netfine=/tmp/network.xml cat > $netfine <<- EOF <interface type='network'> <source network='default' bridge='virbr0'/> <model type='virtio'/> </interface> EOF virsh attach-device $h $netfine --persistent
4、快照管理
#/bin/bash HELP(){ echo "功能:快照管理虚拟机" echo "用法:$(basename $0) <domain> [virtname]" } clear virsh list --all read -p "Please input snapshot virtname: " virtname [[ -z "$virtname" || "$virtname" == "-h" || "$virtname" == "--help" ]] && HELP && exit stats=$(virsh list --all |awk '$2=="'$virtname'"{print $3}') [ -z $stats ] && echo "error: virtual not exits" && exit read -p "Please input snapshot name:" snaName virsh snapshot-create-as $virtname $snaName virsh snapshot-list $virtname
5、快速克隆虚拟机(连接克隆 && 完全克隆)
#/bin/bash HELP(){ clear echo "功能:快速克隆虚拟机" echo "用法:$(basename $0) <domain> [0 link clone|1 full clone]" virsh list --inactive echo "(ps:开机的虚拟机不能克隆如需要克隆开机的虚拟机则先执行关机)" } virsh list --inactive read -p "Please input clone-master virtual(--help): " clone [[ -z "$clone" || "$clone" == "-h" || "$clone" == "--help" ]] && HELP && exit stats=$(virsh list --all |awk '$2=="'$clone'"{print $3}') [ -z $stats ] && echo "error: virtual not exits" && exit [ "$stats" != "shut" ] && echo "error: virtual $clone not shutdown" && exit echo "0. link clone 1. full clone" read -p "choose your option(0/1): " op read -p "请输入新克隆虚机名称:" KVMname case "$op" in 0) sourceimage=/var/lib/libvirt/images/$clone.qcow2 sourcexml=/etc/libvirt/qemu/$clone.xml newimg=/mnt/lvm1/${KVMname}.qcow2 newxml=/etc/libvirt/qemu/${KVMname}.xml qemu-img create -f qcow2 -b $sourceimage $newimg &> /dev/null cp $sourcexml $newxml sed -i -e "/uuid/d" -e "/<mac/d" $newxml sed -i "/<name/ s/$clone/$KVMname/" $newxml sed -i "/<source file/ s#$sourceimage#$newimg#" $newxml virsh define $newxml virsh list --all ;; 1) virt-clone -o $clone -n $KVMname -f /mnt/lvm1/$KVMname.img virsh list --all ;; *) echo "error: Please again choose" && HELP && exit ;; esac
6、批量创建虚机脚本
#!/bin/bash #KVM batch create vm tool #version: 0.1 #author: sun #需要事先准备模板镜像和配置文件模板 echo "1.创建自定义配置单个虚拟机 2.批量创建自定义配置虚拟机 3.批量创建默认配置虚拟机 4.删除虚拟机" read -p "选取你的操作(1/2/3/4):" op batch_self_define() { KVMname=`openssl rand -hex 5` sourceimage=/var/lib/libvirt/images/centos7.0.qcow2 sourcexml=/etc/libvirt/qemu/kvmmodel.xml newimg=/mnt/lvm1/${KVMname}.qcow2 newxml=/etc/libvirt/qemu/${KVMname}.xml cp $sourceimage $newimg cp $sourcexml $newxml KVMuuid=`uuidgen` KVMmem=${1}000000 KVMcpu=$2 KVMimg=$newimg KVMmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'` sed -i "s@KVMname@$KVMname@;s@KVMuuid@$KVMuuid@;s@KVMmem@$KVMmem@;s@KVMcpu@$KVMcpu@;s@KVMimg@$KVMimg@;s@KVMmac@$KVMmac@" $newxml virsh define $newxml virsh list --all } self_define() { read -p "请输入新虚机名称:" newname read -p "请输入新虚机内存大小(G):" newmem read -p "请输入新虚机cpu个数:" newcpu sourceimage=/var/lib/libvirt/images/centos7.0.qcow2 sourcexml=/etc/libvirt/qemu/kvmmodel.xml newimg=/mnt/lvm1/${newname}.qcow2 newxml=/etc/libvirt/qemu/${newname}.xml cp $sourceimage $newimg cp $sourcexml $newxml KVMname=$newname KVMuuid=`uuidgen` KVMmem=${newmem}000000 KVMcpu=$newcpu KVMimg=$newimg KVMmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'` sed -i "s@KVMname@$KVMname@;s@KVMuuid@$KVMuuid@;s@KVMmem@$KVMmem@;s@KVMcpu@$KVMcpu@;s@KVMimg@$KVMimg@;s@KVMmac@$KVMmac@" $newxml virsh define $newxml virsh list --all } case $op in 1)self_define;; 2) read -p "请输入新虚机名称:" newname read -p "请输入新虚机内存大小(G):" newmem read -p "请输入新虚机cpu个数:" newcpu for((i=1;i<=$num;i++));do batch_self_define $newmem $newcpu done ;; 3) read -p "请输入要创建的虚拟机的个数:" num for((i=1;i<=$num;i++));do batch_self_define 1 1 done ;; 4) virsh list --all read -p "输入要删除的虚拟机:" del_virtual read -p "请确认是要是否要删除$del_virtual yes/no:" pd virsh domblklist $del_virtual |egrep -v "^$"|awk 'NR>2{print $2}' > /tmp/$del_virtual [ $pd == "yes" ] && virsh undefine $del_virtual i=1 while read line do rm -rf $line let i++ done < /tmp/$del_virtual echo "Domain $del_virtual disk has been rm -rf" ;; *) echo "输入错误,请重新执行脚本" exit ;; esac