我该如何定义vagrant中间件插件的运行顺序?

12
我正在使用vagrant在VirtualBox中创建Red Hat Enterprise Linux 7虚拟机。如果我有一个基础框,既没有VirtualBox客户端附加组件,也没有注册,那么我需要手动执行以下操作:
  • 使用subscription-manager注册框
  • 安装客户端附加组件
我需要先执行注册操作是因为要安装客户端附加组件,我需要安装一些额外的软件包。
现在,这两项任务都有第三方vagrant插件:vagrant-registrationvagrant-vbguest
我遇到的问题是,vagrant-vbguest插件将始终尝试首先运行,并且无法下载其所需的软件包,因为vagrant-registration插件尚未有机会注册系统。
是否有方法可以强制其中一个在另一个之前运行?或者有任何其他替代解决方案(我还不是vagrant巫师(或者只是称为vagrant吗?))?

也许不是你想要的答案,但你可以为虚拟机禁用vbguest插件(添加config.vbguest.auto_update = false),然后在启动后手动运行vagrant vbguest - Frederic Henri
@FredericHenri 是的,我已经想到了,谢谢。我正在寻找更好的方法。无论如何,感谢您的评论 :) - grdryn
2个回答

5

基于我的评论精神,但应更自动化地实现

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vbguest.auto_update = false

  if Vagrant.has_plugin?("vagrant-registration")
    system "vagrant vbguest --auto-reboot --no-provision" if ARGV[0] == 'up'
  end

虽然我没有尝试过,但不确定它是否会按正确的顺序运行。

编辑 这段代码的问题是它将在命令启动时立即尝试运行vbguest,因此在vm运行之前,vbguest无法安装必要的库。

另一个可能性是使用vagrant触发器插件(https://github.com/emyl/vagrant-triggers),您可以定义在特定命令运行后运行特定脚本。

config.vbguest.auto_update = false
config.trigger.after :up do
  run "vagrant vbguest --auto-reboot --no-provision"
end

机器启动后vbguest正确运行(因此我假设在vagrant-registration完成它自己的工作后)

运行vagrant up的输出(有趣的部分):

==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.0
    default: VirtualBox Version: 4.3
==> default: Mounting shared folders...
    default: /vagrant => /Users/fhenri/project/examples/vagrant/precise
==> default: Running triggers after up...
==> default: Executing command "vagrant vbguest --auto-reboot --no-provision"...
==> default: GuestAdditions versions on your host (4.3.16) and guest (4.2.0) do not match.

安装客户机增强功能并完成重启


感谢您的输入。看起来vagrant不喜欢与exec一起运行。这是我得到的(即使我将其更改为vagrant status):“Vagrant似乎在Bundler环境中运行。将使用现有的Gemfile。Vagrant将不会自动加载任何已安装的vagrant plugin插件。Vagrant将自动加载Gemfile中“plugins”组中的任何插件。您可以使用VAGRANT_FORCE_BUNDLER强制Vagrant接管。”然后似乎无限循环。 - grdryn
你是否尝试将exec替换为system - Frederic Henri
我刚刚尝试了一下,结果vagrant进程导致我的主机崩溃了。有没有办法只对特定的vagrant命令执行'exec'或'system'?我认为问题在于即使我输入vagrant status,它也会运行。 - grdryn
有一种方法可以仅运行特定命令,但它不起作用,它不等待运行。使用Vagrant触发器插件进行编辑。 - Frederic Henri

3

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