Как связать каталог проекта Vagrant с существующей виртуальной машиной VirtualBox?

132

Каким-то образом мой проект Vagrant отсоединился от vagrant upвиртуальной машины VirtualBox, так что когда я сделаю это, Vagrant импортирует базовый блок и создаст новую виртуальную машину.

Есть ли способ повторно связать проект Vagrant с существующей виртуальной машиной? Как Vagrant внутренне связывает Vagrantfile с виртуальным каталогом VirtualBox?

jrdmcgr
источник

Ответы:

89

ВНИМАНИЕ: Решение ниже работает для Vagrant 1.0.x, но не для Vagrant 1.1+.

Vagrant использует файл ".vagrant" в том же каталоге, что и ваш "Vagrantfile", чтобы отслеживать UUID вашей виртуальной машины. Этот файл не будет существовать, если виртуальная машина не существует. Формат файла - JSON. Это выглядит так, если существует одна виртуальная машина:

{
   "active":{
      "default":"02f8b71c-75c6-4f33-a161-0f46a0665ab6"
   }
}

default имя виртуальной машины по умолчанию (если вы не используете настройки нескольких виртуальных машин).

Если ваша виртуальная машина каким-то образом стала диссоциированной, то вы можете сделать, VBoxManage list vmsчтобы перечислить каждую виртуальную машину, о которой VirtualBox знает по ее имени и UUID. Затем вручную создайте .vagrantфайл в том же каталоге, что и ваш, Vagrantfileи заполните его правильно.

Беги, vagrant statusчтобы убедиться, что Вагрант подобрал правильные изменения.

Примечание: это официально не поддерживается Vagrant, и Vagrant может изменить формат .vagrantв любое время. Но это действительно для Vagrant 0.9.7 и будет действовать для Vagrant 1.0.

Mitchell
источник
Потрясающие! Спасибо. У меня было чувство, что чего-то не хватает.
jrdmcgr
48
Для Vagrant 1.1 UUID хранятся в машинно-зависимом файле по адресу .vagrant/machines/{name}/{provider}/id. Фактически, единственное, что содержится в файле - это UUID.
2
Я попробовал этот трюк, но бродячий статус просто сообщает о том, что состояние не создано. Затем Vagrant создает новый виртуальный компьютер и работает нормально. Если я изменяю файл идентификатора, он сообщает о том, что он не создан, даже если я изменяю его на uuid только что созданного ящика.
Рис Марсланд
4
С Vagrant 1.1+ убедитесь, что вы не добавляете перевод строки в конец идентификатора. См github.com/mitchellh/vagrant/issues/1755 подробности
Мадс Mobæk
1
Я искал .vagrant в своем профиле (Mac). Обратите внимание, что (по крайней мере для меня) он находился в той же папке, что и папка cookbooks и VagrantFile. (Vagrant версия 1.4.3)
allicarn
208

Для Vagrant 1.6.3 сделайте следующее:

1) В каталоге, где находится ваш Vagrantfile, выполните команду

VBoxManage list vms

У вас будет что-то вроде этого:

"virtualMachine" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

2) Перейти по следующему пути:

cd .vagrant/machines/default/virtualbox

3) Создайте файл с именем id с идентификатором вашей виртуальной машины xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4) Сохраните файл и запустите vagrant up

ingmmurillo
источник
8
Хороший способ создать idфайл без новой строки - echo -n '<your id here>' > id.
Xiong Chiamiov
1
Прекрасно работает. Но почему это происходит?
JohnnyQ
У меня работал с Vagrant 1.7.2. Спасибо!
Rafen
1
Работал отлично.
Кейси Робинсон
Ящики # test1 и test2 ...for box in test1 test2; do virtualboxid=$(VBoxManage list vms | grep $box | cut -d' ' -f2); echo -n $virtualboxid > .vagrant/machines/$box/virtualbox/id; done
luismartingil 02
48

То же самое и с верхней версией.

Но сначала нужно вручную запустить файл .vbox, чтобы он появился в VBoxManage list vms

Затем вы можете проверить, .vagrant/machines/default/virtualbox/idчто uuid правильный.

Natim
источник
4
Также стоит отметить, что если вы редактируете idфайл, вы должны сохранить его в одной строке. По какой-то причине ему не нравится новая строка в конце (мой текстовый редактор добавляет ее по умолчанию, поэтому у меня возникли проблемы).
Dan2552
У меня возникла проблема с этим, потому что я переименовал папку, в которой она находилась. Бродяга настаивал на создании новой виртуальной машины с тем же именем, что и папка, вместо использования существующей виртуальной машины. Я исправил это, создав .vagrantфайл в формате 1.0, и он обновил его автоматически. Как только я это сделал, он фактически переименовал старую виртуальную машину в новое имя каталога проекта.
Иона
2
Я не уверен, что вызвало отключение, когда мой vagrant / machines / default / virtualbox / id указывал на неправильный идентификатор машины VirtualBox. Файл, который помог, был $ HOME / .VirtualBox / VirtualBox.xml. В нем есть раздел MachineRegistry, в котором UUID машины VirtualBox сопоставлены с именами машин. Например, <MachineEntry uuid = "{f232f951-103b-af28-9f8d-b2ab21bs258f}" src = "$ HOME / VirtualBox VMs \ <machine-name> \ <machine-name> .vbox" />
arntg
14

