¿Cómo asocio un directorio de proyecto Vagrant con una VM VirtualBox existente?

132

De alguna manera, mi proyecto Vagrant se ha desasociado de su VM VirtualBox, de modo que cuando vagrant upVagrant importe la caja base y cree una nueva máquina virtual.

¿Hay alguna forma de volver a asociar el proyecto Vagrant con la VM existente? ¿Cómo asocia Vagrant internamente un Vagrantfile con un directorio VirtualBox VM?

jrdmcgr
fuente

Respuestas:

89

ADVERTENCIA: La siguiente solución funciona para Vagrant 1.0.x pero no para Vagrant 1.1+.

Vagrant usa el archivo ".vagrant" en el mismo directorio que su "Vagrantfile" para rastrear el UUID de su VM. Este archivo no existirá si una VM no existe. El formato del archivo es JSON. Se ve así si existe una única VM:

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

default es el nombre de la máquina virtual predeterminada (si no está utilizando configuraciones de máquinas virtuales múltiples).

Si su VM se ha desasociado de alguna manera, lo que puede hacer es hacer VBoxManage list vmsuna lista de todas las VM que VirtualBox conoce por su nombre y UUID. Luego, cree manualmente un .vagrantarchivo en el mismo directorio que el suyo Vagrantfiley complete el contenido correctamente.

Ejecute vagrant statuspara asegurarse de que Vagrant recogió los cambios adecuados.

Nota: Esto no es oficialmente compatible con Vagrant y Vagrant puede cambiar el formato .vagranten cualquier momento. Pero esto es válido a partir de Vagrant 0.9.7 y será válido para Vagrant 1.0.

Mitchell
fuente
¡Increíble! Gracias. Tenía la sensación de que algo faltaba.
jrdmcgr
48
Para Vagrant 1.1, los UUID se almacenan en un archivo específico de la máquina en .vagrant/machines/{name}/{provider}/id. De hecho, lo único que contiene ese archivo es el UUID.
2
Intenté este truco, pero el estado vagabundo simplemente informa que el estado no se creó. Vagabundo crea un nuevo vm y funciona bien. Si cambio el archivo de identificación, informa que no está creado, incluso si lo cambio de nuevo al uuid del cuadro que acaba de crear.
Reece Marsland
44
Con Vagrant 1.1+, asegúrese de no agregar una nueva línea al final de la identificación. Ver github.com/mitchellh/vagrant/issues/1755 para más detalles
Mads Mobæk
1
Estaba buscando .vagrant en mi perfil (Mac). Tenga en cuenta que (al menos para mí) estaba en la misma carpeta que la carpeta de libros de cocina y VagrantFile. (Vagrant versión 1.4.3)
allicarn
208

Para Vagrant 1.6.3 haga lo siguiente:

1) En el directorio donde se encuentra su Vagrantfile, ejecute el comando

VBoxManage list vms

Tendrás algo como esto:

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

2) Ir a la siguiente ruta:

cd .vagrant/machines/default/virtualbox

3) Cree un archivo llamado id con la ID de su VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4) Guarde el archivo y ejecute vagabundo

ingmmurillo
fuente
8
Una buena manera de crear el idarchivo sin una nueva línea es echo -n '<your id here>' > id.
Xiong Chiamiov
1
Funciona genial. ¿Pero por qué sucede esto?
JohnnyQ
Trabajó para mí con Vagrant 1.7.2. ¡Gracias!
Rafen
1
Funcionó perfectamente.
Casey Robinson
# test1 y test2 boxes ...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

La solución con la versión superior es la misma.

Pero primero debe iniciar el archivo .vbox a mano para que aparezca en VBoxManage list vms

Luego puede verificar .vagrant/machines/default/virtualbox/idpara verificar que el uuid sea el correcto.

Natim
fuente
44
Además, vale la pena señalar que si está editando el idarchivo, debe mantenerlo en una sola línea. Por alguna razón, no le gusta la nueva línea al final (mi editor de texto la agrega por defecto, así que tuve problemas).
Dan2552
Me encontré con un problema con esto porque había cambiado el nombre de la carpeta en la que estaba. Vagrant insistió en crear una nueva máquina virtual con el mismo nombre que la carpeta, en lugar de usar la máquina virtual existente. Lo arreglé creando un .vagrantarchivo en el formato 1.0, y lo actualizó automáticamente. Tan pronto como lo hice, en realidad cambió el nombre de la vieja VM al nuevo nombre del directorio del proyecto.
Jonás
2
No estoy seguro de qué causó la desconexión donde mi vagabundo / máquinas / predeterminado / virtualbox / id apuntó a la identificación incorrecta de la máquina VirtualBox. El archivo que ayudó fue $ HOME / .VirtualBox / VirtualBox.xml. Tiene una sección MachineRegistry que tiene los UUID de la máquina VirtualBox asignados a los nombres de las máquinas. Por ejemplo <MachineEntry uuid = "{f232f951-103b-af28-9f8d-b2ab21bs258f}" src = "$ HOME / VirtualBox VMs \ <machine-name> \ <machine-name> .vbox" />
arntg
14

