运行 Vagrant/libvirt:尝试建立公共/私有网络

运行 Vagrant/libvirt:尝试建立公共/私有网络

我在 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 的作者并要求添加此功能。

相关内容