Jak powiązać katalog projektu Vagrant z istniejącą maszyną wirtualną VirtualBox?

133

W jakiś sposób mój projekt Vagrant odłączył się od swojej maszyny wirtualnej VirtualBox, więc kiedy vagrant upVagrant zaimportuje skrzynkę bazową i utworzy nową maszynę wirtualną.

Czy istnieje sposób na ponowne powiązanie projektu Vagrant z istniejącą maszyną wirtualną? W jaki sposób Vagrant wewnętrznie kojarzy plik Vagrantfile z katalogiem VirtualBox VM?

jrdmcgr
źródło

Odpowiedzi:

90

OSTRZEŻENIE: Poniższe rozwiązanie działa dla Vagrant 1.0.x, ale nie Vagrant 1.1+.

Vagrant używa pliku „.vagrant” w tym samym katalogu co „Vagrantfile” do śledzenia UUID maszyny wirtualnej. Ten plik nie będzie istniał, jeśli nie istnieje maszyna wirtualna. Format pliku to JSON. Wygląda to tak, jeśli istnieje jedna maszyna wirtualna:

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

default to nazwa domyślnej maszyny wirtualnej (jeśli nie używasz konfiguracji z wieloma maszynami wirtualnymi).

Jeśli Twoja maszyna wirtualna została w jakiś sposób odłączona, możesz zrobić, aby VBoxManage list vmswyświetlić listę wszystkich maszyn wirtualnych, o których VirtualBox wie po nazwie i identyfikatorze UUID. Następnie ręcznie utwórz .vagrantplik w tym samym katalogu co Twój Vagrantfilei odpowiednio uzupełnij jego zawartość.

Biegnij, vagrant statusaby upewnić się, że Vagrant odebrał właściwe zmiany.

Uwaga: nie jest to oficjalnie obsługiwane przez Vagrant i Vagrant może zmienić format .vagrantw dowolnym momencie. Ale jest to ważne od wersji Vagrant 0.9.7 i będzie ważne dla Vagrant 1.0.

Mitchell
źródło
Niesamowite! Dziękuję Ci. Czułem, że czegoś brakuje.
jrdmcgr
48
W przypadku Vagrant 1.1 identyfikatory UUID są przechowywane w pliku specyficznym dla komputera pod adresem .vagrant/machines/{name}/{provider}/id. W rzeczywistości jedyne, co zawiera plik, to identyfikator UUID.
2
Wypróbowałem tę sztuczkę, ale status włóczęgi po prostu informuje, że stan nie został utworzony. Vagrant up tworzy następnie nową maszynę wirtualną i działa dobrze. Jeśli zmienię plik id, zgłosi go jako nieutworzony, nawet jeśli zmienię go z powrotem na identyfikator UUID właśnie utworzonego pudełka.
Reece Marsland
4
W przypadku Vagrant 1.1+ upewnij się, że nie dodajesz nowej linii na końcu identyfikatora. Zobacz github.com/mitchellh/vagrant/issues/1755 do szczegółów
Mads Mobæk
1
Szukałem domeny .vagrant w moim profilu (Mac). Zwróć uwagę, że (przynajmniej dla mnie) znajdował się on w tym samym folderze, co folder książek kucharskich i VagrantFile. (Wersja Vagrant 1.4.3)
allicarn
208

W przypadku Vagrant 1.6.3 wykonaj następujące czynności:

1) W katalogu, w którym znajduje się plik Vagrantfile, uruchom polecenie

VBoxManage list vms

Będziesz miał coś takiego:

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

2) Przejdź do następującej ścieżki:

cd .vagrant/machines/default/virtualbox

3) Utwórz plik o nazwie id z identyfikatorem maszyny wirtualnej xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4) Zapisz plik i uruchom włóczęgę

