如何获取Vagrant中public_network动态分配的DHCP IP地址
Vagrant动态获取public_network DHCP分配IP的实现方法
方案1:Vagrantfile内置直接调用(适用于集成到置备流程)
你可以直接在现有Vagrantfile基础上添加触发钩子或置备脚本,直接读取分配到的IP用于后续操作,完整示例如下:
# 原有公网配置保留 $default_network_interface = `ip route | awk '/^default/ {printf "%s", $5; exit 0}'` Vagrant.configure("2") do |config| config.vm.box = "你的基础镜像名" config.vm.network "public_network", bridge: "#$default_network_interface", use_dhcp_assigned_default_route: true # 场景A:在虚拟机内部的置备流程中使用IP config.vm.provision "shell", inline: <<-SHELL # 自动读取公网IP(适配你配置的DHCP默认路由网卡) VM_PUBLIC_IP=$(ip route get 1.1.1.1 | awk '{print $7; exit}') echo "当前虚拟机分配到的公网IP:$VM_PUBLIC_IP" # 下方直接写你需要用到IP的置备逻辑即可 SHELL # 场景B:在宿主机侧获取IP存为本地文件/变量 config.trigger.after :up do |trigger| trigger.ruby do |env, machine| # 过滤掉默认NAT网卡的10.0.2.xx段IP,取公网网卡IP public_ip = machine.guest.capability(:network_interfaces).values.flatten.find do |ip| !ip.start_with?('10.0.2.', '127.') end puts "=> 宿主机侧获取到虚拟机公网IP:#{public_ip}" # 写入本地文件供后续脚本读取 File.write('.vagrant_public_ip', public_ip) end end end
方案2:命令行手动获取(适用于Vagrant启动后外部脚本调用)
直接在宿主机执行如下命令即可输出IP:
# 直接打印IP vagrant ssh -c "ip route get 1.1.1.1 | awk '{print \$7; exit}'" 2>/dev/null # 赋值给环境变量使用 export VM_PUBLIC_IP=$(vagrant ssh -c "ip route get 1.1.1.1 | awk '{print \$7; exit}'" 2>/dev/null)
注意事项
- 上述取IP的逻辑适配你开启的
use_dhcp_assigned_default_route配置,会自动识别公网网卡,无需手动指定网卡名 - 若虚拟机有多块公网网卡,可调整
find过滤条件或者ip命令的参数匹配对应网卡即可
内容的提问来源于stack exchange,提问作者reselbob
相关产品推荐
相关产品推荐

