2012-02-24 22 views
117

In qualche modo il mio progetto Vagrant si è dissociato dalla sua VirtualBox VM, in modo che quando I vagrant up Vagrant importa la base-box e crea una nuova macchina virtuale.Come associo una directory di progetto Vagrant a una VM VirtualBox esistente?

C'è un modo per riassociare il progetto Vagrant con la macchina virtuale esistente? In che modo Vagrant associa internamente un Vagrantfile a una directory VM VirtualBox?

risposta

85

ATTENZIONE: La soluzione qui di seguito lavora per Vagrant 1.0.x, ma non Vagrant 1.1+.

Vagrant utilizza il file ".vagrant" nella stessa directory del "Vagrantfile" per tracciare l'UUID della VM. Questo file non esiste se una macchina virtuale non esiste. Il formato del file è JSON. Sembra che questo se una singola macchina virtuale esiste:

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

default è il nome della macchina virtuale di default (se non si utilizza configurazioni multi-VM).

Se la tua macchina virtuale è in qualche modo diventata dissociata, ciò che puoi fare è fare VBoxManage list vms che elencherà ogni VM di cui VirtualBox conosce il nome e l'UUID. Quindi creare manualmente un file .vagrant nella stessa directory di Vagrantfile e compilare correttamente i contenuti.

Eseguire vagrant status per assicurarsi che Vagrant abbia raccolto le modifiche corrette.

Nota: Questo non è ufficialmente supportato da Vagrant e Vagrant può modificare il formato di .vagrant in qualsiasi momento. Ma questo è valido a partire da Vagrant 0.9.7 e sarà valido per Vagrant 1.0.

+0

Impressionante! Grazie. Ho avuto la sensazione che mancasse qualcosa. – jrdmcgr

+0

Le modifiche "predefinite" potrebbero essere apportate al nome personalizzato senza utilizzare la configurazione multi-VM? –

+40

Per Vagrant 1.1, gli UUID sono memorizzati in un file specifico della macchina in ".vagrant/machines/{nome}/{provider}/id'. In effetti, l'unica cosa che il file contiene è l'UUID. –

6

per Multi-VM messe a punto, sarebbe simile a questa:

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

è possibile ottenere i nomi VM dal Vagrantfile usato per creare quelle macchine virtuali. Cerca questa riga:

config.vm.define :web do |web_config| 

"web" è il nome del vm in questo caso.

+0

E ** db ** è una VM predefinita ?? – Robert

+1

Non penso ci sia un default qui, solo web e db. A seconda del Vagrantfile, c'è un ordine di cui vm viene costruito per primo. – agwntr

47

La soluzione con versione superiore è praticamente la stessa.

Ma prima è necessario lanciare il file .vbox a mano in modo da apparire in VBoxManage list vms

Quindi è possibile controllare la .vagrant/machines/default/virtualbox/id per controllare che l'UUID è quella giusta.

+4

Inoltre, vale la pena notare che se si modifica il file 'id', è necessario mantenerlo su una singola riga. Per qualche motivo non mi piace newline alla fine (il mio editor di testo lo aggiunge per impostazione predefinita, quindi ho avuto problemi). – Dan2552

+0

Mi sono imbattuto in un problema con questo perché avevo rinominato la cartella in cui si trovava. Vagrant ha insistito per creare una nuova VM con lo stesso nome della cartella, invece di utilizzare la VM esistente. L'ho risolto creando un file '.vagrant' nel formato 1.0 e l'ho aggiornato automaticamente. Appena ho fatto, in realtà ha rinominato la vecchia VM al nuovo nome della directory del progetto. – Jonah

+2

Non sono sicuro di cosa abbia causato la disconnessione in cui il mio vagabondo/machine/default/virtualbox/id ha indicato l'id della macchina VirtualBox errata. Il file che ha aiutato è $ HOME/.VirtualBox/VirtualBox.xml. Ha una sezione MachineRegistry con gli UUID della macchina VirtualBox mappati ai nomi delle macchine. Ad esempio arntg

181

per Vagrant 1.6.3 effettuare le seguenti operazioni:

1) Nella directory in cui si trova il Vagrantfile, eseguire il comando

VBoxManage list vms 

Avrete qualcosa di simile:

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

2) Vai seguente percorso:

cd .vagrant/machines/default/virtualbox 

3) Creare un file denominato id con l'ID del vostro VM xxxxxxxxxxxx-xxxxxxxx-xxxxxxxxxxxx

