VirtualBox的解决方法 保存没有获得NAT地址的Vagrant镜像


作为测试和展示我们先进的部署自动化的一部分 1 平台 部署 ,我们在 xebialabs 使用大量的云计算和devops工具,以便能够处理所有 不同类型的中间件,我们支持和建立,CI和OPS工具 。 与之整合 2 .

我最近正在设置一个 流浪者 3 环境,以演示deployit的puppet模块,该模块 自动将新的puppet配置的中间件注册到你的 部署自动化平台,以便将应用层部署到 它,并最终与一个棘手的 的问题搏斗了相当长的时间 虚拟盒 问题。

的问题 已经存在了两年多了,与virtualbox的dhcp服务器有关 有时 在尚未确定的情况下,无法为NAT接口分配IP地址。
因为所有vagrant管理的镜像默认都有一个nat接口 4 这就有点不方便了:在vm配置阶段,vagrant干脆挂掉了。

由于这个问题不是确定性地发生的,所以有一种方法可以解决 绕过这个问题的一个方法是简单地避免重启镜像:玩 玩 "NAT**",直到你通过杀死vboxmanage进程而获得幸运。 如果镜像被挂起,再尝试vagrant up,那么运行vagrant suspend而不是vagrant halt,你可以在需要时恢复镜像。

工作,但我并不特别满意这种 因为,除了我不喜欢反复 的想法之外。 杀死管理程序(在这方面我有点像和平主义者 ;-) ),它有效地 "削弱 "了vagrant:你可以轻松地 你可以轻松地启动、停止和重新配置镜像,这正是 使得vagrant如此有用!

我很快发现的一件事是,如果你通过vagrant创建的镜像启动 vagrant创建的镜像通过virtualbox ui启动,它就会出现 问题 5 循环NAT适配器,用ifdown eth0 && ifup eth0修复了问题:这第二次,它 能够从dhcp服务器上获取一个ip地址。

不幸的是,这并不能让你在vagrant 试图启动的镜像:vagrant创建了无头会话,所以你 不能通过virtualbox ui实际访问它们,直到你杀死 vagrant和它启动的vboxheadless进程。
4月24日编辑,补充:见 richard pot的评论 关于如何在gui模式下启动盒子的说明。

幸运的是,virtualbox允许你在客户操作系统上执行命令 而不需要 因此,当vagrant在等待连接到镜像时再次挂起时,我尝试的第一件事就是

/path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout ifdown eth0
/path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout ifup eth0

那个 做了 正如所希望的那样,允许NAT适配器接收一个IP地址。 不幸的是,这也使vagrant感到困惑,它 (估计是认为镜像已经下线)退出了。

可喜的是,你不需要关闭适配器来请求一个新的IP地址。 dhclient 会做得很好。事实上,

/path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout dhclient

成功:NAT适配器获取了一个IP地址,几秒钟后,vagrant继续进行图像配置。

希望能帮上忙,即使它确实需要再花几年时间来解决实际问题 ;-)

脚注
  1. 或应用发布自动化(ARA),如果你关注Gartner的话
  2. 检查 平台支持页面 以了解详情
  3. 对于那些不熟悉 的人 vagrant , 它是一个强大的工具(用Ruby编写),允许你声明式地 它允许你根据被称为 "盒子 "的模板来声明地定义多个相关的虚拟镜像。 vagrant协调了与 虚拟盒 来给你一个非常简单的方法来停止、启动和配置一个镜像集群。 在这个意义上,它有点像一个基于virtualbox的 cloudformation .
  4. 这就是vagrant在配置镜像时与之沟通的方式
  5. 你会知道,因为ifconfig会显示eth0适配器没有一个ipv4地址