ingmmurillo
źródło
8
Dobrym sposobem na utworzenie idpliku bez znaku nowej linii jest echo -n '<your id here>' > id.
Xiong Chiamiov
1
Działa świetnie. Ale dlaczego tak się dzieje?
JohnnyQ
Pracował dla mnie z Vagrantem 1.7.2. Dzięki!
Rafen
1
Działał doskonale.
Casey Robinson
Pudełka # test1 i 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
48

Rozwiązanie z wersją wyższą jest takie samo.

Ale najpierw musisz ręcznie uruchomić plik .vbox, aby pojawił się w VBoxManage list vms

Następnie możesz .vagrant/machines/default/virtualbox/idsprawdzić, czy uuid jest właściwy.

Natim
źródło
4
Warto również zauważyć, że jeśli edytujesz idplik, musisz trzymać go w jednej linii. Z jakiegoś powodu nie lubi znaku nowej linii na końcu (mój edytor tekstu dodaje go domyślnie, więc miałem problemy).
Dan2552,
Napotkałem z tym problem, ponieważ zmieniłem nazwę folderu, w którym się znajdował. Vagrant nalegał na utworzenie nowej maszyny wirtualnej o tej samej nazwie co folder, zamiast używać istniejącej maszyny wirtualnej. Naprawiłem to, tworząc .vagrantplik w formacie 1.0 i automatycznie go zaktualizowałem. Tak szybko, jak to zrobiłem, faktycznie zmienił nazwę starej maszyny wirtualnej na nową nazwę katalogu projektu.
Jonah
2
Nie jestem pewien, co spowodowało rozłączenie, w którym mój włóczęga / maszyny / default / virtualbox / id wskazywał na niewłaściwy identyfikator maszyny VirtualBox. Plik, który pomógł to $ HOME / .VirtualBox / VirtualBox.xml. Zawiera sekcję MachineRegistry, w której identyfikatory UUID maszyn VirtualBox są mapowane na nazwy komputerów. Na przykład <MachineEntry uuid = "{f232f951-103b-af28-9f8d-b2ab21bs258f}" src = "$ HOME / VirtualBox VMs \ <machine-name> \ <machine-name> .vbox" />
arntg
14

Gdyby problem .vagrantpojawił się dzisiaj, brakowało mojego folderu i okazało się, że było jeszcze kilka kroków niż zwykłe ustawienie identyfikatora:

  1. Ustaw identyfikator:

    VBoxManage list vms
    

    Znajdź identyfikator i ustaw się {project-folder}/.vagrant/machines/default/virtualbox/id.

    Zauważ, że defaultmoże to być inne, jeśli ustawisz to Vagrantfilenp config.vm.define "someothername".

  2. Zatrzymaj obsługę administracyjną maszyny:

    Utwórz plik o nazwie action_provisionw tym samym idkatalogu, co plik, ustaw jego zawartość na: 1.5:{id}zastępując {id}identyfikator znaleziony w kroku 1.

  3. Skonfiguruj nowy klucz publiczny / prywatny:

    Vagrant używa klucza prywatnego przechowywanego w .vagrant/machines/default/virtualbox/private_keycelu ssh do maszyny. Musisz wygenerować nowy.

    ssh-keygen -t rsa
    

    nazwij to private_key.

    vagrant sshnastępnie skopiuj private_key.pubdo /home/vagrant/.ssh/authorized_keys.

Petecoop
źródło
czy „autoryzowane_klucze” to plik lub katalog?
user2568374
to plik, jeśli go przeszukasz, znajdziesz mnóstwo rzeczy, to standardowa rzecz ssh
Petecoop
Ponieważ używałem tych samych klawiszy, nie musiałem robić ostatniego setp (trzeciego). W przeciwnym razie naprawdę dobrze wyjaśnione i wszystko idealne.
Dazag
Jak zrobić trzeci krok na win10?
navono Kwietnia
9

Aktualizacja z tym samym problemem dzisiaj w Vagrant 1.7.4:

