【问题标题】:How can I programmatically query Vagrant for its provisioning status?如何以编程方式查询 Vagrant 的配置状态?
【发布时间】:2016-06-27 21:11:06
【问题描述】:

目标

我正在尝试有条件地运行vagrant-berkshelf 插件。默认情况下,启用插件会导致 Berkshelf 解析每个 vagrant up 上的供应商食谱(这是一个相对昂贵的操作),即使当前的 vagrant 操作不是配置运行。例如,我希望 Berkshelf 在我运行时运行:

  • vagrant up第一次,或者
  • 当我执行vagrant reload --provision时。

The source implies 应该有一种方法可以查询 Vagrant 本身以确定它是否是配置运行。具体来说,应该有一种方法可以连接到 @env[:provision_enabled]vagrant.actions.vm.provision,但我无法从 Vagrantfile 本身中弄清楚如何做到这一点。

这个方法实际上是绑定到 Vagrant 对象的吗?如果不在那里,那么在哪里?又该如何自省呢?

软件版本

  • 流浪者 1.8.1
  • vagrant-berkshelf 4.1.0

我的尝试

作为一种解决方法,我尝试将 Berkshelf 插件移动到 Chef 块中,以便它仅在 Chef 配置程序运行时运行。例如:

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

  config.vm.provision :chef_solo do |chef|
    config.berkshelf.enabled = true
  end
end

但是,每次我 vagrant upvagrant reload 时,Berkshelf 仍然运行,这不是所需的行为。食谱仍然在每次运行时得到解决和出售。考虑以下省略的输出:

==> 默认值:更新 Vagrant 的 Berkshelf...
==> 默认值:正在解决食谱依赖项...
==> 默认:使用 karaf (0.2.1)
==> 默认值:向 /Users/foo/.berkshelf/vagrant-berkshelf/shelves/berkshelf20160215-19428-unzcx1-default/karaf 供应 karaf (0.2.1)

与此不重复的问题

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

【问题讨论】:

  • 假设链接的答案 ever 有效,从 Vagrant 1.8.1 开始,此文件只是告诉您该框是否 ever 已配置。配置运行后它不会被删除,因此您无法判断 --provision 标志是否已通过,因此它无助于确定当前状态。
  • 老实说,您可以在插件中访问@machine属性的状态,我怀疑这可以做到

标签: ruby vagrant chef-solo berkshelf vagrant-plugin


【解决方案1】:

如果您可以使用 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'运行。

见:Getting command line arguments inside the Vagrantfile

【讨论】:

  • 有趣。 config.berkshelf.enabled = true if ARGV.include? 'provision' 可以在显式配置运行中工作,但如果没有其他检查 Vagrant 实例或文件系统的方法,则不会真正处理 first vagrant up 的情况。
  • 第一次运行可以用def provisioned?(vm_name='default', provider='virtualbox') File.exists?(File.join(File.dirname(__FILE__),".vagrant/machines/#{vm_name}/#{provider}/action_provision")) end检测(见SO-answer
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2021-09-12
  • 2012-04-10
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多