Публичный статический IP только для Vagrantfile.

Вопрос или проблема

Я изменил Vagrantfile для taiga-vagrant на основе VAGRANT DOCS/Public Networks следующим образом:

# -*- mode: ruby -*-
# vi: set ft=ruby :
require "./source.rb"

ROOT_PATH = File.dirname(__FILE__)

VAGRANTFILE_API_VERSION = "2"

def configure_extra(config)
end

def configure(config)
  config.vm.box = "trusty64"
  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"

  # Отключить автоматическую проверку обновлений коробки. Если вы отключите это,
  # коробки будут проверяться на обновления только тогда, когда пользователь запустит
  # `vagrant box outdated`. Это не рекомендуется.
  # config.vm.box_check_update = false

  # Имя хоста
  config.vm.hostname = "taiga"

  # Создать сопоставление перенаправленного порта, которое позволяет получить доступ к определенному порту
  # внутри машины с порта на хост-машине.
  config.vm.network :forwarded_port, host: 8000, guest: 8000
  config.vm.network :forwarded_port, host: 9001, guest: 9001

  # Создать общую сеть, которая обычно соответствует мостовой сети.
  # Мостовые сети делают машину видимой как другое физическое устройство в
  # вашей сети.
  config.vm.network "public_network", autoconfig: false

  config.vm.provision "fix-no-tty", type: "shell" do |s|
        s.privileged = false
        s.inline = "sudo sed -i '/tty/!s/mesg n/tty -s \\&\\& mesg n/' /root/.profile"
  end

  # статический ip
  config.vm.provision "shell",
    run: "always",
    inline: "ifconfig eth1 xxx.yyy.zzz.153 netmask 255.255.255.0 up"

  # статический ipv6
  config.vm.provision "shell",
    run: "always",
    inline: "ifconfig eth1 inet6 add fc00::17/7"

  # маршрут по умолчанию
  config.vm.provision "shell",
    run: "always",
    inline: "route add default gw xxx.yyy.zzz.132"

  # маршрут по умолчанию ipv6
  config.vm.provision "shell",
    run: "always",
    inline: "route -A inet6 add default gw fc00::1 eth1"

# удалить маршрут по умолчанию на eth0
  config.vm.provision "shell",
    run: "always",
    inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"

  # Если true, то любые SSH-соединения будут позволять пересылку агента.
  # Значение по умолчанию: false
  config.ssh.forward_agent = true

  # Поделиться дополнительной папкой с гостевой ВМ. Первый аргумент —
  # путь на хосте к самой папке. Второй аргумент —
  # путь на госте для монтирования папки. А необязательный третий
  # аргумент — набор не обязательных опций.
  config.vm.synced_folder "./data", "/home/vagrant/data"

  # Конфигурация, специфичная для провайдера, чтобы вы могли настроить различные
  # задние провайдеры для Vagrant. Они предоставляют специфические для провайдера опции.
  config.vm.provider "virtualbox" do |vb|
    # Запуск в безголовом режиме
    vb.gui = false

    host = RbConfig::CONFIG['host_os']

    # Отдает четверть системной памяти ВМ и доступ ко всем доступным ядрам ЦП
    if host =~ /darwin/
      cpus = `sysctl -n hw.ncpu`.to_i
      # sysctl возвращает байты, конвертируя в МБ...
      mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 4
    elsif host =~ /linux/
      cpus = `nproc`.to_i
      # meminfo возвращает КБ, конвертируя в МБ...
      mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4
    else
      # жестко задаем значения для windows...
      cpus = 2
      mem = 2048
    end

    vb.customize ["modifyvm", :id, "--memory", mem]
    vb.customize ["modifyvm", :id, "--cpus", cpus]
  end

  # Обеспечение
  config.vm.provision "shell" do |shell|
    vagrant_shell_scripts_configure(
      shell,
      File.join(ROOT_PATH, "scripts"),
      "provision.sh",
      {}
    )
  end
end

# Ищем Vagrantfile.local для загрузки
local_vagrantfile = "#{__FILE__}.local"
if File.exists?(local_vagrantfile)
  eval File.read(local_vagrantfile)
end

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  configure config
  configure_extra config
end

После vagrant up меня спрашивают “К какому интерфейсу следует подключить мост сети?”. После выбора 1 (для eth0) виртуальная машина VirtualBox запускается нормально, и я могу подключиться через ssh. Настройки сетевых интерфейсов этой ВМ:

eth0      Link encap:Ethernet  HWaddr 08:00:27:70:2a:9d  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe70:2a9d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1462 errors:0 dropped:0 overruns:0 frame:0
          TX packets:968 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:151879 (151.8 KB)  TX bytes:122611 (122.6 KB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:2e:e8:7f  
          inet addr:xxx.yyy.zzz.153  Bcast:xxx.yyy.zzz.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe2e:e87f/64 Scope:Link
          inet6 addr: fc00::17/7 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1335 errors:0 dropped:0 overruns:0 frame:0
          TX packets:683 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1078620 (1.0 MB)  TX bytes:85690 (85.6 KB)

Небольшое обновление

Во время запуска появляется несколько сообщений

default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    ...

В конце концов, машина запускается. Я могу получить доступ к taiga из внешнего интернета. Но, необходимо ли иметь оба этих интерфейса? Разве я не могу иметь только статический публичный IP для eth0?

Пост на https://github.com/mitchellh/vagrant/pull/1745#issuecomment-33159374 оказался полезным. Следующая строка решила проблему!

config.vm.network "public_network", :bridge => "eth0", ip: "xxx.yyy.zzz.153", :netmask => "255.255.255.128", auto_config: false

Ответ или решение

Использование статического публичного IP-адреса только для eth0 в Vagrantfile

При работе с Vagrant и настройке сетевого взаимодействия виртуальных машин важно правильно сконфигурировать сетевые интерфейсы согласно требованиям вашего проекта. В вашем случае, вы хотите настроить статический публичный IP-адрес только для интерфейса eth0, вместо того чтобы использовать два интерфейса (eth0 и eth1). В данном ответе мы разберем, как это можно реализовать в вашем Vagrantfile, а также проанализируем дополнительные аспекты настройки.

Основные параметры конфигурации

Ваш исходный конфигурационный файл Vagrantfile включает в себя создание public_network, что позволяет виртуальной машине (VM) подключаться к вашей физической сети. Однако для достижения вашей цели требуется внести некоторые изменения. Вместо создания public_network, необходимо указать параметры непосредственно для интерфейса eth0.

Изменение Vagrantfile

Чтобы настроить статический IP-адрес только для интерфейса eth0, вам нужно внести следующие изменения. Замените секцию с конфигурацией сети на следующую:

# Создайте публичную сеть, которая будет привязана к eth0
config.vm.network "public_network", bridge: "eth0", ip: "xxx.yyy.zzz.153", netmask: "255.255.255.128", auto_config: false

Обратите внимание, что в этом коде мы указываем интерфейс eth0, присваиваем публичный IP-адрес, а также задаем маску подсети. Параметр auto_config: false отключает автоматическую конфигурацию, что позволяет вам самостоятельно управлять настройками сети.

Удаление лишнего интерфейса

Если вы намерены использовать только eth0 для публичного IP, вам следует исключить все упоминания и конфигурации для eth1. Это облегчит вашу сетевую конфигурацию, а также устранит возможные конфликты.

Проблемы с подключением

Как вы упомянули в своем вопросе, вы столкнулись с предупреждениями о таймауте соединения. Это может быть связано с неправильной настройкой сети или задержками в конфигурации самой системы. Запуск vagrant up может занять больше времени при установке сетевых компонентов; если проблема повторяется, стоит проверить следующие параметры:

  1. Проверка сетевых интерфейсов на хосте: Убедитесь, что выбранный интерфейс eth0 доступен для использования и корректно подключен к сети.
  2. Firewall и NAT: Проверьте настройки брандмауэра и NAT вашего хостовой системы, которые могут блокировать соединения.
  3. Параметры конфигурации: Обновите все временные метки и конфигурации сетевых скриптов, чтобы исправить возможные задержки.

Заключение

В итоге, если ваша цель состоит в том, чтобы использовать исключительно один интерфейс с публичным IP-адресом в Vagrant, внесение изменений в конфигурацию Vagrantfile, как обсуждено выше, позволит вам это сделать. Удаление ненужного интерфейса улучшит управляемость и уменьшит вероятность возникновения проблем при запуске виртуальной машины.

Эти изменения не только очищают ваш код, но и делают вашу среду более предсказуемой и менее подверженной ошибкам. Таким образом, вы получите более стабильное и быстрое подключение к вашей виртуальной машине, что, в свою очередь, повысит продуктивность работы с проектом Taiga.

Если у вас возникнут дополнительные вопросы по настройке Vagrant или другим аспектам виртуализации, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...