Статьи

Временное решение VirtualBox: сохранение бродячих изображений, которые не получают адреса NAT

В рамках тестирования и демонстрации нашей усовершенствованной платформы Deployit для автоматизации развертывания 1 мы в XebiaLabs используем множество облачных инструментов и инструментов Devops, чтобы иметь возможность обрабатывать все различные типы промежуточного программного обеспечения, которое мы поддерживаем и создаем, инструменты CI и Ops, с которыми мы интегрируемся 2 ,

Недавно я настраивал среду Vagrant 3 для демонстрации модуля Deployit Puppet, который автоматически регистрирует новое промежуточное ПО, предоставляемое Puppet, с вашей платформой автоматизации развертывания, чтобы обеспечить возможность развертывания на нем уровня приложений, и в течение довольно долгого времени боролся с хитрой проблемой VirtualBox ,

Рассматриваемая проблема существует уже более двух лет и касается DHCP-сервера VirtualBox, который иногда , пока еще не определен, не выделяет IP-адрес для интерфейса NAT.
Поскольку все образы, управляемые Vagrant, по умолчанию получают интерфейс NAT 4 , это более чем неудобно: Vagrant просто зависает на этапе настройки виртуальной машины.

Поскольку проблема не возникает детерминистически, один из способов обойти эту проблему состоит в том, чтобы просто избежать перезагрузки образа: играйте в «лотерею NAT», пока не повезет, убив процесс VBoxManage, если изображение зависает и пытается перебежать затем снова запустите vagrant suspend, а не vagrant halt, и вы сможете возобновить изображения, когда они вам понадобятся.

Это будет работать, но я не был особенно доволен этим подходом , потому что, кроме меня , не нравится идея неоднократно убивать процессы гипервизора (я несколько из пацифиста в этом отношении ;-)), она эффективна «калеки» Бродячий: легкость с помощью которого вы можете запускать, останавливать и переконфигурировать изображения — это как раз то, что делает Vagrant таким полезным!

Одна из вещей , я быстро обнаружил, что, если вы начинаете Vagrant созданный образ через VirtualBox UI и испытывает проблемы 5 , езда на велосипеде адаптер NAT с ifdown eth0 && ifup eth0 фиксирует вещи: это второй раз, он находится в состоянии забрать IP-адрес с сервера DHCP.

К сожалению, это не поможет вам с изображением, которое пытается запустить сам Vagrant: Vagrant создает сеансы без головы, поэтому вы не можете получить к ним доступ через пользовательский интерфейс VirtualBox, пока не убьете Vagrant и процесс VBoxHeadless, который он запускает.
Отредактировано 24 апреля для добавления: см . Комментарий Ричарда Пота для получения инструкций о том, как запускать блоки в режиме графического интерфейса.

К счастью, VirtualBox позволяет вам выполнять команды на гостевой ОС без использования пользовательского интерфейса с помощью команды guestcontrol VBoxManage. Поэтому, когда Vagrant снова зависал в ожидании подключения к изображению, первое, что я попробовал, было

/path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout ifdown eth0
/path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout ifup eth0

 

Это же , как хотелось бы , позволяют адаптер NAT подобрать IP — адрес. К сожалению, это также смутило Vagrant, который (предположительно полагая, что изображение отключилось) ушел.

К счастью, вам не нужно отключать адаптер, чтобы запросить новый IP-адрес: dhclient также подойдет. И действительно

/path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout dhclient

 

работает: адаптер NAT выбирает IP-адрес, и через несколько секунд Vagrant продолжает настройку образа.

Надеюсь, что-то поможет, даже если на самом деле понадобится еще пара лет, чтобы понять суть проблемы ;-)

Сноски

  1. Или Автоматизация выпуска приложений (ARA), если вы следуете Gartner
  2. Проверьте страницу поддержки платформы для деталей
  3. Для тех, кто не знаком с Vagrant , это мощный инструмент (написанный на Ruby), который позволяет определять несколько связанных виртуальных образов на основе шаблонов, называемых «коробками». Vagrant организует взаимодействие с VirtualBox, чтобы дать вам очень простой способ остановки, запуска и настройки кластера изображений. В этом смысле он немного освещен CloudFormation на основе VirtualBox .
  4. Вот как Vagrant общается с изображением во время его настройки
  5. Вы будете знать, потому что ifconfig покажет, что у адаптера eth0 нет адреса IPv4