Ruby 如何以编程方式查询Vagrant的设置状态? 目标
我正在尝试有条件地运行插件。默认情况下,即使当前的vagrant操作不是配置运行,启用插件也会导致Berkself在每个Ruby 如何以编程方式查询Vagrant的设置状态? 目标,ruby,vagrant,chef-solo,berkshelf,vagrant-plugin,Ruby,Vagrant,Chef Solo,Berkshelf,Vagrant Plugin,我正在尝试有条件地运行插件。默认情况下,即使当前的vagrant操作不是配置运行,启用插件也会导致Berkself在每个vagrant up(这是一个相对昂贵的操作)上解析并提供供应商食谱。例如,我希望在运行时运行Berkshell: 第一次流浪起来,或 当我执行vagrant reload--provision时 应该有一种方法来查询Vagrant本身,以确定它是否是一个供应运行。具体地说,应该有一种方法可以连接到@env[:provision\u enabled]或vagrant.act
vagrant up
(这是一个相对昂贵的操作)上解析并提供供应商食谱。例如,我希望在运行时运行Berkshell:
,或第一次流浪起来
- 当我执行
时vagrant reload--provision
@env[:provision\u enabled]
或vagrant.actions.vm.provision
,但我无法从vagrant文件本身找到如何实现这一点
这个方法实际上是绑定到流浪对象的吗?如果没有,那么在哪里?我该如何反思呢
软件版本
- 流浪汉1.8.1
- 流浪汉4.1.0
Vagrant.configure(2) do |config|
config.berkshelf.enabled = false
config.vm.provision :chef_solo do |chef|
config.berkshelf.enabled = true
end
end
但是,每次Ivagrant up
或vagrant reload
时,Berkshellf仍然运行,这不是所需的行为。每次跑步时,食谱都会被分解并出售。考虑下面的导出输出:
==>默认值:更新流浪汉的书架…==>默认值:解析烹饪书依赖项…
==>默认值:使用karaf(0.2.1)
==>默认值:向/Users/foo/.berkshell/vagrant-berkshell/shelfs/berkshellf2016 0215-19428-unzcx1-default/karaf出售karaf(0.2.1) 不是重复的问题
有一种情况是,公认的答案是一个丑陋的黑客,它寻找.vagrant/machines/default/virtualbox/action_条款或类似条款的存在,但它不是这个问题的完全重复,因为它没有解决如何通过运行时对象或API Vagrant公开以编程方式查询Vagrant的内部状态。它可能会根据文件系统信号量给出一个实用的(如果是kludgey)答案,但它不会回答我实际提出的问题。如果您可以使用
vagrant provision
而不是--provision
标志进行设置,您可以使用Vagrantfile中的以下代码进行检查:
if ARGV[0] == 'provision'
# Run berkshelf plugin
end
条件中的代码将仅在vagrant provision
上运行。正如您所说,使用带有--provision
标志的vagrant reload
时,这将不起作用,但您可以在运行vagrant reload
后简单地运行vagrant provision
。在使用其他命令时,还可以使用if ARGV[0]==“up”
或if ARGV[0]==“reload”
来运行
请参阅:假设链接的答案曾经有效,从Vagrant 1.8.1开始,此文件只会告诉您是否设置过该框。在设置运行后,它不会被删除,因此您无法判断
--provision
标志是否已通过,因此它无助于确定当前状态。老实说,对于一个可以访问@machine属性状态的插件,我怀疑这是否可以完成config.berkself.enabled=true(如果ARGV.include?)provision“
将在显式配置运行时工作,但如果没有其他方法检查vagrant实例或文件系统,则无法真正处理第一次运行的情况。第一次运行可以通过def provision?(vm_name='default',provider='virtualbox')文件检测。存在?(File.join(File.dirname(_文件_),“.vagrant/machines/#{vm_name}/#{provider}/action_provision”)结束
(参见此)