Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何以编程方式查询Vagrant的设置状态? 目标_Ruby_Vagrant_Chef Solo_Berkshelf_Vagrant Plugin - Fatal编程技术网

Ruby 如何以编程方式查询Vagrant的设置状态? 目标

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操作不是配置运行,启用插件也会导致Berkself在每个
vagrant up
(这是一个相对昂贵的操作)上解析并提供供应商食谱。例如,我希望在运行时运行Berkshell:

  • 第一次流浪起来
    ,或
  • 当我执行
    vagrant reload--provision
应该有一种方法来查询Vagrant本身,以确定它是否是一个供应运行。具体地说,应该有一种方法可以连接到
@env[:provision\u enabled]
vagrant.actions.vm.provision
,但我无法从vagrant文件本身找到如何实现这一点

这个方法实际上是绑定到流浪对象的吗?如果没有,那么在哪里?我该如何反思呢

软件版本
  • 流浪汉1.8.1
  • 流浪汉4.1.0
我试过的 作为一种解决方法,我尝试将Berkshellf插件移动到Chef块中,希望它只在Chef provisioner运行时运行。例如:

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

  config.vm.provision :chef_solo do |chef|
    config.berkshelf.enabled = true
  end
end
但是,每次I
vagrant 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”)结束
(参见此)