Comment associer un répertoire de projet Vagrant à une VM VirtualBox existante?

132

D'une manière ou d'une autre, mon projet Vagrant s'est dissocié de sa VM VirtualBox, de sorte que lorsque je vagrant upVagrant importera la boîte de base et créera une nouvelle machine virtuelle.

Existe-t-il un moyen de réassocier le projet Vagrant à la VM existante? Comment Vagrant associe-t-il en interne un Vagrantfile à un répertoire de VM VirtualBox?

jrdmcgr
la source

Réponses:

89

AVERTISSEMENT: la solution ci-dessous fonctionne pour Vagrant 1.0.x mais pas pour Vagrant 1.1+.

Vagrant utilise le fichier ".vagrant" dans le même répertoire que votre "Vagrantfile" pour suivre l'UUID de votre VM. Ce fichier n'existera pas si une VM n'existe pas. Le format du fichier est JSON. Cela ressemble à ceci si une seule VM existe:

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

default est le nom de la machine virtuelle par défaut (si vous n'utilisez pas de configurations multi-VM).

Si votre machine virtuelle est en quelque sorte dissociée, vous pouvez faire la VBoxManage list vmsliste de toutes les machines virtuelles que VirtualBox connaît par son nom et son UUID. Ensuite, créez manuellement un .vagrantfichier dans le même répertoire que le vôtre Vagrantfileet remplissez correctement le contenu.

Exécutez vagrant statuspour vous assurer que Vagrant a pris les changements appropriés.

Remarque: ceci n'est pas officiellement pris en charge par Vagrant et Vagrant peut changer le format de .vagrantà tout moment. Mais ceci est valable à partir de Vagrant 0.9.7 et sera valable pour Vagrant 1.0.

Mitchell
la source
Impressionnant! Je vous remercie. J'avais le sentiment que quelque chose manquait.
jrdmcgr
48
Pour Vagrant 1.1, les UUID sont stockés dans un fichier spécifique à la machine à l'adresse .vagrant/machines/{name}/{provider}/id. En fait, la seule chose que ce fichier contient est l'UUID.
2
J'ai essayé cette astuce, mais le statut de vagabond signale simplement l'état comme non créé. Vagrant up crée alors une nouvelle VM et fonctionne très bien. Si je change le fichier d'identification, il signale alors qu'il n'a pas été créé, même si je le remplace par l'uuid de la boîte qu'il vient de créer.
Reece Marsland
4
Avec Vagrant 1.1+, assurez-vous de ne pas ajouter de nouvelle ligne à la fin de l'identifiant. Voir github.com/mitchellh/vagrant/issues/1755 pour plus de détails
Mads Mobæk
1
Je cherchais .vagrant dans mon profil (Mac). Notez que (du moins pour moi) il était dans le même dossier que le dossier des livres de cuisine et VagrantFile. (Vagrant version 1.4.3)
allicarn
208

Pour Vagrant 1.6.3, procédez comme suit:

1) Dans le répertoire où se trouve votre Vagrantfile, exécutez la commande

VBoxManage list vms

Vous aurez quelque chose comme ça:

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

2) Accédez au chemin suivant:

cd .vagrant/machines/default/virtualbox

3) Créez un fichier appelé id avec l'ID de votre VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4) Enregistrez le fichier et lancez vagrant

Ingmmurillo
la source
8
Un bon moyen de créer le idfichier sans nouvelle ligne est echo -n '<your id here>' > id.
Xiong Chiamiov
1
Fonctionne très bien. Mais pourquoi cela arrive-t-il?
JohnnyQ
A travaillé pour moi avec Vagrant 1.7.2. Merci!
Rafen le
1
A parfaitement fonctionné.
Casey Robinson
# test1 et 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 solution avec la version supérieure est tout à fait la même.

Mais vous devez d'abord lancer le fichier .vbox à la main pour qu'il apparaisse dans VBoxManage list vms

Ensuite, vous pouvez vérifier le .vagrant/machines/default/virtualbox/idpour vérifier que l'uuid est le bon.

Natim
la source
4
En outre, il convient de noter que si vous modifiez le idfichier, vous devez le conserver sur une seule ligne. Pour une raison quelconque, il n'aime pas la nouvelle ligne à la fin (mon éditeur de texte l'ajoute par défaut, j'ai donc eu des problèmes).
Dan2552
J'ai rencontré un problème avec cela parce que j'avais renommé le dossier dans lequel il se trouvait. Vagrant a insisté pour créer une nouvelle VM avec le même nom que le dossier, au lieu d'utiliser la VM existante. Je l'ai corrigé en créant un .vagrantfichier au format 1.0, et il l'a mis à jour automatiquement. Dès que je l'ai fait, il a renommé l'ancienne VM avec le nouveau nom du répertoire du projet.
Jonah
2
Je ne suis pas sûr de la cause de la déconnexion où mon vagrant / machines / default / virtualbox / id a pointé vers le mauvais id de machine VirtualBox. Le fichier qui a aidé était $ HOME / .VirtualBox / VirtualBox.xml. Il a une section MachineRegistry ayant les UUID de la machine VirtualBox mappés aux noms de machine. Par exemple <MachineEntry uuid = "{f232f951-103b-af28-9f8d-b2ab21bs258f}" src = "$ HOME / VirtualBox VMs \ <machine-name> \ <machine-name> .vbox" />
arntg
14