Na przykład, aby sparować pudełko „vip-quickstart_default_1431365185830_12124” z vagrantem.

$ 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
źródło
6

W przypadku konfiguracji z wieloma maszynami wirtualnymi wyglądałoby to tak:

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

Nazwy maszyn wirtualnych można pobrać z pliku Vagrantfile używanego do tworzenia tych maszyn wirtualnych. Poszukaj tej linii:

config.vm.define :web do |web_config|

W tym przypadku „web” to nazwa maszyny wirtualnej.

agwntr
źródło
A db to domyślna maszyna wirtualna?
Robert
1
Myślę, że nie ma tutaj wartości domyślnej, tylko web i db. W zależności od pliku Vagrantfile istnieje kolejność, w której maszyna wirtualna jest budowana jako pierwsza.
agwntr
5

Używam Vagrant 1.8.1 na OSX El Capitan

Moja maszyna wirtualna nie została poprawnie zamknięta po ponownym uruchomieniu komputera, więc kiedy próbowałem vagrant up, zawsze tworzyła nową maszynę wirtualną. Żadne rozwiązanie nie zadziałało dla mnie. Ale to, co zadziałało, było odmianą odpowiedzi ingmmurillo

Więc zamiast tworzyć .vagrant/machines/default/virtualbox/idna podstawie id z uruchomienia VBoxManage list vms. Musiałem zaktualizować identyfikator w.vagrant/machines/local/virtual_box/id

Mam jedną wkładkę, która zasadniczo robi to dla mnie:

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

Zakłada się, że pierwsze pudełko jest tym, które muszę zacząć od uruchomienia VBoxManage list vms

Brendan
źródło
4

To jest zmodyfikowane z odpowiedzi @ Petecoop .

Uruchom, vagrant haltjeśli jeszcze nie wyłączyłeś skrzynki.

Następnie wypisz swoje wirtualne skrzynki: VBoxManage list vms

Wyświetli listę wszystkich twoich wirtualnych skrzynek. Określić pole, które chcesz przywrócić i chwycić id nawiasach klamrowych: {}.

Następnie edytuj plik id projektu: sudo nano .vagrant/machines/default/virtualbox/id(z katalogu projektu)

Zastąp go identyfikatorem skopiowanym z listy VB.

Spróbuj vagrant reload.

Jeśli to nie zadziała i zawiesi się na autoryzacji SSH (gdzie się potknąłem), skopiuj niezabezpieczony klucz publiczny z włóczęgi git . Zastąp zawartość /.vagrant/machines/default/virtualbox/private_key. Kopii zapasowej oryginalnego przedmiotu: cp private_key private_key-bak.

Następnie biegnij vagrant reload. Powie, że zidentyfikował niezabezpieczony klucz i utworzy nowy.

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!

Wszystko powinno być gotowe.

ethicka
źródło
3

W Vagrant 1.9.1:

Miałem maszynę wirtualną w Virtual Box o nazwie `` Ubuntu 16.04.1 '', więc zapakowałem ją jako pudełko włóczęgi z:

vagrant package --base "Ubuntu 16.04.1"

odpowiada ...

==> Ubuntu 16.04.1: Exporting VM...
==> Ubuntu 16.04.1: Compressing package to: blah blah/package.box
PeterVermont
źródło
0

Jestem na macos i odkryłem, że usunięcie .locków na pudełkach rozwiązało mój problem.

Z jakiegoś powodu

vagrant halt

nie usunąłem tych blokad i po przywróceniu wszystkich moich ustawień w .vagrant / machine / default / virtualbox przy użyciu timemachine, usunięciu blokad, uruchomiła się właściwa maszyna.

Pozostał tylko jeden drobny problem, włączył się do gruba, więc musiałem raz nacisnąć enter, nie wiem, czy to pozostanie, ale wkrótce się dowiem.

Używam Vagrant 1.7.4 i virtualbox 5.0.2

dmaij
źródło