You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 19:09:04