Tuve el problema hoy, .vagrantfaltaba mi carpeta y descubrí que había algunos pasos más que simplemente configurar la identificación:

  1. Establecer la id:

    VBoxManage list vms
    

    Encuentra la identificación y configúrala {project-folder}/.vagrant/machines/default/virtualbox/id.

    Tenga en cuenta que defaultpuede ser diferente si se establece en su Vagrantfileeg config.vm.define "someothername".

  2. Detenga el aprovisionamiento de la máquina:

    Cree un archivo nombrado action_provisionen el mismo directorio que el idarchivo, establezca su contenido en: 1.5:{id}reemplazando {id}con la identificación que se encuentra en el paso 1.

  3. Configurar una nueva clave pública / privada:

    Vagrant utiliza una clave privada almacenada en .vagrant/machines/default/virtualbox/private_keyssh en la máquina. Tendrá que generar uno nuevo.

    ssh-keygen -t rsa
    

    nombrarlo private_key.

    vagrant sshluego copie el private_key.puben /home/vagrant/.ssh/authorized_keys.

Petecoop
fuente
¿Es "Authorized Keys" un archivo o directorio?
user2568374
es un archivo, si lo buscas encontrarás muchas cosas, es una cosa ssh estándar
Petecoop
Como estaba usando las mismas teclas, no tuve que hacer el último setp (tercero). De lo contrario, muy bien explicado y todo perfecto.
Dazag
Cómo hacer el tercer paso en win10?
navono
9

Actualice con el mismo problema hoy con Vagrant 1.7.4:

Por ejemplo, para emparejar el cuadro 'vip-quickstart_default_1431365185830_12124' a vagabundo.

$ 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
fuente
6

Para configuraciones de máquinas virtuales múltiples, se vería así:

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

Puede obtener los nombres de VM del Vagrantfile utilizado para crear esas máquinas virtuales. Busque esta línea:

config.vm.define :web do |web_config|

"web" es el nombre de la máquina virtual en este caso.

agwntr
fuente
¿Y db es una VM predeterminada?
Robert
1
No creo que haya un valor predeterminado aquí, solo web y db. Dependiendo del Vagrantfile, hay un orden en el que vm se construye primero.
agwntr
5

Estoy usando Vagrant 1.8.1 en OSX El Capitan

Mi VM no se cerró correctamente cuando se reinició mi computadora, por lo que cuando lo intenté vagrant upsiempre estaba creando una VM nueva. Ninguna solución aquí funcionó para mí. Pero lo que funcionó fue una variación de la respuesta de ingmmurillo

Entonces, en lugar de crear en .vagrant/machines/default/virtualbox/idfunción de la id de la ejecución VBoxManage list vms. Tuve que actualizar la identificación en.vagrant/machines/local/virtual_box/id

Tengo un trazador de líneas que esencialmente hace esto por mí:

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

Esto supone que el primer cuadro es el que necesito para comenzar a ejecutar VBoxManage list vms

Brendan
fuente
4

Esto se modifica a partir de la respuesta de @ Petecoop .

Ejecute vagrant haltsi aún no ha cerrado la caja.

Luego, enumere sus cajas virtuales: VBoxManage list vms

Enumerará todas sus cajas virtuales. Identificar el cuadro desea volver a agarrar y el id entre las llaves: {}.

Luego edite el archivo de identificación del proyecto: sudo nano .vagrant/machines/default/virtualbox/id(desde el directorio del proyecto)

Reemplácelo con la identificación que copió de la lista de VB.

Tratar vagrant reload.

Si eso no funciona y se cuelga de la autorización SSH (donde tropecé), copie la clave pública insegura del git vagabundo . Reemplazar el contenido de /.vagrant/machines/default/virtualbox/private_key. Copia de seguridad del original, por supuesto: cp private_key private_key-bak.

Entonces corre vagrant reload. Dirá que ha identificado la clave insegura y creará una nueva.

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!

Deberías estar listo.

ethicka
fuente
3

En Vagrant 1.9.1:

Tenía una VM en Virtual Box llamada 'Ubuntu 16.04.1', así que la empaqué como una caja vagabunda con:

vagrant package --base "Ubuntu 16.04.1"

responde con ...

==> Ubuntu 16.04.1: Exporting VM...
==> Ubuntu 16.04.1: Compressing package to: blah blah/package.box
PeterVermont
fuente
0

Estoy en macos y descubrí que eliminar los bloqueos de las cajas resolvió mi problema.

Por alguna razón

vagrant halt

no eliminó estos bloqueos, y después de restaurar todas mis configuraciones en .vagrant / machine / default / virtualbox usando timemachine, quitando los bloqueos, la máquina correcta se inició.

Solo queda 1 problema menor. Arrancó en grub, así que tuve que presionar enter una vez, no sé si esto se queda, pero lo descubriré pronto.

Estoy ejecutando vagrant 1.7.4 y virtualbox 5.0.2

dmaij
fuente