kvm 自动装机脚本
新建数据目录
[root@localhost root]# mkdir /data
[root@localhost root]# cd /data
[root@localhost data]# mkdir ISO ISO1 disk
1.制作kvm镜像文件 kvm制作qcow2 格式centos7镜像文件
[root@localhost data]# ll
total 44
drwxr-xr-x 2 root root 116 Mar 11 01:30 disk #存放外挂磁盘目录
-rw-r--r-- 1 root root 30 Mar 11 01:24 exec1 #创建主机清单
-rw-r--r-- 1 root root 315 Mar 11 01:25 ifcfg-ens3 #虚拟主机网卡文件设置
drwxr-xr-x. 2 root root 24 Nov 30 20:35 ISO #基础镜像文件
drwxr-xr-x 2 root root 8192 Mar 11 01:25 ISO1 #主机镜像文件目录
-rw-r--r-- 1 root root 111 Mar 11 01:26 kvm.logs #日志文件
-rwxr-xr-x 1 root root 3107 Mar 11 01:25 kvm.sh #创建主机脚本
[root@localhost data]# ls ISO
test.qcow2
#我已经制作好了自己的基础镜像,详细可以自己跳转去看
2.主机清单格式
[root@localhost data]# cat exec1
6003 3x6-k8snode1 10.0.49.243
注意,第一列必须是端口,第二列为主机名称,第三列为主机IP 以空格间隔,有仅只能有一个空格,需要自己设置自己kvm虚拟机网卡文件,脚本依赖此文件
[root@localhost data]# cat ifcfg-ens3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens3
DEVICE=ens3
ONBOOT=yes
IPADDR=10.0.49.243 #无需修改
GATEWAY=10.0.50.1 #按需求修改
PREFIX=22 #按需求修改
DNS1=10.0.51.122 #按需求修改
DNS2=8.8.8.8 #按需求修改
[root@localhost data]#
脚本会每执行新建一次主机都会向主机清单去拿IP替换此文件,
3.脚本
[root@localhost data]# cat kvm.sh
#!/bin/bash
#注意: exec1 文件中,格式 "端口 虚拟机name ip" 中间以空格分隔不可以用其他字符分隔
#注意: exec1 文件中,格式 "所有数据不得有重复的,有且只能有一个 "
############ init centos7 ############
which virt-copy-in
if [ $? -eq 0 ];then
break
else
exit
fi
#####################################
address=/data/ISO1 # 定义地址
for i in `cat exec1 | awk -F "[ ]+" '{print $1}'`
do
line=`sed -n 15p ifcfg-ens3` # 行数
ip=`cat exec1 | grep -w $i | awk -F "[ ]+" '{print $3}'` #过滤ip地址
name=`cat exec1 | grep -w $i | awk -F "[ ]+" '{print $2}'`
port=$i
sed -i "s#$line#IPADDR=$ip#g" /data/ifcfg-ens3 #替换ip
[ -f /data/ISO1/$name.qcow2 ]
if [ $? -eq 0 ];then
echo "------------------------"
echo "$name qcow2格式模板已存在"
echo "------------------------"
else
/bin/cp /data/ISO/test.qcow2 /data/ISO1/$name.qcow2 #复制镜像文件
fi
name1=${name//./\\.}
name1=${name1//-/\\-}
num=`virsh list --all | awk -F "[ ]+" '{print $3}' | grep -w $name`
if [ "$name" == "$num" ];then
echo "------------------"
echo "$name 虚拟机已存在"
echo "------------------"
continue
else
virt-install --virt-type kvm --name $name --ram 6144 --vcpus=3 --import --disk path=/$address/$name.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0,port=$port --os-type=linux #启动镜像
sleep 10 # 等待镜像启动
virsh shutdown $name
sleep 5
fi
if [ $? -eq 0 ];then
if [ $? -eq 0 ];then
virt-copy-in -d $name ifcfg-ens3 /etc/sysconfig/network-scripts/
sleep 5
virt-copy-in -d $name ifcfg-ens3 /etc/sysconfig/network-scripts/
virsh start $name
sleep 5
name1=`cat exec1 | grep -w $i | awk -F "[ ]+" '{print $2}'`
echo " $name1 $ip:$port" >> kvm.logs
else
echo "--------------"
echo "请检查主机列表"
echo "--------------"
fi
else
echo "--------------------"
echo "$name1 $i 主机已存在"
echo "--------------------"
fi
if [ $? -eq 0 ];then
echo "----------------------------"
echo " $i is ok "
echo "----------------------------"
else
echo "----------------------------"
echo " $i is no"
echo "----------------------------"
fi
done
此脚本是基于 virt-copy-in 命令为基础的所以如果执行失败宿主机执行如下命令
yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-* libvirt-client