Bagaimana cara mengaitkan direktori proyek Vagrant dengan VM VirtualBox yang ada?

132

Entah bagaimana proyek Vagrant saya telah melepaskan diri dari VM VirtualBox-nya, sehingga ketika saya vagrant upVagrant akan mengimpor kotak-dasar dan membuat mesin virtual baru.

Apakah ada cara untuk mengaitkan kembali proyek Vagrant dengan VM yang ada? Bagaimana cara Vagrant mengasosiasikan Vagrantfile secara internal dengan direktori VirtualBox VM?

jrdmcgr
sumber

Jawaban:

89

PERINGATAN: Solusi di bawah ini berfungsi untuk Vagrant 1.0.x tetapi tidak untuk Vagrant 1.1+.

Vagrant menggunakan file ".vagrant" di direktori yang sama dengan "Vagrantfile" Anda untuk melacak UUID VM Anda. File ini tidak akan ada jika VM tidak ada. Format file adalah JSON. Sepertinya ini jika ada satu VM:

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

default adalah nama mesin virtual default (jika Anda tidak menggunakan pengaturan multi-VM).

Jika VM Anda entah bagaimana menjadi terpisah, yang dapat Anda lakukan adalah melakukan VBoxManage list vmsyang akan mencantumkan setiap VM yang diketahui oleh VirtualBox dengan namanya dan UUID. Kemudian buat .vagrantfile secara manual di direktori yang sama dengan Anda Vagrantfiledan isi konten dengan benar.

Jalankan vagrant statusuntuk memastikan bahwa Vagrant mengambil perubahan yang tepat.

Catatan: Ini tidak didukung secara resmi oleh Vagrant dan Vagrant dapat mengubah format .vagrantkapan saja. Tetapi ini berlaku pada Vagrant 0.9.7 dan akan berlaku untuk Vagrant 1.0.

Mitchell
sumber
Luar biasa! Terima kasih. Saya merasa ada sesuatu yang hilang.
jrdmcgr
48
Untuk Vagrant 1.1, UUID disimpan dalam file khusus mesin di .vagrant/machines/{name}/{provider}/id. Faktanya, satu-satunya isi file tersebut adalah UUID.
2
Saya mencoba trik ini tetapi status gelandangan hanya melaporkan negara tidak dibuat. Vagrant up kemudian menciptakan vm baru dan berfungsi dengan baik. Jika saya mengubah file id maka laporan sebagai tidak dibuat, bahkan jika saya mengubahnya kembali ke uuid dari kotak yang baru saja dibuat.
Reece Marsland
4
Dengan Vagrant 1.1+, pastikan Anda tidak menambahkan baris baru ke akhir id. Lihat github.com/mitchellh/vagrant/issues/1755 untuk detailnya
Mads Mobæk
1
Saya mencari .vagrant di profil saya (Mac). Perhatikan bahwa (setidaknya bagi saya) itu ada di folder yang sama dengan folder buku masak dan VagrantFile. (Vagrant versi 1.4.3)
allicarn
208

Untuk Vagrant 1.6.3 lakukan hal berikut:

1) Di direktori tempat Vagrantfile Anda berada, jalankan perintah

VBoxManage list vms

Anda akan memiliki sesuatu seperti ini:

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

2) Pergi ke jalur berikut:

cd .vagrant/machines/default/virtualbox

3) Buat file bernama id dengan ID VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Anda

4) Simpan file dan jalankan gelran

ingmmurillo
sumber
8
Cara yang baik untuk membuat idfile tanpa baris baru adalah echo -n '<your id here>' > id.
Xiong Chiamiov
1
Bagus sekali. Tetapi mengapa ini terjadi?
JohnnyQ
Bekerja untuk saya dengan Vagrant 1.7.2. Terima kasih!
Rafen
1
Bekerja dengan sempurna.
Casey Robinson
# test1 dan kotak 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

Solusi dengan versi atas cukup sama.

Tetapi pertama-tama Anda harus meluncurkan file .vbox dengan tangan agar muncul VBoxManage list vms

Kemudian Anda dapat memeriksa .vagrant/machines/default/virtualbox/iduntuk memeriksa bahwa uuid adalah yang benar.

Natim
sumber
4
Juga, perlu dicatat bahwa jika Anda mengedit idfile, Anda harus menyimpannya dalam satu baris. Untuk beberapa alasan itu tidak suka baris baru di akhir (editor teks saya menambahkannya secara default, jadi saya punya masalah).
Dan2552
Saya mengalami masalah dengan ini karena saya telah mengganti nama folder itu. Vagrant bersikeras membuat VM baru dengan nama yang sama dengan folder, daripada menggunakan VM yang ada. Saya memperbaikinya dengan membuat .vagrantfile dalam format 1.0, dan memutakhirkannya secara otomatis. Begitu saya melakukannya, itu benar-benar mengubah nama VM lama ke nama direktori proyek baru.
Jonah
2
Saya tidak yakin apa yang menyebabkan terputusnya tempat gelandangan saya / mesin / default / virtualbox / id menunjuk ke salah mesin id VirtualBox. File yang membantu adalah $ HOME / .VirtualBox / VirtualBox.xml. Ini memiliki bagian MachineRegistry memiliki mesin VirtualBox UUID dipetakan ke nama mesin. Misalnya <MachineEntry uuid = "{f232f951-103b-af28-9f8d-b2ab21bs258f}" src = "$ HOME / VirtualBox VMs \ <machine-name> \ <machine-name> .vbox" />
arntg
14

