如何以编程方式查询Vagrant的配置状态?

Tod*_*obs 7 ruby vagrant chef-solo berkshelf vagrant-plugin

目标

我试图有条件地运行vagrant-berkshelf插件.默认情况下,vagrant up即使当前的流浪者操作不是配置运行,启用插件也会导致Berkshelf在每一个上解析和供应烹饪书(这是一个相对昂贵的操作).例如,我希望Berkshelf在我运行时运行:

  • vagrant up 第一次,或
  • 当我执行vagrant reload --provision.

来源暗示应该有一种方法来查询Vagrant本身以确定它是否是供应运行.具体来说,应该有一种方法可以挂钩@env[:provision_enabled]或者vagrant.actions.vm.provision,但我无法弄清楚如何在Vagrantfile本身内执行此操作.

这个方法实际上是绑定到Vagrant对象吗?如果没有,那么在哪里?我怎么能反省呢?

软件版本

  • 流浪者1.8.1
  • vagrant-berkshelf 4.1.0

我试过的

作为一种解决方法,我尝试在Chef块中移动Berkshelf插件,意图它只在Chef配置器执行时运行.例如:

Vagrant.configure(2) do |config|
  config.berkshelf.enabled = false

  config.vm.provision :chef_solo do |chef|
    config.berkshelf.enabled = true
  end
end
Run Code Online (Sandbox Code Playgroud)

然而,Berkshelf仍然运行每次我vagrant up还是vagrant reload,这是不期望的行为.每次运行时,烹饪书仍然可以解决和销售.考虑以下省略的输出:

==>默认:更新Vagrant的Berkshelf ...
==>默认:解决cookbook依赖...
==>默认:使用karaf(0.2.1)
==>默认:将karaf(0.2.1)提供给/ Users /富/ .berkshelf /游民,berkshelf /货架/ berkshelf20160215-19428-unzcx1默认/ karaf

与这一问题不重复的问题

有一个模糊的相关问题,其中接受的答案是一个丑陋的黑客,它寻找.vagrant/machines/default/virtualbox/action_provision或类似的存在,但它不是这个问题的完全重复,因为它没有解决如何以编程方式通过运行时对象或API Vagrant公开查询Vagrant的内部状态.它可能包含基于文件系统信号量的实用(如果是kludgey)答案,但它没有回答我实际问的问题.

Dan*_*ing 1

如果您可以使用vagrant provision而不是--provision标志进行配置,您可以在 Vagrantfile 中使用以下代码进行检查:

if ARGV[0] == 'provision'
  # Run berkshelf plugin
end
Run Code Online (Sandbox Code Playgroud)

条件中的代码只能在vagrant provision. 正如您所说,vagrant reload与标志一起使用时这将不起作用,但您可以简单地在运行后运行。使用其他命令时也可以使用或来运行。--provisionvagrant provisionvagrant reloadif ARGV[0] == 'up'if ARGV[0] == 'reload'

请参阅:在 Vagrantfile 中获取命令行参数