vagrant 如何 ping 通虚拟机
vagrant 默认网络通信机制
vagrant 默认使用 NAT 端口映射,可以通过端口映射访问虚机内部端口号。但是默认情况下,vagrant 可以访问外网,但是外部世界访问不了 vagrant (类似以前在学校,学校内可以访问外网,但是外网访问不了教育网)。
如果你想在外部访问 vagrant 虚机提供的服务,需要配置端口映射,比如将虚机的端口 80 映射成 host 机的端口 8080,详见 vagrant networking basic usage:
1 | config.vm.network "forwarded_port", guest: 80, host: 8080 |
默认情况下,vagrant 虚机中有一张网卡,默认IP 10.0.2.15
。虚机可上外网,host 无法 ping 通虚机。
vagrant 其他通信机制
private network
详见vagrant networking private_network。
通常利用 provider 创建的虚拟网卡,例如 virtualBox 的 Host-Only Network。
1 | 以太网适配器 VirtualBox Host-Only Network: |
vagrant 的配置:
- 静态IP:
1 | config.vm.network "private_network", ip: "192.168.56.10" |
- 动态IP:
1 | config.vm.network "private_network", type: "dhcp" |
配置后虚机中新增一张网卡,如下的 enp0s8。
1 | vagrantxenial:~$ sudo ifconfig -a - |
此是 host 可以 ping 通虚机。
1 | C:\Users\R0>ping 192.168.56.10 |
public network
利用 provider 提供的 bridge (桥接功能)。
vagrant halt 无法关机
失败 log:
1 | E:\vagrant>Vagrant halt |
解决方法,见 issue 1659 @rfay 的回答。即将默认用户配置为 sudoers 后,还要在 /etc/sudoers 中添加 vagrant ALL=(ALL) NOPASSWD:ALL
。
1 | @dengzhp I've done this to myself any number of times by messing up the /etc/sudoers or /etc/sudoers.d. I did it today, which is why I landed here. Somewhere in /etc/sudoers (or /etc/sudoers.d if it's included) you have to have |
不过我的环境中,/etc/sudoers 默认权限为只读,因此,直接将 vagrant ALL=(ALL) NOPASSWD:ALL
添加在 /etc/sudoers.d/username 中。
1 | vagrantxenial:~$ ls -al /etc/sudoers - |
vagrantfile 添加端口映射后 vagrant up 失败
添加一个新的端口映射到 Vagrantfile,config.vm.network "forwarded_port", guest: 16385, host: 26385
。
之后执行 vagrant up
失败,log:
1 | E:\vagrant>Vagrant reload |
解决方法详见 issue 8395,配置中加上 host_id,最终端口映射的配置为 config.vm.network "forwarded_port", guest: 16385, host: 26385, host_ip: "127.0.0.1"
1
2
3
4
5
6Had the same problem on Windows 7.
This problem seems to be caused by the new host_ip parameter for the port forwarding feature.
I suggest that for compatibility reason, the default host_ip parameter should be set to 127.0.0.1 instead of 0.0.0.0
I managed to make the 1.9.3 version working by rewritten all my Vagrantfile(s) and adding the host_id: "127.0.0.1" parameter for each of the "forwarded_port" network configuration.
E.g.:
config.vm.network "forwarded_port", guest: 22, host: 1022, host_ip: "127.0.0.1", id: 'ssh'
ubuntu 16.04 32-bit box 用户名密码反人类
一般情况下,vagrant box 用户名密码都为 vagrant,但是使用的第一个 box 却违反这个规则。xenial32 的默认用户名为 ubuntu
,密码为7ea1ebda4a3d566ade4dd808
。
具体的 Box 内部 Vagrantfile 内容为:
1 | # Front load the includes |
vagrant box add base ubuntu/xenial32 具体的下载位置
windows 下具体下载位置为 C:\Users\yourName\.vagrant.d\boxes\base\
。
vagrant 如何打包?
vagrant 打包事实上使用 tar + gzip 进行打包,后缀命名为 .box
。vagrant package
命令的打包结果据说不好使,没有实测。
外网如何使用 vagrant 服务
端口映射时,ip 填 host IP
,而不是 127.0.0.1
本地地址。
如下配置,实测可在 172.x.x.x 网段 ssh 远程登陆虚机。
1 | config.vm.network "forwarded_port", guest: 16385, host: 26385, host_ip: "192.168.1.2" |
ssh 远程登陆 log:
1 | root@ubuntu:~# ssh vagrant@192.168.1.2 -p 2222 |
未决问题:bridge 模式下,跨网段 ping,内网可以 ping 通外网,外网 ping 不通内网。
三机集群配置
支持变量,以程序的方式做配置。
1 | # -*- mode: ruby -*- |