虚拟机怎么设置成秒换ip服务器,kvm批量创建虚拟机并自动设定ip和服务器名

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.列表文件

开机启动脚本

[root@linux-host2 ~]# cat init_setting.sh

#!/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=.*/IPADDR=$myip/" /etc/sysconfig/network-scripts/ifcfg-eth0

systemctl restart network

hostnamectl set-hostname $myhostname

echo "this vm has been set">$lock_file

把以上脚本加入开机启动

echo "/root/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批量创建虚拟机脚本

[root@localhost ~]# cat lxd/kvm3.sh

#!/bin/bash

#创建单个虚拟机(需要电脑中存在模板虚拟机)

#获取新虚拟机名称(单个创建模式)

get_newname(){

while true

do

read -p "请输入新虚拟机名称:" newname

if [ $newname ];then

break

else

echo "************"

echo "请输入姓名!"

echo "************"

fi

done

}

get_newmemary(){

while true

do

current_free_mem=`free -m|awk '/^-/{print $4}'`

mem_total=`free -g|awk '/^Mem/{print $2}'`

echo "目前本机内存总大小:${mem_total} G"

echo "当前空闲内存大小为:${current_free_mem} MB"

read -p "请输入新虚拟机内存大小(单位G):" newmemary

if [ $newmemary ];then

if [[ $newmemary -le $mem_total ]];then

break

else

echo "**********************************"

echo "输入的数值必须小于当前内存总大小!"

echo "**********************************"

fi

else

echo "********************"

echo "请输入新虚拟机内存!"

echo "********************"

fi

done

}

get_newcpu(){

while true

do

core=`cat /proc/cpuinfo| grep "processor"| wc -l`

echo "可用core个数:${core}"

read -p "请输入新虚拟机处理器核数:" newcpu

if [ $newcpu ];then

if [ $newcpu -le $core ];then

break

else

echo "******************************"

echo "不能超过可用个数或者输入错误!"

echo "******************************"

fi

else

echo "**************"

echo "输入不能为空!"

echo "**************"

fi

done

}

#设置虚拟机名称(自定义创建多个虚拟机)

set_group_name(){

#虚拟机个数

read -p "新虚拟机个数:" vir_num

free_vir=$vir_num

#功能分组

echo "**********************************************************************************"

echo "设置好组名之后,虚拟机将每组下的虚拟机自动用【组名01、组名01、组名03、...】的形式命名"

echo "**********************************************************************************"

read -p "需要分几种功能类型(大于1):" vir_type

if [ ${vir_type} -gt ${vir_num} ];then

echo "输入不符合规则!"

exit

fi

#设置名字,组名+数字

k=1

for((i=1;i<=${vir_type};i++))

do

read -p "第${i}组组名:" group[$i]

read -p "分配新虚拟机个数:" group_num_vir

#检测输入

free_vir=$((${free_vir}-${group_num_vir}))

if [ ${group_num_vir} -gt ${vir_num} ];then

echo "输入错误,超过自定义虚拟机个数!"

exit

elif [ ${free_vir} -lt $((${vir_type}-${i})) ];then

echo "分配不均,请重新分配!"

exit

fi

#记录组内虚拟机个数

for((j=1;j<=${group_num_vir};j++))

do

name_n="${group[$i]}${j}"

name[${k}]=${name_n}

k=$(($k+1))

done

done

echo "准备创建如下虚拟机:"

for((i=1;i<=${vir_num};i++))

do

echo ${name[${i}]}

done

}

#设置xml所需参数

set_xml_args_single(){

uuid=`uuidgen`

src_path=/opt/kvm/images/rh7-1.qcow2

src_xml=/etc/libvirt/qemu/master.xml

new_path=/opt/kvm/images/${newname}.qcow2

new_path_sed="\/opt\/kvm\/images\/${newname}.qcow2"

new_xml=/etc/libvirt/qemu/${newname}.xml

}

#设置xml所需参数(多个),例如:【set_xml_args ${name[${i}]} $new_memary $new_cpu】

set_xml_args(){

newname=$1

newmemary=$2

newcpu=$3

uuid=`uuidgen`

src_path=/mnt/lv2/centos7.0.qcow2

src_xml=/etc/libvirt/qemu/centos7.0.xml

new_path=/mnt/lv1/${newname}.qcow2

new_path_sed="\/mnt\/lv1\/${newname}.qcow2"

new_xml=/etc/libvirt/qemu/${newname}.xml

}

#复制模板、xml

copy_model_xml(){

cp $src_path $new_path

cp $src_xml $new_xml

}

#修改xml文件

modification_xml(){

sed -ri "s/().*()/\1${newname}\2/" $new_xml

sed -ri "s/().*()/\1${uuid}\2/" $new_xml

mem_kb=$((${newmemary}*1024*1024))

sed -ri "s/().*()/\1${mem_kb}\2/" $new_xml

sed -ri "s/().*()/\1${mem_kb}\2/" $new_xml

sed -ri "s/().*()/\1${newcpu}\2/" $new_xml

sed -ri "s/()/\1${new_path_sed}\2/" $new_xml

mac_addr=26:ce:02

sed -ri "s/()/\1${mac_addr}\2/" $new_xml

}

#define

define_vir_single(){

virsh define $new_xml

echo "**********"

echo "${newname}建完成!"

echo "**********"

}

#------------运行分界线------------------------------------

echo "1)single"

echo "2)group"

read -p "选择你的操作:" str

case $str in

single)

get_newname

get_newmemary

get_newcpu

set_xml_args_single

copy_model_xml

modification_xml

sed -ri "s/()/\1$1\2/" $new_xml

define_vir_single

;;

group)

set_group_name

get_newmemary

get_newcpu

for((i=1;i<=${vir_num};i++))

do

set_xml_args ${name[${i}]} $newmemary $newcpu

copy_model_xml

modification_xml

define_vir_single

done

;;

*)

exit

;;

esac

运行方法

bash /root/lxd/kvm3.sh e9:44:1e

mac地址要和模板虚拟机的mac地址保持一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值