4) Salvare il file ed eseguire vagabondo fino

+0

Ho provato questo approccio e funziona! Grazie! – Kirby

+0

Funziona alla grande! – smo0f

+7

Un buon modo per creare il file 'id' * senza * una nuova riga è' echo -n ''> id'. –

8

aggiornamento con lo stesso problema di oggi con la Vagrant 1.7.4:

ad esempio, per accoppiare casella 'vip-quickstart_defa ult_1431365185830_12124 'a vagabondo.

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

Sono su MacOS e ha scoperto che la rimozione delle .locks sulle scatole risolto il mio problema.

Per qualche ragione

vagrant halt 

non rimuovere questi blocchi, e dopo aver ripristinato tutte le mie impostazioni in .vagrant/macchina/default/VirtualBox utilizzando TimeMachine, Rimozione dei blocchi, la macchina giusta avviato.

Rimane solo 1 problema minore, Si è avviato in grub, quindi ho dovuto premere Invio una volta, non so se questo è rimasto, ma lo scoprirò presto.

Io corro 1.7.4 vagabondo e virtualbox 5.0.2

3

sto usando Vagrant 1.8.1 su OSX El Capitan

mio VM non è stato chiuso correttamente quando il mio computer riavviato, quindi quando ho provato vagrant up creava sempre nuovi vm. Nessuna soluzione qui ha funzionato per me. Ma che cosa ha fatto il lavoro era una variazione di ingmmurillo's answer

Così, invece di creare .vagrant/machines/default/virtualbox/id in base all'ID esecuzione VBoxManage list vms.Ho dovuto aggiornare l'id in .vagrant/machines/local/virtual_box/id

Ho un uno di linea che fa essenzialmente questo per me:

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

Questo presuppone la prima casella è quello che ho bisogno di avviare l'esecuzione VBoxManage list vms

11

avuto il problema di oggi, la mia cartella .vagrant mancava e ha scoperto che vi era ancora qualche passo che semplicemente impostare l'id:

  1. impostare l'ID:

    VBoxManage list vms 
    

    trovare l'ID e impostare in {project-folder}/.vagrant/machines/default/virtualbox/id.

    Nota che default potrebbe essere diverso se impostato nel Vagrantfile ad es. config.vm.define "someothername".

  2. Fermate la macchina da provisioning:

    Creare un file denominato action_provision nella stessa directory del file id, impostare il suo contenuto a: 1.5:{id} sostituire {id} con l'id trovato nel passaggio 1.

  3. Impostazione di una nuova chiave pubblica/privata:

    Vagrant utilizza una chiave privata memorizzata in .vagrant/machines/default/virtualbox/private_key per ssh nella macchina. Dovrai generarne uno nuovo.

    ssh-keygen -t rsa 
    

    nome esso private_key.

    vagrant ssh quindi copiare private_key.pub in /home/vagrant/.ssh/authorized_keys.

+0

"authorized_keys" è un file o una directory? – user2568374

+0

è un file, se lo cerchi troverai molte cose, è una cosa ssh standard – Petecoop

3

In Vagrant 1.9.1:

ho avuto una macchina virtuale in Virtual Box chiamato 'Ubuntu 16.04.1' così ho confezionato come una scatola con vagabonda:

vagrant package --base "Ubuntu 16.04.1" 

risponde con ...

==> Ubuntu 16.04.1: Exporting VM... 
==> Ubuntu 16.04.1: Compressing package to: blah blah/package.box 
2

Questo è modificato da @Petecoop's answer.

Eseguire vagrant halt se non si è ancora chiuso il box.

Poi Inserisci il tuo virtualboxes: VBoxManage list vms

Sarà elencare tutti i vostri virtualboxes. Identificare la casella che si desidera ripristinare e afferrare l'ID tra parentesi graffe: {}.

quindi modificare il file ID del progetto: sudo nano /.vagrant/machines/default/virtualbox/id

sostituirlo con l'id copiato dalla lista dei VBs.

Prova vagrant reload.

Se ciò non funziona e si blocca su autorizzazione SSH (dove sono inciampato), copiare la chiave pubblica non protetta da vagrant git. Sostituisci il contenuto di /.vagrant/machines/default/virtualbox/private_key. Backup dell'originale, naturalmente: cp private_key private_key-bak.

Quindi eseguire vagrant reload. Dirà che è identificata la chiave insicura e ne crei una nuova.

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! 

Si dovrebbe essere tutto pronto.

Problemi correlati