在主机启动Vagrant虚拟机

23

我对Vagrant不太熟悉,但已经建立了几个用于开发和测试的Vagrant虚拟机。我的问题是,无法让这些虚拟机在我的机器(Ubuntu)上自动启动。每次主机启动时都需要去文件夹中执行vagrant up非常麻烦。

我尝试添加一个cronjob,看起来像cd path/to/vm/folder && vagrant up,但这似乎没有起作用。

我还尝试了使用VBoxManage的cronjob,但是每次虚拟机启动时,Vagrant会更改虚拟机的名称(而不是数字/版本“vmname_version”)。

4个回答

18

这里不适合使用定时任务Cron job,它是用于调度作业的。

由于您正在运行Ubuntu主机,我建议使用/etc/rc.local,将命令放在rc.local脚本中,在初始化进程结束时执行。

它看起来会像这样:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.    
cd /path/to/vagrant_vm1 && vagrant up
cd /path/to/vagrant_vm2 && vagrant up
exit 0

注意: 如果您使用相同的网络模式 - NAT(默认情况下),启动多个 Vagrant boxes ,将在主机上发生端口冲突,因为它们默认使用相同的端口转发规则 => 客户机 22 到 主机 2222。

如果您需要启动多于1个NAT框,请考虑使用公共网络(桥接)或使用VBoxManage controlvm来启动VMs,请参阅Two separate Vagrant machines, windows host, PuTTY - how?中的答案。


理论上这正是我想要的,但是Vagrant似乎在这方面遇到了一些问题。它会到达“等待VM启动”的步骤,但无法成功启动它,最终出现错误提示:“无法通过SSH连接到VM,请通过查看VirtualBox GUI来验证VM是否成功启动。”不管怎样,还是谢谢! - Shrikant Patnaik
@ShrikantPatnaik 请查看更新的答案。我认为您正在启动多个vagrant盒子时遇到了端口冲突问题。 - Terry Wang
Ports和其他一切都已经配置正确,因为我同时运行它们而没有任何问题,controlvm也可以工作,但是我不得不像我在自己的答案中回复的那样对它们进行克隆。 - Shrikant Patnaik
如果您使用默认的NAT模式并开始使用vagrant up,它将尝试进行端口转发(guest 22 => host 2222)以用于所有虚拟机。这将导致冲突,但我意识到这可能不足以阻止虚拟机启动。 - Terry Wang
但如果我逐个手动调用VM上的vagrant up,这不也会成为一个问题吗? - Shrikant Patnaik
1
在Ubuntu 16.04中,我通过指定vagrant命令的完整路径并从最初使用vagrant的用户运行vagrant来使其正常工作。该命令如下所示:cd /path/to/vagrant_vm1 && su -c "/usr/bin/vagrant up" myuser - Oleksii Zymovets

7
以下是自动启动vagrant虚拟机的upstart脚本,可在以下链接找到:http://uhowto.urbylog.info/post/54097294891/an-upstart-script-to-launch-vagrant-box-automatically 有时,在主机启动时自动启动vagrant虚拟机可能是必要的。同样,在关闭或重启主机时为客户提供优美的关机方式。 以下是一个用于代表随机用户启动/关闭vagrant box的Upstart脚本示例。 请在下面的脚本中更改用户名和Vagrantfile目录。为您的Upstart配置文件命名描述性。为每个需要在系统引导时运行的Vagrantfile创建一个/etc/init/*.conf文件。
description "Start vagrant precise32 box on system startup"
author "uHOWTO"
env VAGRANTUSR=randomjoe
env VAGRANTBOXPATH=/home/randomjoe/vagrantboxes/precise32
start on stopped rc
stop on runlevel [016]

pre-start script
    cd ${VAGRANTBOXPATH}
    su -c "/usr/bin/vagrant up" ${VAGRANTUSR}
end script

post-stop script
    cd ${VAGRANTBOXPATH}
    su -c "/usr/bin/vagrant halt" ${VAGRANTUSR}
end script

1

我最终得到了一个简单的cron任务。我不得不加入一个睡眠时间,否则Virtualbox会抱怨它没有正确初始化。

@reboot cd /home/myuser/VMs/VagrantBox && sleep 20; /bin/su -c "/usr/bin/vagrant up" myuser

0

最终我使用VboxManage克隆了虚拟机,并在init.d脚本中使用VBoxManage startvm $vm --type headless来启动。


既然您已经满意于 VBoxManageVBoxHeadless,那么 vagrant 就可以忽略了。 - Terry Wang
基本上是这样,但我认为它有点不太正规。 - Shrikant Patnaik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接