Возникла проблема сегодня, моя .vagrantпапка отсутствовала, и было обнаружено, что есть еще несколько шагов, чем просто установка идентификатора:

  1. Установите идентификатор:

    VBoxManage list vms
    

    Найдите идентификатор и установите его {project-folder}/.vagrant/machines/default/virtualbox/id.

    Обратите внимание, что это defaultможет быть иначе, если установлено в вашем, Vagrantfileнапример config.vm.define "someothername".

  2. Остановите машину от подготовки:

    Создайте файл с именем action_provisionв том же idкаталоге, что и файл, установите его содержимое на: 1.5:{id}заменив {id}на идентификатор, найденный на шаге 1.

  3. Установите новый открытый / закрытый ключ:

    Vagrant использует закрытый ключ, хранящийся в .vagrant/machines/default/virtualbox/private_keyssh на машине. Вам нужно будет создать новый.

    ssh-keygen -t rsa
    

    назовите это private_key.

    vagrant sshзатем скопируйте private_key.pubв /home/vagrant/.ssh/authorized_keys.

Petecoop
источник
"authorized_keys" - это файл или каталог?
user2568374
это файл, если вы
Petecoop
Поскольку я использовал те же ключи, мне не нужно было делать последний сет (третий). В остальном действительно хорошо объяснено и все идеально.
Dazag
Как сделать третий шаг на win10?
navono
9

Обновление с той же проблемой сегодня с Vagrant 1.7.4:

Например, чтобы связать поле vip-quickstart_default_1431365185830_12124 с vagrant.

$ VBoxManage list
"vip-quickstart_default_1431365185830_12124" {50feafd3-74cd-40b5-a170-3c976348de27}
$ echo -n "50feafd3-74cd-40b5-a170-3c976348de27" > .vagrant/machines/default/virtualbox/id
eton_ceb
источник
6

Для установок с несколькими виртуальными машинами это будет выглядеть так:

{
   "active":{
        "web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d",
        "db":"13503bc5-76b8-4c26-95c4-32435b372212"
   }
}

Вы можете получить имена виртуальных машин из Vagrantfile, используемого для создания этих виртуальных машин. Посмотрите на эту строку:

config.vm.define :web do |web_config|

"web" - это имя виртуальной машины в данном случае.

agwntr
источник
А db - это виртуальная машина по умолчанию ??
Роберт
1
Я не думаю, что здесь есть значение по умолчанию, просто web и db. В зависимости от Vagrantfile существует порядок, в котором vm создается первой.
agwntr
5

Я использую Vagrant 1.8.1 на OSX El Capitan

Моя виртуальная машина не была правильно закрыта при перезагрузке компьютера, поэтому, когда я пытался, vagrant upона всегда создавала новую виртуальную машину. Никакие решения здесь не работали для меня. Но что сработало, так это вариант ответа Ингммурилло

Поэтому вместо создания .vagrant/machines/default/virtualbox/idна основе идентификатора из запущенного VBoxManage list vms. Мне пришлось обновить идентификатор в.vagrant/machines/local/virtual_box/id

У меня есть один лайнер, который, по сути, делает это за меня:

echo -n `VBoxManage list vms | head -n 1 | awk '{print substr($2, 2, length($2)-2)}'` > .vagrant/machines/local/virtualbox/id

Предполагается, что первое окно - это то, что мне нужно, чтобы запустить VBoxManage list vms

Brendan
источник
4

Это изменено из ответа @ Petecoop .

Запустите, vagrant haltесли вы еще не выключили коробку.

Затем перечислите свои виртуальные боксы: VBoxManage list vms

В нем будут перечислены все ваши виртуальные боксы. Найдите ящик , который вы хотите вернуться к и захватить идентификатор между фигурными скобками: {}.

Затем отредактируйте файл идентификатора проекта: sudo nano .vagrant/machines/default/virtualbox/id(из каталога проекта)

Замените его идентификатором, который вы скопировали из списка VB.

Попробуй vagrant reload.

Если это не работает и зависает при авторизации SSH (где я споткнулся), скопируйте незащищенный открытый ключ из бродячего git . Заменить содержимое /.vagrant/machines/default/virtualbox/private_key. Резервное копирование оригинала конечно: cp private_key private_key-bak.

Тогда беги vagrant reload . Он скажет, что идентифицировал небезопасный ключ, и создаст новый.

default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!

У вас должно быть все готово.

ethicka
источник
3

В Vagrant 1.9.1:

У меня была виртуальная машина в Virtual Box с именем Ubuntu 16.04.1, поэтому я упаковал ее как бродячую коробку с:

vagrant package --base "Ubuntu 16.04.1"

отвечает ...

==> Ubuntu 16.04.1: Exporting VM...
==> Ubuntu 16.04.1: Compressing package to: blah blah/package.box
PeterVermont
источник
0

Я использую macos и обнаружил, что удаление .locks на ящиках решило мою проблему.

По какой-то причине

vagrant halt

не снимал эти блокировки, и после восстановления всех моих настроек в .vagrant / machine / default / virtualbox с помощью timemachine, сняв блокировки, загрузилась правая машина.

Осталась только одна небольшая проблема. Она загрузилась в grub, поэтому мне пришлось нажать клавишу ввода один раз, не знаю, остается ли это, но я узнаю достаточно скоро.

Я использую vagrant 1.7.4 и virtualbox 5.0.2

dmaij
источник