kvm批量创建虚拟机并自动设定ip和服务器名
2019-01-01 本文已影响0人
六十三63
1. 说明
kvm比起vmware来说最没有的功能就是用模板部署虚拟机的时候可以自定义ip地址,这对于大量创建vm的场景来说你需要一台台vnc的登录改动ip,显然是很累的,最近我就遇到这种场景(大型的cloudstack和openstack架构不说)
想到了一个方法,就是用一台关了机的虚拟机作为模板,复制它的xml文件可以改mac地址,这样就可以通过mac地址的唯一性而在模板虚拟机中加入一个脚本来根据一个写好在虚拟机中的列表文件来设定相应的ip地址和服务器名。
这种方法要求以下步骤
1.模板虚拟机中有开机启动的脚本,该脚本会根据列表文件设定自己的ip和服务器名,并在设定后建立锁文件,以免再次重启后重新设定。
2.列表文件写在模板虚拟机中,这就限制了灵活场景的时候,只有在预先设定好的虚拟机创建场景中才有效,如果要临时添加虚拟机,并且数量不多(一两台)的时候,你还花功能去重新更新模板虚拟机中的列表文件显得很费力。
3.kvm创建的虚拟机mac地址要和模板虚拟机中的列表文件保持一致。
2. 模板虚拟机的准备
模板虚拟机需要完成的任务主要有以下
1.跟kvm创建虚拟机用的模板虚拟机路径相同
2./etc/rc.local中有相应的启动设定脚本
3.列表文件
开机启动脚本
#!/bin/bash
setting_list=“/root/setting_list”
if [ ! -f $setting_list ];then
echo “[$setting_list] not exist”
exit 1
fi
lock_file=“/root/setting_lock”
if [ -f $lock_file ];then
echo “this vm has been set.exit”
exit 0
fi
myeth0mac=`ip a|awk ‘/eth0/{getline;print}’|grep ‘link/ether’|awk ‘{print $2}’|awk -F’:’ ‘{print $4”:”$5”:”$6”}’`
myinfoline=`cat $setting_list|grep $myeth0mac`
if [ ! -f “$myinfoline” ];then
echo “sorry,can’t fine info from [$setting_list]”
exit 1
fi
myip=`echo $myinfoline|awk ‘{print $2}’`
myhostname=`echo $myinfoline|awk ‘{print $3}’`
sed -ir “s/(IPADDR=\”)[^\”]*/\1$myip/“ /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network
hostnamectl —static set-hostname $myhostname
echo “this vm has been set”>$lock_file
把以上脚本加入开机启动
echo “init_setting.sh >/root/init.log 2>&1” >>/etc/rc.local
chmod 755 /etc/rc.d/rc.local
/root/setting_list
文件示例,以下对应的为mac地址的后三位 ip 主机名
,你问mac地址怎么生成,用以下命令生成,我这边只做了三位
openssl rand -hex 3 | sed -r 's/..\B/&:/g'
4a:b7:01 xxx.xx.xx.201 vm1
71:5b:32 xxx.xx.xx.202 vm2
28:34:18 xxx.xx.xx.203 vm3
然后将该虚拟机关机,供kvm克隆使用
3. kvm批量创建虚拟机脚本
3.1 先创建列表文件
mac地址要和模板虚拟机的mac地址保持一致。对应列为虚拟机名 mac地址的后三位 cpu数 内存数(单位是G)
vm1 4a:b7:01 2 4
vm2 71:5b:32 2 4
vm3 28:34:18 2 4
3.2 然后写批量创建用的脚本
#!/bin/bash
file_exist_check () {
local filepath=$1
local filename=$2
if [ ! -f $filepath ];then
echo “$filename [$filepath] not exist”
exit 1
fi
}
vmlist=$1
file_exist_check $vm_list “vm_list”
src_path=/Virhostdir1/init_temtest.img
file_exist_check $src_path “imagesfile”
src_xml=/etc/libvirt/qemu/init_temptest.xml
file_exist_check $src_xml “xml_file”
set_xml_argus () {
newname=$1
uuid=`uuidgen`
new_path=/Virhostdir1/${newname}.qcow2
new_path_sed=“\/Virhostdir1\/${newname}.qcow2
new_xml=/etc/libvirt/qemu/${newname}.xml
}
copy_xml () {
cp $src_path $new_path
cp $src_xml $new_xml
}
change_xml () {
sed -ri “s/(<name>).*(<\/name>)/\1${newname}\2/“ $new_xml
sed -ri “s/(<uuid>).*(<\/uuid>)/\1${uuid}\2/“ $new_xml
mem_kb=$((${newmemory}*1024*1024))
sed -ri “s/(<memory.*>).*(<\/memory>)/\1${mem_kb}\2/“ $new_xml
sed -ri “s/(currentMemory.*>).*(<\/currentMemory>)/\1${mem_kb}\2/“ $new_xml
sed -ri “s/(<vcpu.*).*(<\/vcpu>)/\1${newcpu}\2/“ $new_xml
sed -ri “s/(source file=‘).*(‘\/>)/\1${new_path_sed}\2/“ $new_xml
sed -ri “s/(<mac address=‘..:..:..:).*(‘\/>)/\1${mac_addr}\2/“ $new_xml
}
define_vir () {
virsh define $new_xml
echo “vm ${newname} has been created.”
}
####
# main process
####
cat $vm_list|while read line
do
newname=`echo $line|awk ‘{print $1}’`
mac_addr=`echo $line|awk ‘{print $2}’`
newcpu=`ech $line|awk ‘{print $3}’`
newmemory=`echo $line|awk ‘{print $4}’`
set_xml_argus $newname
copy_xml
chage_xml
define_vir
done
运行方法
kvm_create_vm.sh vm_list