脚本管理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
原文地址:https://www.cnblogs.com/user-sunli/p/13921379.html