Làm cách nào để liên kết thư mục dự án Vagrant với VM VirtualBox hiện có?


131

Bằng cách nào đó, dự án Vagrant của tôi đã tự tách khỏi VirtualBox VM của nó, để khi tôi vagrant upVagrant sẽ nhập hộp cơ sở và tạo một máy ảo mới.

Có cách nào để liên kết lại dự án Vagrant với VM hiện tại không? Vagrant liên kết nội bộ Vagrantfile với thư mục VirtualBox VM như thế nào?

Câu trả lời:


89

CẢNH BÁO: Giải pháp bên dưới hoạt động cho Vagrant 1.0.x nhưng không phải Vagrant 1.1+.

Vagrant sử dụng tệp ".vagrant" trong cùng thư mục với "Vagrantfile" của bạn để theo dõi UUID của VM. Tập tin này sẽ không tồn tại nếu VM không tồn tại. Định dạng của tệp là JSON. Nó trông như thế này nếu một VM duy nhất tồn tại:

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

default là tên của máy ảo mặc định (nếu bạn không sử dụng các thiết lập đa VM).

Nếu VM của bạn bằng cách nào đó đã bị tách rời, những gì bạn có thể làm là VBoxManage list vmssẽ liệt kê mọi VM mà VirtualBox biết về tên và UUID của nó. Sau đó, tự tạo một .vagranttệp trong cùng thư mục với bạn Vagrantfilevà điền đúng nội dung.

Chạy vagrant statusđể đảm bảo rằng Vagrant chọn các thay đổi thích hợp.

Lưu ý: Điều này không được Vagrant hỗ trợ chính thức và Vagrant có thể thay đổi định dạng .vagrantbất cứ lúc nào. Nhưng điều này hợp lệ kể từ Vagrant 0.9.7 và sẽ hợp lệ cho Vagrant 1.0.


Tuyệt vời! Cảm ơn bạn. Tôi có cảm giác thiếu một cái gì đó.
jrdmcgr

48
Đối với Vagrant 1.1, các UUID được lưu trữ trong một tệp dành riêng cho máy tại .vagrant/machines/{name}/{provider}/id. Trong thực tế, thứ duy nhất mà tập tin chứa là UUID.

2
Tôi đã thử mẹo này nhưng trạng thái mơ hồ chỉ đơn giản là báo cáo trạng thái là không được tạo. Vagrant lên sau đó tạo ra một vm mới và hoạt động tốt. Nếu tôi thay đổi tệp id thì nó báo cáo là không được tạo, ngay cả khi tôi thay đổi lại thành uuid của hộp mà nó vừa tạo.
Reece Marsland

4
Với Vagrant 1.1+, đảm bảo bạn không thêm dòng mới vào cuối id. Xem github.com/mitchellh/vagrant/issues/1755 để biết chi tiết
Mads Mobæk

1
Tôi đã tìm kiếm .vagrant trong hồ sơ của tôi (Mac). Lưu ý rằng (ít nhất là đối với tôi) nó nằm trong cùng thư mục với thư mục cookbooks và VagrantFile. (Phiên bản Vagrant 1.4.3)
allicarn

207

Đối với Vagrant 1.6.3, hãy làm như sau:

1) Trong thư mục chứa Vagrantfile của bạn, hãy chạy lệnh

VBoxManage list vms

Bạn sẽ có một cái gì đó như thế này:

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

2) Đi đến đường dẫn sau:

cd .vagrant/machines/default/virtualbox

3) Tạo một tệp có tên id bằng ID của VM xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx của bạn

4) Lưu tập tin và chạy lên


8
Một cách tốt để tạo idtập tin mà không cần một dòng mới là echo -n '<your id here>' > id.
Xiong Chiamiov

1
Công trình tuyệt vời. Nhưng tại sao điều này xảy ra?
JohnnyQ

Làm việc cho tôi với Vagrant 1.7.2. Cảm ơn!
Rafen 11/2/2016

1
Làm việc hoàn hảo.
Casey Robinson

# hộp test1 và 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

Các giải pháp với phiên bản trên là khá giống nhau.

Nhưng trước tiên, bạn cần khởi chạy tệp .vbox bằng tay để nó xuất hiện trong VBoxManage list vms

Sau đó, bạn có thể kiểm tra .vagrant/machines/default/virtualbox/idđể kiểm tra xem uuid có đúng không.


4
Ngoài ra, điều đáng chú ý là nếu bạn đang chỉnh sửa idtệp, bạn phải giữ nó thành một dòng duy nhất. Vì một số lý do, cuối cùng nó không thích dòng mới (trình soạn thảo văn bản của tôi thêm nó theo mặc định, vì vậy tôi gặp vấn đề).
Dan2552

Tôi gặp phải một vấn đề với điều này vì tôi đã đổi tên thư mục chứa nó. Vagrant khăng khăng tạo ra một VM mới có cùng tên với thư mục, thay vì sử dụng VM hiện có. Tôi đã sửa nó bằng cách tạo một .vagranttệp ở định dạng 1.0 và nó tự động nâng cấp nó. Ngay sau khi tôi làm, nó thực sự đã đổi tên VM cũ thành tên thư mục dự án mới.
Giô-na

2
Tôi không chắc chắn điều gì đã gây ra sự ngắt kết nối trong đó vagrant / Machines / default / virtualbox / id của tôi trỏ đến id máy VirtualBox sai. Tệp trợ giúp là $ HOME / .VirtualBox / VirtualBox.xml. Nó có phần MachineRegistry có UUID của máy VirtualBox được ánh xạ tới tên máy. Ví dụ: <MachineEntry uuid = "{f232f951-103b-af28-9f8d-b2ab21bs258f}" src = "$ HOME / VirtualBox VMs \ <tên máy> \ <tên máy> .vbox" />
arntg

