Como associo um diretório de projeto do Vagrant a uma VM VirtualBox existente?

132

De alguma forma, meu projeto do Vagrant se desassociou de sua VM do VirtualBox, de modo que quando eu o vagrant upVagrant importe a caixa de base e crie uma nova máquina virtual.

Existe uma maneira de associar novamente o projeto Vagrant à VM existente? Como o Vagrant associa internamente um arquivo Vagrant a um diretório de VM do VirtualBox?

jrdmcgr
fonte

Respostas:

89

AVISO: A solução abaixo funciona para o Vagrant 1.0.x, mas não para o Vagrant 1.1 ou posterior.

O Vagrant usa o arquivo ".vagrant" no mesmo diretório que o seu "Vagrantfile" para rastrear o UUID da sua VM. Este arquivo não existirá se uma VM não existir. O formato do arquivo é JSON. Parece que se houver uma única VM:

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

default é o nome da máquina virtual padrão (se você não estiver usando configurações de várias VMs).

Se sua VM de alguma forma se desassociar, o que você pode fazer é VBoxManage list vmslistar todas as VMs que o VirtualBox conhece pelo nome e UUID. Em seguida, crie manualmente um .vagrantarquivo no mesmo diretório que o seu Vagrantfilee preencha o conteúdo corretamente.

Execute vagrant statuspara garantir que o Vagrant receba as alterações adequadas.

Nota: Isso não é oficialmente suportado pelo Vagrant e o Vagrant pode alterar o formato .vagranta qualquer momento. Mas isso é válido a partir do Vagrant 0.9.7 e será válido para o Vagrant 1.0.

Mitchell
fonte
Impressionante! Obrigado. Tive a sensação de que algo estava faltando.
Jdmcgr
48
Para o Vagrant 1.1, os UUIDs são armazenados em um arquivo específico da máquina em .vagrant/machines/{name}/{provider}/id. De fato, a única coisa que esse arquivo contém é o UUID.
2
Eu tentei esse truque, mas o status vagante simplesmente relata o estado como não criado. O Vagrant up cria um novo vm e funciona bem. Se eu alterar o arquivo de identificação, ele será reportado como não criado, mesmo se eu o alterar novamente para o uuid da caixa que ele acabou de criar.
Reece Marsland
4
Com o Vagrant 1.1 ou superior, não adicione uma nova linha ao final do ID. Veja github.com/mitchellh/vagrant/issues/1755 para obter detalhes
Mads Mobæk
1
Eu estava procurando .vagrant no meu perfil (Mac). Observe que (pelo menos para mim) estava na mesma pasta que a pasta de livros de receitas e o VagrantFile. (Vagrant versão 1.4.3)
allicarn
208

Para o Vagrant 1.6.3, faça o seguinte:

1) No diretório em que seu Vagrantfile está localizado, execute o comando

VBoxManage list vms

Você terá algo parecido com isto:

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

2) Vá para o seguinte caminho:

cd .vagrant/machines/default/virtualbox

3) Crie um arquivo chamado id com o ID da sua VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

4) Salve o arquivo e execute o vagrant up

ingmmurillo
fonte
8
Uma boa maneira de criar o idarquivo sem uma nova linha é echo -n '<your id here>' > id.
Xiong Chiamiov
1
Funciona bem. Mas por que isso acontece?
JohnnyQ
Trabalhou para mim com o Vagrant 1.7.2. Obrigado!
Rafen
1
Funcionou perfeitamente.
Casey Robinson
# test1 e 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

A solução com a versão superior é a mesma.

Mas primeiro você precisa iniciar o arquivo .vbox manualmente para que ele apareça em VBoxManage list vms

Depois, você pode verificar .vagrant/machines/default/virtualbox/idse o uuid é o correto.

Natim
fonte
4
Além disso, é importante notar que, se você estiver editando o idarquivo, mantenha-o em uma única linha. Por alguma razão, ele não gosta de nova linha no final (meu editor de texto a adiciona por padrão, por isso tive problemas).
precisa saber é o seguinte
Eu tive um problema com isso porque havia renomeado a pasta em que estava. O Vagrant insistiu em criar uma nova VM com o mesmo nome da pasta, em vez de usar a VM existente. Corrigi-o criando um .vagrantarquivo no formato 1.0, e ele foi atualizado automaticamente. Assim que eu fiz, ele realmente renomeou a VM antiga para o novo nome do diretório do projeto.
Jonah #
2
Não sei ao certo o que causou a desconexão em que meu vagrant / machines / default / virtualbox / id apontou para o ID da máquina VirtualBox errado. O arquivo que ajudou foi $ HOME / .VirtualBox / VirtualBox.xml. Ele possui uma seção MachineRegistry com os UUIDs da máquina VirtualBox mapeados para os nomes das máquinas. Por exemplo, <MachineEntry uuid = "{f232f951-103b-af28-9f8d-b2ab21bs258f}" src = "$ HOME / VMs de VirtualBox \ <nome da máquina> \ <nome da máquina> .vbox" />
arntg
14

