Назад | Перейти на главную страницу

Запуск Vagrant / libvirt: попытка установить публичные / частные сети

Я использую Vagrant 1.7 (из их официальных пакетов 1.7) на Ubuntu 14.04 LTS, и я пытаюсь предоставить несколько частных виртуальных машин и одну общедоступную. Мои сценарии подготовки Ansible изменяют все пароли vagrant / root и заменяют SSH-ключи Vagrant для обеспечения безопасности.

Все мои внутренние IP-адреса - 10.10.20.0/24. У меня есть одна виртуальная машина, которой нужен IP 10.42.7.226 (с NAT, идущим к ней с нашего реального внешнего IP для портов 80/443).

Гипервизор находится по адресу 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

Я работаю над этим удаленно, поэтому и побоялся удалить IP с eth0. Я понимаю, что 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

и ifconfig гипервизора для устройств virbr *:

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 каким-то образом преобразовался в 10.42.7.169 в рамках подготовки Vagrant / libvirt.

Полагаю, мне нужна другая сеть в 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 имела адаптер с IP-адресом 10.42.7.226, доступный в физической сети, подключенной к eth0 хост-машины. Что мне нужно сделать в этой конфигурации, чтобы это произошло?

Текущая версия бродяга-libvirt плагин, похоже, поддерживает использование обычного моста с macvtap.

Создайте мост на своем хосте и используйте его как устройство public_network в вашем Vagrantfile.

Хост с основным адаптером 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

Vagrantfile:

config.vm.network :public_network,
    :dev => "br0",
    :mode => "bridge",
    :type => "bridge"

Это приводит к тому, что у гостя есть два адаптера - один, который привязан к сети управления, другой, который использовал ваш мост для получения IP-адреса через DHCP.

Для желаемой конфигурации вам необходимо, чтобы сетевая карта виртуальной машины использовала существующий мост br0 на хосте. К сожалению бродяга-libvirt похоже, не поддерживает эту конфигурацию (он использует только macvtap, который предназначен для полного управления физическим интерфейсом и не помогает вам здесь, потому что хозяин не может использовать интерфейс).

Я бы связался с автором vagrant-libvirt и попросил добавить эту функциональность.