Mengalami masalah hari ini, .vagrantfolder saya hilang dan menemukan bahwa ada beberapa langkah lebih dari sekadar mengatur id:

  1. Tetapkan id:

    VBoxManage list vms
    

    Temukan id dan atur {project-folder}/.vagrant/machines/default/virtualbox/id.

    Catatan yang defaultmungkin berbeda jika disetel Vagrantfilemisalnya Anda config.vm.define "someothername".

  2. Hentikan mesin dari penyediaan:

    Buat file bernama action_provisiondalam dir yang sama dengan idfile, atur isinya ke: 1.5:{id}ganti {id}dengan id yang ditemukan di langkah 1.

  3. Menyiapkan kunci publik / pribadi baru:

    Vagrant menggunakan kunci pribadi yang disimpan di .vagrant/machines/default/virtualbox/private_keyuntuk ssh ke dalam mesin. Anda harus membuat yang baru.

    ssh-keygen -t rsa
    

    beri nama private_key.

    vagrant sshlalu salin private_key.pubke /home/vagrant/.ssh/authorized_keys.

Petecop
sumber
Apakah "berwenang_kunci" adalah file atau direktori?
user2568374
itu adalah file, jika Anda mencarinya Anda akan menemukan banyak hal, itu adalah hal standar ssh
Petecoop
Karena saya menggunakan kunci yang sama, saya tidak perlu melakukan setp terakhir (ketiga). Kalau tidak, dijelaskan dengan sangat baik dan semuanya sempurna.
Dazag
Bagaimana melakukan langkah ketiga pada win10?
navono
9

Perbarui dengan masalah yang sama hari ini dengan Vagrant 1.7.4:

Misalnya, untuk memasangkan kotak 'vip-quickstart_default_1431365185830_12124' ke gelandangan.

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

Untuk pengaturan multi-VM, akan terlihat seperti ini:

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

Anda bisa mendapatkan nama vm dari Vagrantfile yang digunakan untuk membuat VM tersebut. Cari baris ini:

config.vm.define :web do |web_config|

"web" adalah nama vm dalam hal ini.

agwntr
sumber
Dan db adalah VM default ??
Robert
1
Saya tidak berpikir ada default di sini, hanya web dan db. Tergantung pada Vagrantfile, ada urutan yang akan dibangun terlebih dahulu.
agwntr
5

Saya menggunakan Vagrant 1.8.1 di OSX El Capitan

Vm saya tidak ditutup dengan benar ketika komputer saya restart, jadi ketika saya mencobanya vagrant upselalu membuat vm baru. Tidak ada solusi di sini yang berfungsi untuk saya. Tapi yang berhasil adalah variasi jawaban ingmmurillo

Jadi alih-alih membuat .vagrant/machines/default/virtualbox/idberdasarkan id dari menjalankan VBoxManage list vms. Saya harus memperbarui id di.vagrant/machines/local/virtual_box/id

Saya punya satu liner yang pada dasarnya melakukan ini untuk saya:

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

Ini mengasumsikan kotak pertama adalah yang saya harus mulai dari menjalankan VBoxManage list vms

Brendan
sumber
4

Ini dimodifikasi dari jawaban @ Petecoop .

Jalankan vagrant haltjika Anda belum mematikan kotak.

Kemudian daftarkan virtualbox Anda: VBoxManage list vms

Ini akan mencantumkan semua kotak virtual Anda. Mengidentifikasi kotak Anda ingin kembali ke dan ambil id antara kurung keriting: {}.

Kemudian edit file id proyek: sudo nano .vagrant/machines/default/virtualbox/id(dari direktori proyek)

Ganti dengan id yang Anda salin dari daftar VB.

Coba vagrant reload.

Jika itu tidak berhasil dan digantung pada otorisasi SSH (tempat saya tersandung), salin kunci publik yang tidak aman dari gelandangan git . Ganti konten /.vagrant/machines/default/virtualbox/private_key. Cadangan asli tentu saja: cp private_key private_key-bak.

Kemudian jalankan vagrant reload. Itu akan mengatakan itu mengidentifikasi kunci tidak aman dan membuat yang baru.

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!

Anda harus siap.

ethicka
sumber
3

Dalam Vagrant 1.9.1:

Saya memiliki VM di Virtual Box bernama 'Ubuntu 16.04.1' jadi saya mengemasnya sebagai kotak gelandangan dengan:

vagrant package --base "Ubuntu 16.04.1"

merespons dengan ...

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

Saya menggunakan Macos dan menemukan bahwa menghapus kunci di kotak memecahkan masalah saya.

Untuk beberapa alasan

vagrant halt

tidak menghapus kunci ini, dan setelah mengembalikan semua pengaturan saya di .vagrant / machine / default / virtualbox menggunakan timemachine, menghapus kunci, mesin yang tepat boot.

Hanya 1 masalah kecil yang tersisa, itu boot ke grub jadi saya harus menekan enter sekali, tidak tahu apakah ini tetap, tetapi saya akan segera mengetahuinya.

Saya menjalankan gelandangan 1.7.4 dan virtualbox 5.0.2

daij
sumber