我在 Ubuntu 14.04 LTS 上运行 Vagrant 1.7(来自其官方 1.7 软件包),并尝试配置多个私有 VM 和一个公共 VM。我的 Ansible 配置脚本更改了所有 vagrant/root 密码,并替换了 Vagrant 原有的 SSH 密钥,以确保安全。
我的所有内部 IP 都是 10.10.20.0/24。我有一台虚拟机需要 IP 10.42.7.226(它有一个从我们真实的外部 IP 到端口 80/443 的 NAT)。
虚拟机管理程序位于 10.42.7.227,我创建了一个 br0,该 IP 连接到 eth0。我的网络配置如下:
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 10.42.7.227
netmask 255.255.255.0
network 10.42.7.0
broadcast 10.42.7.255
gateway 10.42.7.1
dns-nameservers 8.8.8.8
auto br0
iface br0 inet static
address 10.42.7.227
netmask 255.255.255.0
gateway 10.42.7.1
bridge_ports eth0
bridge_stp off
bridge_maxwait 0
bridge_fd 0
我正在远程处理这个问题,这就是为什么我害怕从 eth0 中删除 IP。我意识到 br0 应该取代它(br* 有真正的 IP,而 eth* 没有)。
在我的 Vagrent 配置中,我有一个如下块:
config.vm.define "haproxy" do |haproxy|
haproxy.vm.network :private_network, ip: 10.10.20.12
haproxy.vm.network :public_network, ip: 10.42.7.226
haproxy.vm.hostname = vars.hostname('haproxy')
haproxy.hostmanager.aliases = vars.aliases('haproxy')
haproxy.vm.provision "ansible" do |ansible|
ansible.playbook = "ansible/haproxy.yml"
end
end
但是在该虚拟机中,我只看到以下适配器:
eth0 inet addr:192.168.121.189
eth1 inet addr:10.10.20.12
eth2 inet addr:10.42.7.169 Bcast:10.42.7.255 Mask:255.255.255.0
在虚拟机管理程序上,我看到 br0 上出现以下内容:
brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0022192df5a7 no eth1
virbr0 8000.000000000000 yes
virbr1 8000.525400eda938 yes virbr1-nic
vnet0
vnet2
vnet4
vnet6
virbr2 8000.525400c3098d yes virbr2-nic
vnet1
vnet3
vnet5
vnet7
以及虚拟机管理程序针对 virbr* 设备的 ifconfig:
virbr0 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
virbr1 inet addr:192.168.121.1 Bcast:192.168.121.255 Mask:255.255.255.0
virbr2 inet addr:10.10.20.1 Bcast:10.10.20.255 Mask:255.255.255.0
看起来 libvirt/kvm 出于某种原因正在建立大约 192 个网络。我不太关心这些,但我猜我的 10.42.7.226 在 Vagrant/libvirt 配置中以某种方式转换为 10.42.7.169。
我猜我需要 libvirt 中的另一个网络?我似乎只有默认网络:
<network>
<name>default</name>
<uuid>baa4b92a-b8ee-4e2f-a31a-bb3112b51dc0</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:9d:3b:a9'/>
<ip address='10.10.20.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.20.2' end='10.10.20.254'/>
</dhcp>
</ip>
</network>
我对 libvirt 的文档有点困惑。我基本上需要我的 haproxy VM 有一个适配器,其 IP 地址为 10.42.7.226,可在连接到主机 eth0 的物理网络上访问。我需要在这个配置中做什么才能实现这一点?
答案1
当前版本vagrant-libvirt插件似乎支持使用带有 macvtap 的传统桥接器。
在您的主机上创建一个网桥,并将其用作 Vagrantfile 中的 public_network 设备。
具有主适配器 em1、dhcp 的主机:
auto em1
iface em1 inet manual
auto br0
iface br0 inet dhcp
bridge_ports em1
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Vagrant文件:
config.vm.network :public_network,
:dev => "br0",
:mode => "bridge",
:type => "bridge"
这会导致客户机拥有两个适配器 - 一个绑定到管理网络,另一个使用网桥通过 DHCP 检索 IP 地址。
答案2
对于您想要的配置,您需要让虚拟机的 NIC 使用主机上现有的网桥 br0。不幸的是vagrant-libvirt似乎不支持这种配置(它只使用 macvtap,它旨在完全接管物理接口,但在这里对你没有帮助,因为主持人无法使用该接口)。
我会联系 vagrant-libvirt 的作者并要求添加此功能。