Eu le problème aujourd'hui, mon .vagrantdossier était manquant et a constaté qu'il y avait quelques étapes de plus que la simple définition de l'identifiant:

  1. Définissez l'identifiant:

    VBoxManage list vms
    

    Trouvez l'id et installez-le {project-folder}/.vagrant/machines/default/virtualbox/id.

    Notez que cela defaultpeut être différent s'il est défini dans votre Vagrantfileexemple config.vm.define "someothername".

  2. Arrêtez la machine de provisionner:

    Créez un fichier nommé action_provisiondans le même idrépertoire que le fichier, définissez son contenu sur: en 1.5:{id}remplaçant {id}par l'ID trouvé à l'étape 1.

  3. Configurer une nouvelle clé publique / privée:

    Vagrant utilise une clé privée stockée dans .vagrant/machines/default/virtualbox/private_keypour ssh dans la machine. Vous devrez en générer un nouveau.

    ssh-keygen -t rsa
    

    nommez-le private_key.

    vagrant sshpuis copiez le private_key.pubdans /home/vagrant/.ssh/authorized_keys.

Petecoop
la source
"Authorized_keys" est-il un fichier ou un répertoire?
user2568374
c'est un fichier, si vous recherchez dessus, vous trouverez beaucoup de choses, c'est une chose standard ssh
Petecoop
Comme j'utilisais les mêmes touches, je n'ai pas eu à faire le dernier setp (troisième). Sinon, vraiment bien expliqué et tout est parfait.
Dazag du
Comment faire la troisième étape sur win10?
navono
9

Mise à jour avec le même problème aujourd'hui avec Vagrant 1.7.4:

Par exemple, pour associer la boîte '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
la source
6

Pour les configurations multi-VM, cela ressemblerait à ceci:

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

Vous pouvez obtenir les noms de VM à partir du Vagrantfile utilisé pour créer ces VM. Recherchez cette ligne:

config.vm.define :web do |web_config|

"web" est le nom de la VM dans ce cas.

agwntr
la source
Et db est une VM par défaut ??
Robert
1
Je ne pense pas qu'il y ait un défaut ici, juste web et db. En fonction du Vagrantfile, il existe un ordre dans lequel vm est construit en premier.
agwntr
5

J'utilise Vagrant 1.8.1 sur OSX El Capitan

Mon VM n'était pas fermé correctement lorsque mon ordinateur redémarrait, donc quand j'essayais, vagrant upil créait toujours un nouveau VM. Aucune solution ici n'a fonctionné pour moi. Mais ce qui a fonctionné était une variante de la réponse d' Inmmurillo

Donc, au lieu de créer en .vagrant/machines/default/virtualbox/idfonction de l'id de l'exécution VBoxManage list vms. J'ai dû mettre à jour l'identifiant dans.vagrant/machines/local/virtual_box/id

J'ai une ligne unique qui fait essentiellement cela pour moi:

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

Cela suppose que la première boîte est celle dont j'ai besoin pour commencer à courir VBoxManage list vms

Brendan
la source
4

Ceci est modifié à partir de la réponse de @ Petecoop .

Exécutez vagrant haltsi vous n'avez pas encore fermé la boîte.

Ensuite, listez vos boîtes virtuelles: VBoxManage list vms

Il listera toutes vos boîtes virtuelles. Identifier la zone que vous souhaitez revenir à et saisir l'identifiant entre les accolades: {}.

Puis éditez le fichier d'id du projet: sudo nano .vagrant/machines/default/virtualbox/id(à partir du répertoire du projet)

Remplacez-le par l'identifiant que vous avez copié dans la liste des VB.

Essayez vagrant reload.

Si cela ne fonctionne pas et se bloque sur l'autorisation SSH (où j'ai trébuché), copiez la clé publique non sécurisée du git vagabond . Remplacez le contenu de /.vagrant/machines/default/virtualbox/private_key. Sauvegarde de l'original bien sûr: cp private_key private_key-bak.

Puis cours vagrant reload. Il dira qu'il a identifié la clé non sécurisée et en crée une nouvelle.

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!

Vous devriez être prêt.

Ethicka
la source
3

Dans Vagrant 1.9.1:

J'avais une VM dans Virtual Box nommée `` Ubuntu 16.04.1 '', donc je l'ai emballée comme une boîte vagabonde avec:

vagrant package --base "Ubuntu 16.04.1"

répond avec ...

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

Je suis sur macos et j'ai constaté que la suppression des .locks sur les boîtes a résolu mon problème.

Pour certaines raisons

vagrant halt

n'a pas supprimé ces verrous, et après avoir restauré tous mes paramètres dans .vagrant / machine / default / virtualbox en utilisant timemachine, en supprimant les verrous, la bonne machine a démarré.

Il ne reste qu'un problème mineur, il a démarré dans grub, j'ai donc dû appuyer une fois sur Entrée, je ne sais pas si cela reste, mais je le saurai assez tôt.

J'utilise vagrant 1.7.4 et virtualbox 5.0.2

dmaij
la source