Я использую 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 и попросил добавить эту функциональность.