熟练使用vagrant(16):WSL中使用vagrant
可以在wsl中使用vagrant,且wsl中的vagrant可以和宿主机Win10上的virtualbox、hyper-v交互。
假如wsl是ubuntu,那么wsl中就可以直接apt install vagrant
。但是要求wsl中安装的vagrant的版本和宿主机win10上安装的vagrant版本要相同。
因此,如果win10上安装的vagrant是2.2.10版,那么wsl ubuntu中也必须安装2.2.10版的vagrant。通过包管理工具(比如apt/yum)安装的vagrant可能会版本不够,需要在vagrant官网下载对应版本的包:各版本vagrant下载地址。
如果要使用virtualbox作为Provider,建议不要使用wsl2,因为wsl2自身是完整的虚拟机,其IP地址和宿主机是隔离的,这会导致vagrant ssh访问不到vagrant创建的不带private_network、public_network的virtualbox的虚拟机。
如果非要使用wsl2,需确保自己有能力解决以上问题。另外可参考下面我给出的wsl2上Vagrantfile的配置。
在wsl 1中安装好vagrant后,还需要在wsl中设置下面两个环境变量:
1 2 3 4 5 6 7 8
| export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
export VAGRANT_WSL_WINDOWS_ACCESS_USER_HOME_PATH="/mnt/v/vagrant_imgs"
|
为了以后方便使用,可见上面设置环境变量的操作写入.bashrc
中。
另外注意,有些box默认已经配置了synced_folder
,在wsl中是不能使用目录同步功能的,如果有相关报错,需要在Vagrantfile中加上一行:
1
| config.vm.synced_folder ".", "/vagrant", disabled: true
|
下面是我在wsl2上使用vagrant的Vagrantfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Vagrant.configure("2") do |config| config.vm.box = "generic/ubuntu2004" config.vm.define "wsl_ubuntu2004" config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.network "forwarded_port", guest: 22, host:23333
config.ssh.host = "172.22.192.1" config.ssh.port = 23333 config.vm.provider "virtualbox" do |vb| vb.name = "wsl_ubuntu2004" end end
|
下面是wsl2上三个虚拟机的Vagrantfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| Vagrant.configure("2") do |config| config.vm.box = "generic/ubuntu2004" config.vm.synced_folder ".", "/vagrant", disabled: true config.ssh.host = "172.22.192.1"
config.vm.define "wsl_ubuntu1" do |t| t.vm.network "forwarded_port", guest: 22, host:23333 t.ssh.port = 23333 t.vm.provider "virtualbox" do |vb| vb.name = "wsl_ubuntu1" end end
config.vm.define "wsl_ubuntu2" do |t| t.vm.network "forwarded_port", guest: 22, host:23334 t.ssh.port = 23334 t.vm.provider "virtualbox" do |vb| vb.name = "wsl_ubuntu2" end end
config.vm.define "wsl_ubuntu3" do |t| t.vm.network "forwarded_port", guest: 22, host:23335 t.ssh.port = 23335 t.vm.provider "virtualbox" do |vb| vb.name = "wsl_ubuntu3" end end end
|
这时甚至可让vagrant up
并行创建这三个虚拟机:
1 2 3 4 5 6
| $ vagrant status --machine-readable | grep -oP '\w+(?=,meta)' wsl_ubuntu1 wsl_ubuntu2 wsl_ubuntu3
$ vagrant status --machine-readable | grep -oP '\w+(?=,meta)' | xargs -P 3 -i vagrant up {}
|