脚本如下
#!/usr/bin/env bash
[[ -n $DEBUG ]] && set -x
set -eou pipefail
useage(){
cat <<"EOF"
USAGE:
vminit BOX NAME START END MEM CPU IPBASE [DISKS...]
eg:
vminit centos-7-1905.1-libvirt demohost 192.168.50 2 10 2 2048 20G 10G
EOF
}
exit_err() {
echo >&2 "${1}"
exit 1
}
if [ $# -lt 7 ];then
useage
exit 1
fi
BOX=$1
NAME=$2
IPBASE=$3
START=$4
END=$5
CPU=$6
MEM=$7
shift 7
DISKS=$@
mkdir -p "${NAME}"
cd "${NAME}"
net_exists=0
for net in $(virsh net-list --all --name | xargs -r ); do
if [[ x"$NAME" == x"$net" ]];then
net_exists=1
fi
done
ip2mac(){
local MAC=$1
local IP=$2
for index in {1..4}; do
ipi=$(echo "${IP}" | cut -d "." -f "${index}")
maci=$(echo "obase=16;${ipi}" | bc)
MAC="${MAC}"':'"${maci}"
done
echo "${MAC}"
}
if [[ $net_exists -eq 0 ]];then
cat >network.xml <<EOF
<network ipv6="yes">
<name>${NAME}</name>
<forward mode="nat">
<nat>
<port start="1024" end="65535"/>
</nat>
</forward>
<bridge name="${NAME}br" stp="on" delay="0"/>
<ip address="${IPBASE}.1" netmask="255.255.255.0">
<dhcp>
<range start="${IPBASE}.2" end="${IPBASE}.254"/>
EOF
for ((i=2;i<=254;i++)); do
IP="${IPBASE}.$i"
MAC=$(ip2mac "50:50" "${IP}")
cat >>network.xml <<EOF
<host mac="${MAC}" ip="${IP}"/>
EOF
done
cat >>network.xml <<EOF
</dhcp>
</ip>
</network>
EOF
virsh net-define --file ./network.xml
fi
cat >Vagrantfile <<EOF
# -*- mode: ruby -*-
# vi: set ft=ruby :
def ip2mac(prefix, str_ip)
@mac=prefix
str_ip.split('.').each do |k|
k="%02x" % k
@mac=@mac+":"+k.to_s
end
return @mac
end
Vagrant.configure("2") do |config|
(${START}..${END}).each do |i|
config.vm.define "$NAME#{i}" do |node|
# node.ssh.username = 'root'
# node.ssh.password = 'vagrant'
node.ssh.insert_key = true
node.vm.box = '${BOX}'
node.vm.synced_folder '.', '/vagrant', disabled: true
node.vm.provider :libvirt do |domain|
domain.driver = 'kvm'
domain.memory = ${MEM}
domain.cpus = ${CPU}
domain.nested = true
domain.management_network_name = "${NAME}"
domain.management_network_address = "${IPBASE}.0/24"
domain.management_network_mac = ip2mac("50:50","${IPBASE}.#{i}")
EOF
for DISK in ${DISKS};do
cat >>Vagrantfile <<EOF
domain.storage :file, :size => '${DISK}', :bus => 'virtio'
EOF
done
cat >>Vagrantfile <<EOF
end
node.vm.provision :shell, :path => 'provision.sh'
end
end
end
EOF
cat >provision.sh <<EOFF
#!/bin/bash
sed -ri 's/^PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
cat >>/etc/ssh/sshd_config <<EOF
PermitRootLogin yes
UseDNS no
systemctl restart sshd
EOF
EOFF
vagrant up
使用方法
使用vmbox(见https://www.cnblogs.com/futuretea/p/12009678.html)快速下载centos-7-1905.1-libvirt.box
vmbox centos 7 1905.1 libvirt
vagrant box add centos-7-1905.1-libvirt.box centos-7-1905.1-libvirt
以centos-7-1905.1-libvirt为基础box
定义了一个名为demohost的网络(默认的vagrant-libvirt网络ip为dhcp分配,demohost的网络加了mac地址绑定)
在demohost网络内创建了ip为192.168.50.10~192.168.50.19的10台虚拟机
每台虚拟机,2核cpu,2G内存,除了系统盘外额外添加两块硬盘,一块20G,一块10G
vminit centos-7-1905.1-libvirt demohost 192.168.50 10 19 2 2048 20G 10G
效果
❯ vagrant status
Current machine states:
demohost10 running (libvirt)
demohost11 running (libvirt)
demohost12 running (libvirt)
demohost13 running (libvirt)
demohost14 running (libvirt)
demohost15 running (libvirt)
demohost16 running (libvirt)
demohost17 running (libvirt)
demohost18 running (libvirt)
demohost19 running (libvirt)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
took 4s
❯ vagrant ssh demohost10
[vagrant@localhost ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 50:50:c0:a8:32:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.50.10/24 brd 192.168.50.255 scope global noprefixroute dynamic eth0
valid_lft 2790sec preferred_lft 2790sec
inet6 fe80::5250:c0ff:fea8:320a/64 scope link
valid_lft forever preferred_lft forever
没有多余的默认网卡,当然如果你想定义多网卡也是可以的,详见vagrant-libvirt文档