14

Có vấn đề ngày hôm nay, .vagrantthư mục của tôi bị thiếu và thấy rằng có một vài bước hơn là chỉ đơn giản là thiết lập id:

  1. Đặt id:

    VBoxManage list vms
    

    Tìm id và đặt trong {project-folder}/.vagrant/machines/default/virtualbox/id.

    Lưu ý rằng defaultcó thể khác nhau nếu được đặt trong Vagrantfileví dụ của bạn config.vm.define "someothername".

  2. Dừng máy cung cấp:

    Tạo một tệp có tên action_provisiontrong cùng một thư mục với idtệp, đặt nội dung của nó thành: 1.5:{id}thay thế {id}bằng id được tìm thấy trong bước 1.

  3. Thiết lập khóa công khai / riêng tư mới:

    Vagrant sử dụng khóa riêng được lưu trữ .vagrant/machines/default/virtualbox/private_keyđể ssh vào máy. Bạn sẽ cần phải tạo một cái mới.

    ssh-keygen -t rsa
    

    tên nó private_key.

    vagrant sshsau đó sao chép private_key.pubvào /home/vagrant/.ssh/authorized_keys.


"ủy quyền" là một tập tin hoặc thư mục?
dùng2568374

đó là một tập tin, nếu bạn tìm kiếm trên đó, bạn sẽ tìm thấy rất nhiều thứ, đó là một thứ ssh tiêu chuẩn
Petecoop 16/2/2017

Bởi vì tôi đang sử dụng các khóa giống nhau, tôi không phải thực hiện setp cuối cùng (thứ ba). Nếu không, thực sự giải thích tốt và mọi thứ hoàn hảo.
Dazag

Cách thực hiện bước thứ ba trên win10
navono

9

Cập nhật với cùng một vấn đề ngày hôm nay với Vagrant 1.7.4:

Ví dụ: để ghép nối hộp 'vip-quickstart_default_1431365185830_12124' thành mơ hồ.

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

6

Đối với các thiết lập đa VM, nó sẽ trông như thế này:

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

Bạn có thể lấy tên vm từ Vagrantfile được sử dụng để tạo các VM đó. Tìm dòng này:

config.vm.define :web do |web_config|

"Web" là tên của vm trong trường hợp này.


db là một VM mặc định ??
Robert

1
Tôi không nghĩ có một mặc định ở đây, chỉ có web và db. Tùy thuộc vào Vagrantfile, có một thứ tự vm được xây dựng đầu tiên.
agwntr

5

Tôi đang sử dụng Vagrant 1.8.1 trên OSX El Capitan

Vm của tôi không được tắt chính xác khi máy tính của tôi khởi động lại, vì vậy khi tôi thử vagrant upnó luôn tạo ra vm mới. Không có giải pháp nào ở đây làm việc cho tôi. Nhưng những gì đã làm là một biến thể của câu trả lời của ingmmurillo

Vì vậy, thay vì tạo .vagrant/machines/default/virtualbox/iddựa trên id từ chạy VBoxManage list vms. Tôi đã phải cập nhật id trong.vagrant/machines/local/virtual_box/id

Tôi đã có một lớp lót về cơ bản làm điều này cho tôi:

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

Giả định hộp đầu tiên này là hộp tôi cần bắt đầu chạy VBoxManage list vms


4

Điều này được sửa đổi từ câu trả lời của @ Petecoop .

Chạy vagrant haltnếu bạn chưa tắt hộp.

Sau đó liệt kê các hộp ảo của bạn: VBoxManage list vms

Nó sẽ liệt kê tất cả các hộp ảo của bạn. Xác định hộp bạn muốn hoàn nguyên và lấy id giữa các dấu ngoặc nhọn : {}.

Sau đó chỉnh sửa tệp id dự án: sudo nano .vagrant/machines/default/virtualbox/id(từ thư mục dự án)

Thay thế nó bằng id bạn đã sao chép từ danh sách VB.

Hãy thử vagrant reload.

Nếu điều đó không hoạt động và bị treo trên ủy quyền SSH (nơi tôi vấp ngã), hãy sao chép khóa công khai không an toàn từ git mơ hồ . Thay thế nội dung của /.vagrant/machines/default/virtualbox/private_key. Sao lưu bản gốc của khóa học : cp private_key private_key-bak.

Sau đó chạy vagrant reload. Nó sẽ nói rằng nó đã xác định khóa không an toàn và tạo một khóa mới.

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!

Bạn nên được thiết lập tất cả.


3

Trong Vagrant 1.9.1:

Tôi đã có một VM trong Virtual Box có tên 'Ubuntu 16.04.1' vì vậy tôi đã đóng gói nó như một hộp mơ hồ với:

vagrant package --base "Ubuntu 16.04.1"

trả lời với ...

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

0

Tôi đang dùng macos và thấy rằng việc loại bỏ .locks trên các hộp đã giải quyết vấn đề của tôi.

Đối với một số lý do

vagrant halt

đã không xóa các khóa này và sau khi khôi phục tất cả các cài đặt của tôi trong .vagrant / machine / default / virtualbox bằng timemachine, xóa các khóa, đúng máy đã khởi động.

Chỉ còn 1 vấn đề nhỏ, Nó đã khởi động thành grub nên tôi phải nhấn enter một lần, không biết điều này có tồn tại không, nhưng tôi sẽ sớm tìm ra.

Tôi đang chạy vagrant 1.7.4 và virtualbox 5.0.2

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.