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对象吗?如果没有,那么在哪里?我怎么能反省呢?
作为一种解决方法,我尝试在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)答案,但它没有回答我实际问的问题.
如果您可以使用vagrant provision
而不是--provision
标志进行配置,您可以在 Vagrantfile 中使用以下代码进行检查:
if ARGV[0] == 'provision'
# Run berkshelf plugin
end
Run Code Online (Sandbox Code Playgroud)
条件中的代码只能在vagrant provision
. 正如您所说,vagrant reload
与标志一起使用时这将不起作用,但您可以简单地在运行后运行。使用其他命令时也可以使用或来运行。--provision
vagrant provision
vagrant reload
if ARGV[0] == 'up'
if ARGV[0] == 'reload'
归档时间: |
|
查看次数: |
712 次 |
最近记录: |