我一直在使用 Capistrano 开发自动化部署,并使用 Vagrant 作为我的测试虚拟服务器。
问题是,我需要 Vagrant 的 IP 才能“ssh
融入其中”。
我尝试ifconfig
并获得了 IP,但看起来它不是确切的流浪 IP。
任何人都可以帮我获得 Vagrant IP 吗?
我一直在使用 Capistrano 开发自动化部署,并使用 Vagrant 作为我的测试虚拟服务器。
问题是,我需要 Vagrant 的 IP 才能“ssh
融入其中”。
我尝试ifconfig
并获得了 IP,但看起来它不是确切的流浪 IP。
任何人都可以帮我获得 Vagrant IP 吗?
默认情况下,vagrant box 没有任何 IP 地址。为了找到 IP 地址,您只需在Vagrantfile
then 调用中分配 IP 地址vagrant reload
如果您只需要从主机访问 vagrant 机器,那么您只需要设置“私有网络”即可。取消注释 default 中的相应行Vagrantfile
,或添加此代码段。如果您希望您的虚拟机出现在172.30.1.5
它上面,则如下所示:
config.vm.network "private_network", ip: "172.30.1.5"
了解有关专用网络的更多信息。https://www.vagrantup.com/docs/networking/private_network.html
如果您需要在主机之外访问 vagrant,例如针对 iOS 或 Android 等移动设备进行开发,则必须启用公共网络,您可以使用静态 IP(例如192.168.1.10
DHCP)或 DHCP。
config.vm.network "public_network", ip: "192.168.1.10"
了解有关配置公共网络的更多信息https://www.vagrantup.com/docs/networking/public_network.html
我发现我确实需要 IP 才能/etc/hosts
在主机系统上配置以指向新 VM 上的服务。
这是我用来获取 IP 的粗略版本。让 Vagrant 发挥它的 SSH 魔法,向虚拟机询问它的地址;根据您的需要进行调整。
new_ip=$(vagrant ssh -c "ip address show eth0 | grep 'inet ' | sed -e 's/^.*inet //' -e 's/\/.*$//'")
我刚刚在Vagrant Docs中找到了这个。看起来他们认为这是一种有效的方法:
这将自动从保留的地址空间分配一个 IP 地址。可以通过使用 vagrant ssh SSH 进入机器并使用适当的命令行工具(例如 ifconfig)找到 IP 地址来确定 IP 地址。
跑:
vagrant ssh-config > .ssh.config
然后在config/deploy.rb
role :web, "default"
role :app, "default"
set :use_sudo, true
set :user, 'root'
set :run_method, :sudo
# Must be set for the password prompt from git to work
default_run_options[:pty] = true
ssh_options[:forward_agent] = true
ssh_options[:config] = '.ssh.config'
打开一个终端,cd 到你的 Vagrantfile 的路径并写下这个
(Linux)
vagrant ssh -c "hostname -I | cut -d' ' -f2" 2>/dev/null
(OS X)
vagrant ssh -c "hostname -I | cut -d' ' -f2" 2>/dev/null | pbcopy
Linux 的命令也适用于 Windows。我没有办法测试,对不起。
来源:https ://coderwall.com/p/etzdmq/get-vagrant-box-guest-ip-from-host
我为此开发了一个小型vagrant-address插件。它简单、跨平台、跨供应商,并且不需要编写脚本。
在终端类型中:
ip addr show
我在 VagrantFile 做过:
REMOTE_IP = %x{/usr/local/bin/vagrant ssh-config | /bin/grep -i HostName | /usr/bin/cut -d\' \' -f4}
run "ping #{REMOTE_IP}"
如您所见,我使用了 "%x{}" ruby 函数。
终止打开的连接vagrant ssh
将显示地址,因此可以执行虚拟或空命令:
$ vagrant ssh -c ''
Connection to 192.168.121.155 closed.
我们使用 VirtualBox 作为提供者,对于虚拟盒子,您可以使用它VBoxManage
来获取 IP 地址
VBoxManage guestproperty get <virtual-box-machine-name> /VirtualBox/GuestInfo/Net/1/V4/IP
我需要知道这一点来告诉用户要向其主机的主机文件添加什么。这仅使用 bash 在 vagrant 中对我有用:
external_ip=$(cat /vagrant/config.yml | grep vagrant_ip | cut -d' ' -f2 | xargs)
echo -e "# Add this line to your host file:\n${external_ip} host.vagrant.vm"
因为我还没有在这里看到它......当你vagrant ssh
进入盒子时,我意识到它实际上告诉你接口的IP地址。你可以在那里得到它。例如。
{~/Documents/jupyterhub-ansible} (features *%)$ vagrant ssh
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-50-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed May 22 12:00:34 UTC 2019
System load: 0.12 Processes: 101
Usage of /: 56.5% of 9.63GB Users logged in: 0
Memory usage: 19% IP address for enp0s3: 10.0.2.15
Swap usage: 0% IP address for enp0s8: 192.168.33.10
10 packages can be updated.
1 update is a security update.
Last login: Wed May 22 12:00:04 2019 from 192.168.33.1
vagrant@ubuntu-bionic:~$
在我的流浪文件中,我分配了这样的地址:
config.vm.network "private_network", ip: "192.168.33.10"
如你所见,
IP address for enp0s8: 192.168.33.10
我遇到了这样的事情,所以我在 Vagrant 框中添加了运行 bash 脚本,并在主机文件夹中输出公共 IP 地址文件。
在 Vagrantfile 中添加这个
...
config.vm.provision "shell", path: "public-ip.sh"
config.vm.synced_folder '.', '/vagrant'
...
在同一个 Vagrantfile 文件夹中创建 bash 脚本名称 public-ip.sh
#!/bin/bash
# change eth1 to your desired network interface, in my vagrantfile i have first NAT and second is bridge dhcp network and i want to know random dhcp IP.
box_ip=$(ip address show eth1 | grep 'inet ' | sed -e 's/^.*inet //' -e 's/\/.*$//')"
echo "$box_ip" | tee public_ip.txt
echo "add box ip to your host machine /etc/hosts entry so you can connect the box using box hostname"
当您执行 vagrant up 时,您将看到公共 ip 或私有 ip 框的 vagrant 输出,您可以在任何时候使用将其添加到主机条目
我知道这篇文章很旧,但我想对此补充几点!
你可以试试
vagrant ssh -c "ifconfig | grep inet" hostname
如果您为您的客人单独设置了一个名字,这将很容易!