如何在Vagrant机器正在预配时解锁它

5
我们的Vagrant Box需要大约1小时的时间进行配置。因此,当第一次运行vagrant up命令时,在配置过程的最后,我想将该Box打包成一个镜像保存在本地文件夹中,以便下一次需要重新构建时可以使用该镜像作为基础Box。我使用vagrant-triggers插件,在:up进程末尾放置代码。
相关(简化)Vagrantfile:
pre_built_box_file_name = 'image.vagrant'
pre_built_box_path      = 'file://' + File.join(Dir.pwd, pre_built_box_file_name)
pre_built_box_exists    = File.file?(pre_built_box_path)
Vagrant.configure(2) do |config|
  config.vm.box     = 'ubuntu/trusty64'
  config.vm.box_url = pre_built_box_path if pre_built_box_exists
  config.trigger.after :up do
    if not pre_built_box_exists
      system("echo 'Building gett vagrant image for re-use...'; vagrant halt; vagrant package --output #{pre_built_box_file_name}; vagrant up;")
    end
  end
end

问题在于vagrant在当前(vagrant up)进程运行时锁定了机器:
An action 'halt' was attempted on the machine 'gett',
but another process is already executing an action on the machine.
Vagrant locks each machine for access by only one process at a time.
Please wait until the other Vagrant process finishes modifying this
machine, then try again.

我知道在同一时间进行两个进程的配置或修改可能存在危险,但这是一个特殊情况,我可以确定配置已经完成。

我如何手动“解锁”vagrant机器以便我可以从config.trigger.after :up中运行vagrant halt; vagrant package; vagrant up;

还是有一种方法可以启动vagrant up而不锁定机器吗?


为什么不直接从命令行运行 vagrant up && vagrant halt && vagrant package && vagrant up 呢? - Jon Burgess
我原以为简单的vagrant up命令会处理掉vagrant box add ...或者vagrant box remove ... && vagrant box add ...这些命令,以防止因为重新构建而删除了image.vagrant文件。也许我在这里过于复杂化了。 - Vigintas Labakojis
ps aux | grep "vagrant" 复制进程的 PID,然后执行 kill -9 <PID> - andilabs
2个回答

3

Vagrant

这个问题在 GH #3664 (2015) 中已经被解决。如果仍然发生,请尝试禁用插件(如 AWS)。

vagrant-aws

如果您正在使用 AWS,则请遵循此错误/功能报告:#428 - Unable to ssh into instance during provisioning,该请求目前正在等待处理。

但是,有一个 pull 请求可以修复此问题:

因此,可以手动应用修复或等待下一版本发布。


如果出现与无效机器相关的错误,请尝试运行命令vagrant global-status --prune


嗨,感谢您的努力,但正如问题中所述,我需要一种在“vagrant up”期间解锁机器的方法。与AWS无关,“vagrant ssh”或“vagrant status”。 - Vigintas Labakojis
第一个问题与Vagrant本身有关,听起来已经解决了,第二部分只是为了防止您使用AWS。 - kenorb

0

这绝对是一个比解决方案更像是hack的东西,但我宁愿有一个hack也不要什么都没有。

我遇到了这个问题,这里建议的任何方法都对我没用。即使这篇文章已经6年了,但它是谷歌搜索结果中唯一的(连带着其他很少的东西),我想分享一下我是如何解决它的,以防其他人也会来到这里。

我的设置


我正在使用vagrant和ansible-local provisioner在本地的虚拟机上,用于配置远程的AWS EC2实例。(即ansible-local运行在虚拟机实例上,vagrant提供虚拟机实例,ansible处理云端)。这个设置主要是因为我的主机操作系统是Windows,在这个环境中排除Microsoft有点容易一些。

我的错误


通过ansible运行了一个带有命令的shell任务,但该命令不会在没有用户输入的情况下终止(并且未使用&运行在后台)。

我的挫败感


即使在Linux子系统中,尝试使用ps aux | grep rubyps aux | grep vagrant也没有帮助,因为PID每次都会改变。可能有一个原因,很可能与子系统的工作方式有关,但我不知道这个原因是什么。

我的解决方案


手动杀死AWS EC2实例。在控制台中,在CLI中,选择您的喜好。您运行vagrant provisionvagrant up的终端应该最终完成并输出摘要输出,即使您已经从命令中退出ctrl + C

希望这能帮助到某些人!


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