【发布时间】: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 up 或 vagrant 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