秒级快速批量创建kvm虚拟机并指定IP地址和主机名

1. 说明

kvm比起vmware来说最没有的功能就是用模板部署虚拟机的时候可以自定义ip地址,这对于大量创建vm的场景来说你需要一台台vnc的登录改动ip,显然是很累的,最近我就遇到这种场景(大型的cloudstack和openstack架构不说)

想到了一个方法,就是用一台关了机的虚拟机作为模板,复制它的xml文件可以改mac地址,这样就可以通过mac地址的唯一性而在模板虚拟机中加入一个脚本来根据一个写好在虚拟机中的列表文件来设定相应的ip地址和服务器名。

这种方法要求以下步骤

1.模板虚拟机中有开机启动的脚本,该脚本会根据列表文件设定自己的ip和服务器名,并在设定后建立锁文件,以免再次重启后重新设定。
2.列表文件写在模板虚拟机中,这就限制了灵活场景的时候,只有在预先设定好的虚拟机创建场景中才有效,如果要临时添加虚拟机,并且数量不多(一两台)的时候,你还花功能去重新更新模板虚拟机中的列表文件显得很费力。
3.kvm创建的虚拟机mac地址要和模板虚拟机中的列表文件保持一致。
4.采用后端盘的技术写时拷贝,可以秒级的创建出虚拟机

2. 模板虚拟机的准备

模板虚拟机需要完成的任务主要有以下
1.跟kvm创建虚拟机用的模板虚拟机路径相同
2./etc/rc.local中有相应的启动设定脚本
3.列表文件

开机启动脚本

#!/bin/bash

setting_list="/root/.init_ip_hostname/setting_list"
if [ ! -f $setting_list ];then
  echo "[$setting_list] not exist"
  exit 1
fi
lock_file="/root/.init_ip_hostname/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 [ ! -n "$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 -ri "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 '/root/.init_ip_hostname/init_setting.sh > /root/.init_ip_hostname/init.log 2>&1' >>/etc/rc.local

chmod 755 /etc/rc.d/rc.local

/root/.init_ip_hostname/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

服务器和客户端创建mac列表的脚本如下

#!/bin/bash
for i in {2..254}
do
ip_add=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
#local_list在主机上用
echo "vm${i}  ${ip_add} 1 1" >> local_list
#vm_list要拷贝到要创建的虚拟机后端盘上
echo "${ip_add} 192.168.122.${i} vm${i}" >> vm_list
done
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
}

vm_list=$1
file_exist_check $vm_list "vm_list"
#必须是绝对路径
src_path=/var/lib/libvirt/images/centos_base01.qcow2

#必须是绝对路径
src_xml=/var/lib/libvirt/images/centos_base01.xml

set_xml_argus () {
newname=$1
uuid=`uuidgen`
new_path=/var/lib/libvirt/images/${newname}.qcow2
new_path_sed="\/var\/lib\/libvirt\/images\/${newname}.qcow2"
new_xml=/etc/libvirt/qemu/${newname}.xml
}

copy_xml () {
#采用后端盘的方式秒级的创建出虚拟机
qemu-img create -b $src_path -f qcow2 $new_path 50G
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
virsh start ${newname}
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=`echo $line|awk '{print $3}'`
  newmemory=`echo $line|awk '{print $4}'`
  set_xml_argus $newname
  copy_xml
  change_xml
  define_vir
  done

运行方法

kvm_create_vm.sh vm_list
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KVM 宿主机下创建虚拟机,可以使用桥接模式、NAT 模式或者直接连接宿主机物理网卡的模式来进行网络配置。以下是在 Linux KVM 宿主机下创建虚拟机的网络配置方法: 1. 桥接模式 桥接模式可以使虚拟机直接通过宿主机的物理网卡连接到网络,可以使虚拟机获得独立的 IP 地址。具体步骤如下: 1. 在宿主机上创建一个虚拟网桥,使用以下命令: ``` brctl addbr br0 ifconfig br0 up ``` 2. 将宿主机的物理网卡连接到虚拟网桥,使用以下命令: ``` brctl addif br0 eth0 ``` 其中,`eth0` 是宿主机的物理网卡名称。 3. 在虚拟机中,指定网络接口为桥接模式,使用以下命令: ``` virsh edit <vm-name> ``` 在 XML 配置文件中添加以下内容: ``` <interface type='bridge'> <mac address='52:54:00:xx:xx:xx'/> <source bridge='br0'/> <model type='virtio'/> </interface> ``` 其中,`<mac address='52:54:00:xx:xx:xx'/>` 是虚拟机的 MAC 地址,`<source bridge='br0'/>` 是连接到虚拟网桥 `br0`。 4. 在虚拟机中配置 IP 地址和网关,使用以下命令: ``` sudo ip addr add <ip-address>/<netmask> dev eth0 sudo ip route add default via <gateway-ip-address> ``` 其中,`<ip-address>` 是虚拟机的 IP 地址,`<netmask>` 是虚拟机的子网掩码,`<gateway-ip-address>` 是宿主机的 IP 地址。 2. NAT 模式 NAT 模式可以使虚拟机通过宿主机的 IP 地址访问网络,但无法直接从外部访问虚拟机。具体步骤如下: 1. 在虚拟机中,指定网络接口为 NAT 模式,使用以下命令: ``` virsh edit <vm-name> ``` 在 XML 配置文件中添加以下内容: ``` <interface type='network'> <mac address='52:54:00:xx:xx:xx'/> <source network='default'/> <model type='virtio'/> </interface> ``` 其中,`<mac address='52:54:00:xx:xx:xx'/>` 是虚拟机的 MAC 地址。 2. 在虚拟机中配置 IP 地址和网关,使用以下命令: ``` sudo ip addr add <ip-address>/<netmask> dev eth0 sudo ip route add default via <gateway-ip-address> ``` 其中,`<ip-address>` 是虚拟机的 IP 地址,`<netmask>` 是虚拟机的子网掩码,`<gateway-ip-address>` 是宿主机的 IP 地址。 3. 直接连接物理网卡模式 直接连接物理网卡模式可以使虚拟机通过宿主机的物理网卡访问网络,但需要在虚拟机中手动配置 IP 地址和网关。具体步骤如下: 1. 在虚拟机中,指定网络接口为直接连接物理网卡模式,使用以下命令: ``` virsh edit <vm-name> ``` 在 XML 配置文件中添加以下内容: ``` <interface type='direct'> <mac address='52:54:00:xx:xx:xx'/> <source dev='eth0'/> <model type='virtio'/> </interface> ``` 其中,`<mac address='52:54:00:xx:xx:xx'/>` 是虚拟机的 MAC 地址,`<source dev='eth0'/>` 是连接到宿主机的物理网卡。 2. 在虚拟机中手动配置 IP 地址和网关,使用以下命令: ``` sudo ip addr add <ip-address>/<netmask> dev eth0 sudo ip route add default via <gateway-ip-address> ``` 其中,`<ip-address>` 是虚拟机的 IP 地址,`<netmask>` 是虚拟机的子网掩码,`<gateway-ip-address>` 是宿主机的 IP 地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值