Teve o problema hoje, minha .vagrantpasta estava ausente e constatou que havia mais algumas etapas do que simplesmente definir o ID:

  1. Defina o ID:

    VBoxManage list vms
    

    Encontre o ID e defina {project-folder}/.vagrant/machines/default/virtualbox/id.

    Observe que defaultpode ser diferente se definido no seu Vagrantfilepor exemplo config.vm.define "someothername".

  2. Pare a máquina de provisionar:

    Crie um arquivo nomeado action_provisionno mesmo diretório que o idarquivo, defina seu conteúdo para: 1.5:{id}substituindo {id}pelo ID encontrado na etapa 1.

  3. Configure uma nova chave pública / privada:

    O Vagrant usa uma chave privada armazenada no .vagrant/machines/default/virtualbox/private_keyssh na máquina. Você precisará gerar um novo.

    ssh-keygen -t rsa
    

    nomeie private_key.

    vagrant sshdepois copie o arquivo private_key.pubpara /home/vagrant/.ssh/authorized_keys.

Petecoop
fonte
é "allowed_keys" um arquivo ou diretório?
user2568374
que é um arquivo, se você procurar nele você encontrará a abundância de coisas, é uma coisa ssh padrão
Petecoop
Como eu estava usando as mesmas chaves, não precisei fazer o último setp (terceiro). Caso contrário, muito bem explicado e tudo perfeito.
Dazag
Como fazer o terceiro passo no win10?
navono
9

Atualize com o mesmo problema hoje com o Vagrant 1.7.4:

Por exemplo, para emparelhar a caixa 'vip-quickstart_default_1431365185830_12124' com 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
fonte
6

Para configurações de várias VMs, seria assim:

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

Você pode obter os nomes de vm no arquivo Vagrant usado para criar essas VMs. Procure esta linha:

config.vm.define :web do |web_config|

"web" é o nome da VM nesse caso.

agwntr
fonte
E db é uma VM padrão?
Robert
1
Eu não acho que há um padrão aqui, apenas web e db. Dependendo do arquivo Vagrant, existe uma ordem em que o vm é construído primeiro.
24514 Agwntr
5

Estou usando o Vagrant 1.8.1 no OSX El Capitan

Meu vm não foi fechado corretamente quando o computador foi reiniciado; portanto, quando tentei, vagrant upele sempre criava um novo vm. Nenhuma solução aqui funcionou para mim. Mas o que funcionou foi uma variação da resposta de ingmmurillo

Então, em vez de criar com .vagrant/machines/default/virtualbox/idbase no ID em execução VBoxManage list vms. Eu tive que atualizar o id.vagrant/machines/local/virtual_box/id

Eu tenho um liner que essencialmente faz isso por mim:

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

Isso pressupõe que a primeira caixa seja a que eu preciso começar a executar VBoxManage list vms

Brendan
fonte
4

Isso é modificado a partir da resposta de @ Petecoop .

Execute vagrant haltse você ainda não desligou a caixa.

Em seguida, liste suas caixas virtuais: VBoxManage list vms

Ele listará todas as suas caixas virtuais. Identificar a caixa que você deseja reverter para e pegar o id entre as chaves: {}.

Em seguida, edite o arquivo de identificação do projeto: sudo nano .vagrant/machines/default/virtualbox/id(no diretório do projeto)

Substitua-o pelo ID que você copiou da lista de VBs.

Tente vagrant reload.

Se isso não funcionar e ficar pendurado na autorização SSH (onde eu tropecei), copie a chave pública insegura do vagabundo git . Substitua o conteúdo de /.vagrant/machines/default/virtualbox/private_key. Backup o original do curso: cp private_key private_key-bak.

Então corra vagrant reload. Dirá que identificou a chave insegura e criou uma nova.

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!

Você deve estar pronto.

ethicka
fonte
3

No Vagrant 1.9.1:

Eu tinha uma VM no Virtual Box chamada 'Ubuntu 16.04.1', então o empacotei como uma caixa vagrant com:

vagrant package --base "Ubuntu 16.04.1"

responde com ...

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

Estou no macos e descobri que remover os bloqueios nas caixas resolveu meu problema.

Por algum motivo

vagrant halt

não removeu esses bloqueios e, após restaurar todas as minhas configurações em .vagrant / machine / default / virtualbox usando o timemachine, removendo os bloqueios, a máquina correta foi inicializada.

Apenas um pequeno problema permanece, ele inicializou no grub, então eu tive que pressionar enter uma vez, não sei se isso está ficando, mas vou descobrir em breve.

Estou executando o vagrant 1.7.4 e o virtualbox 5.0.2

dmaij
fonte