一个快速创建虚拟机的脚本
前提
1、先在创建两个基本虚拟机,系统分别是centos6.10与centos7.5,创建方法见 部暑。
2、分别把这两个系统的xml文件复制一份到/etc/libvirt/qemu下,命名为:kvm-base-6-ori.xml与kvm-base-7-ori.xml。
3、修改这两个xml文件,把xml里的虚拟机名统一修改为kvm-base,把UUID及Mac地址这两行删除保存。
4、centos6的系统镜像还需要到/etc/udev/rules.d/70-persistent-net.rules把eth0的删除掉,要不获取不到ip
5、分别把这两个系统的镜像拷贝一份到/kvm/source下,命名为:kvm-base-6.qcow2与kvm-base-7.qcow2。
实现效果如下:
代码如下:
[root@TEST24 ~]# cat /scripts/create-kvm.sh
#!/bin/sh
. /etc/init.d/functions
conf=/etc/libvirt/qemu
virsh list --all|awk '{print $2}'|sed -e '1d' > /tmp/virsh-kvm.txt
maxmem=`free -g|sed -n '2p'|awk '{print $NF}'`
maxcpu=`grep 'core id' /proc/cpuinfo |wc -l`
#接收参数:
read -p "请输入将要创建的虚拟机的名称:" n
read -p "请选择虚拟机的CentOS版本(6|7|8) :" s
read -p "请输入虚拟机的内存大小(整数):" m
read -p "请输入虚拟机的CPU个数(整数):" c
read -p "是否对虚拟机执行初始化(Y/N):" g
#判断输入的参数是否正确
[ -z $n ] &&{
echo "虚拟机的名称没有输入,请重新输入"
exit 1
}
exec </tmp/virsh-kvm.txt
while read line
do
KvmName=`echo $line`
if [ $KvmName ]
then
if [ $n == $KvmName ]
then
echo "输入的虚拟机名称已存在,请重新输入"
exit 2
fi
fi
done
[ -z $s ] &&{
echo "没有选择虚拟机的系统版本,请选择(6或7或8)"
exit 1
}
if [ $s -ne 6 ] && [ $s -ne 7 ] && [ $s -ne 8 ]
then
echo "只能选择CentOS版本:6 或 7 或 8"
exit 2
fi
[ -z $m ] &&{
echo "没有输入所创建虚拟机的内存大小,请重新输入"
exit 1
}
expr $m + 0 &>/dev/null
RETVAL1=$?
test $RETVAL1 -eq 0 ||{
echo "内存参数请输入一个整数:"
}
if [ $m -lt 1 ] || [ $m -gt $maxmem ]
then
echo "可选择内存最小为 1 G,最大为 $maxmem G,请重新输入一个数值"
exit 2
fi
[ -z $c ] &&{
echo "没有输入所创建虚拟机的cpu数量,请重新输入"
exit 1
}
expr $c + 0 &>/dev/null
RETVAL2=$?
test $RETVAL2 -eq 0 ||{
echo "CPU参数请输入一个整数:"
}
if [ $c -lt 1 ] || [ $c -gt $maxcpu ]
then
echo "可选择CPU核数最小为 1 核,最大为 $maxcpu 核,请重新输入一个数值"
exit 2
fi
if [[ "$g" != 'Y' ]] && [[ "$g" != 'N' ]] && [[ "$g" != 'y' ]] && [[ "$g" != 'n' ]]
then
echo "是否选择初始化时只能输入 Y 或 y 或 N 或 n"
exit 2
fi
f=/root/init.sh
if [[ "$g" == 'Y' ]] || [[ "$g" == 'y' ]];then
test -f $f ||{
echo "没找到初始化脚本,请把init.sh文件存放在/root目录下,再重新创建虚拟机"
exit 2
}
fi
#判断是否安装了virt管理工具,没有的就安装
if ! [ -x "$(command -v virt-customize)" ]
then
echo "virt管理工具没有安装,正在安装virt....."
yum install libguestfs-tools -y &>/dev/null
if ! [ -x "$(command -v virt-customize)" ]; then
echo "virt管理工具安装失败,虚拟机创建失败,请检查你的网络,或联系管理员!"
exit 3
else
echo "virt管理工具安装完成,虚拟机创建继续进行中....."
fi
else
echo "virt管理工具已安装,虚拟机创建继续进行中....."
fi
#根据选择的系统版本创建对应的虚拟机
M=$(($m*1048576))
if [ $s -eq 6 ]
then
echo "正在创建虚拟机...."
cp $conf/kvm-base-6-ori.xml $conf/"$n".xml
cp /kvm/source/kvm-base-6.qcow2 /kvm/"$n".qcow2
sed -i "s#kvm-base-6#$n#g" $conf/"$n".xml
sed -i "s#1048576#$M#g" $conf/"$n".xml
sed -i "s#>1<#>$c<#g" $conf/"$n".xml
action "虚拟机已创建" /bin/true
elif [ $s -eq 7 ]
then
echo "正在创建虚拟机...."
cp $conf/kvm-base-7-ori.xml $conf/"$n".xml
cp /kvm/source/kvm-base-7.qcow2 /kvm/"$n".qcow2
sed -i "s#kvm-base-7#$n#g" $conf/"$n".xml
sed -i "s#1048576#$M#g" $conf/"$n".xml
sed -i "s#>1<#>$c<#g" $conf/"$n".xml
action "虚拟机已创建" /bin/true
elif [ $s -eq 8 ]
then
echo "正在创建虚拟机...."
cp $conf/kvm-base-8-ori.xml $conf/"$n".xml
cp /kvm/source/kvm-base-8.qcow2 /kvm/"$n".qcow2
sed -i "s#kvm-base-8#$n#g" $conf/"$n".xml
sed -i "s#2097152#$M#g" $conf/"$n".xml
sed -i "s#>1<#>$c<#g" $conf/"$n".xml
action "虚拟机已创建" /bin/true
fi
#把创建的虚拟定义到域中
virsh define $conf/"$n".xml &>/dev/null
#把主机名修改跟虚拟机名一样
virt-customize -d $n --hostname $n &>/dev/null
#有选择初始化系统的,执行初始化脚本
if [[ "$g" == 'Y' ]] || [[ "$g" == 'y' ]]
then
echo "正在初始化虚拟机....."
virt-customize -d $n --firstboot $f &>/dev/null
action "初始化完成" /bin/true
echo "正在启动虚拟机....."
else
echo "正在启动虚拟机....."
fi
#启动创建的虚拟机
virsh start $n &>/dev/null
sleep 30
action "虚拟机已启动" /bin/true
#返回所创建虚拟机的IP
IP=`virsh domifaddr $n --source agent|grep -E 'eth0|ens3'|awk '{print $NF}'|awk -F "/" '{print $1}'`
echo "虚拟机 $n 的连接IP为:$IP"
文档更新时间: 2020-03-24 14:23 作者:子木