Як я пов’язую каталог проектів Vagrant з існуючим VM VirtualBox?


132

Якось мій проект Vagrant відмежувався від його VirtualBox VM, так що коли я vagrant upVagrant імпортує базову скриньку і створить нову віртуальну машину.

Чи є спосіб повторно пов’язати проект Vagrant з існуючим VM? Як Vagrant внутрішньо пов'язує Vagrantfile з каталогом VM VirtualBox?

Відповіді:


89

ПОПЕРЕДЖЕННЯ . Наведене нижче рішення працює для Vagrant 1.0.x, але не Vagrant 1.1+.

Для відстеження UUID вашого VM Vagrant використовує файл. Цей файл не буде існувати, якщо VM не існує. Формат файлу - JSON. Це виглядає так, якщо існує одна ВМ:

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

default - це назва віртуальної машини за замовчуванням (якщо ви не використовуєте установки з кількома VM).

Якщо ваш VM якимось чином відключився, ви можете зробити, VBoxManage list vmsщо перелічить кожен VM, про який VirtualBox знає за своїм ім'ям та UUID. Потім вручну створіть .vagrantфайл у тому самому каталозі, що і ваш, Vagrantfileі заповніть вміст належним чином.

Біжіть, vagrant statusщоб Вагрант підхопив належні зміни.

Примітка: Вагрант офіційно не підтримується, і Vagrant може змінити формат .vagrantв будь-який час. Але це дійсно станом на Vagrant 0.9.7 і буде дійсним для Vagrant 1.0.


Дивовижно! Дякую. У мене було відчуття, що чогось не вистачає.
jrdmcgr

48
Для Vagrant 1.1 UUID зберігаються у специфічному для машини файлі за адресою .vagrant/machines/{name}/{provider}/id. Насправді єдине, що містить файл, - це UUID.

2
Я спробував цю хитрість, але бродячий статус просто повідомляє про стан як про не створене. Після цього Vagrant up створює новий vm і працює чудово. Якщо я зміню файл id, він повідомляє про не створений, навіть якщо я повертаю його назад до uuid вікна, який він тільки що створив.
Рис Марсленд

4
За допомогою Vagrant 1.1+ переконайтеся, що ви не додаєте новий рядок до кінця ідентифікатора. Детальніше дивіться на github.com/mitchellh/vagrant/isissue/1755
Mads Mobæk

1
Я шукав .vagrant у своєму профілі (Mac). Зауважте, що (принаймні для мене) він знаходився в тій самій папці, що і папка кулінарних книг та 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 з ідентифікатором вашого VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4) Збережіть файл і запустіть бродягу


8
Хороший спосіб створити idфайл без нового рядка echo -n '<your id here>' > id.
Xiong Chiamiov

1
Чудово працює. Але чому це відбувається?
JohnnyQ

Працював для мене з Vagrant 1.7.2. Дякую!
Рафен

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
box

48

Рішення з версією версії зовсім однакове.

Але спочатку потрібно запустити файл .vbox вручну, щоб він з'явився в VBoxManage list vms

Тоді ви можете перевірити, .vagrant/machines/default/virtualbox/idщоб переконатися, що uuid є правильним.


4
Крім того, варто зазначити, що якщо ви редагуєте idфайл, ви повинні зберегти його в єдиному рядку. Чомусь він не любить новий рядок наприкінці (мій текстовий редактор додає його за замовчуванням, тому у мене виникли проблеми).
Dan2552

Я зіткнувся з проблемою, тому що я перейменував папку, в якій він перебуває. Вагрант наполягав на створенні нового VM з тим самим іменем, що і папка, замість того, щоб використовувати існуючу машину віртуальної роботи. Я виправив його, створивши .vagrantфайл у форматі 1.0, і він оновив його автоматично. Як тільки я це зробив, він фактично перейменував старий VM в нове ім'я каталогу каталогу.
Йона

2
Я не впевнений, що спричинило відключення, коли мій бродячий / машини / за замовчуванням / 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.


це "дозволений_кейс" файл чи каталог?
користувач2568374

це файл, якщо ви шукаєте в ньому, ви знайдете багато речей, це стандартна штука ssh
Petecoop

Оскільки я використовував ті самі ключі, мені не довелося робити останнього налаштування (третього). Інакше дійсно добре пояснено і все ідеально.
Дазаг

Як зробити третій крок на win10?
navono

9

Оновіть цю ж проблему сьогодні з Vagrant 1.7.4:

Наприклад, з’єднати вікно 'vip-quickstart_default_1431365185830_12124' до бродячого.

$ VBoxManage list
"vip-quickstart_default_1431365185830_12124" {50feafd3-74cd-40b5-a170-3c976348de27}
$ echo -n "50feafd3-74cd-40b5-a170-3c976348de27" > .vagrant/machines/default/virtualbox/id

6

У налаштуваннях для багатьох VM це виглядатиме так:

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

Імена vm можна отримати з Vagrantfile, який використовується для створення цих віртуальних машин. Шукайте цей рядок:

config.vm.define :web do |web_config|

"web" - це ім'я vm у цьому випадку.


І db - VM за замовчуванням ??
Роберт

1
Я не думаю, що тут за замовчуванням є лише Інтернет та db. Залежно від Vagrantfile, існує порядок, яким vm спочатку будується.
agwntr

5

Я використовую Vagrant 1.8.1 на OSX El Capitan

Під час перезавантаження мого комп'ютера неправильно було закрито, тому коли я намагався, vagrant upвін завжди створював новий vm. Жодні рішення тут не працювали для мене. Але те, що вдалося, було варіантом відповіді Інгммурілло

Тож замість створення .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


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!

Ви повинні бути все налаштовані.


3

У Vagrant 1.9.1:

У мене була віртуальна машинка у віртуальній коробці під назвою '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

0

Я працював на macos і виявив, що видалення .locks на скриньках вирішило мою проблему.

З якоїсь причини

vagrant halt

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

Залишилася лише 1 незначна проблема, вона завантажилася в груб, тому мені довелося один раз натиснути клавішу Enter, не знаю, чи це залишається, але я дізнаюся досить скоро.

Я працюю бродячим 1.7.4 та virtualbox 5.0.2

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.