仅在配置时在Vagrantfile中运行代码

时间:2014-02-19 19:12:57

标签: vagrant vagrantfile

我想在运行vagrant up(或vagrant provision等) 时在屏幕上显示一些文字当且仅当 配置为正在完成。 (对于vagrant up,它仅在第一次运行时,或者在--provision专门强制执行的情况下运行。)

如何做到这一点?

3 个答案:

答案 0 :(得分:7)

添加shell配置程序可能是最简单的解决方案,它通过SSH在VM上执行的成本很低。

另一种选择是使用vagrant-host-shell插件:

Vagrant.configure('2') do |config|
  # other config and provisioners
  # [...]

  config.vm.provision :host_shell, inline: 'echo "Provisioned!"'
end

如果你喜欢过度工程,你甚至可以在Vagrantfile中制作自己的插件。 ;)

class EchoPlugin < Vagrant.plugin('2')
  class EchoAction
    def initialize(app, env)
      @app = app
    end

    def call(env)
      @app.call(env)
      puts "Provisioned!"
    end
  end

  name 'echo'

  action_hook 'echo' do |hook|
    hook.before Vagrant::Action::Builtin::Provision, EchoAction
  end
end

Vagrant.configure('2') do |config|
  # ...
end

答案 1 :(得分:3)

我不确定我是否正确理解了您的问题,但是如果您想要显示短信当且仅当配置运行时,您已经知道配置仅在第一个{{}上运行1}}以及使用vagrant up开关强制它时 - 为什么不直接将消息的输出添加到配置本身?

这可以像使用shell配置程序并在其中运行--provision命令一样简单。

由于Vagrant支持一个Vagrantfile中的多个配置器,并且能够在配置虚拟机时运行所有配置器,无论您是否使用shell配置器,或者您使用任何其他配置器,这都是一个非常简单的步骤

答案 2 :(得分:3)

根据Vagrant issue #7043,有人想使用@env[:provision_enabled]查看是否正在运行配置。回答说您还可以检查调用Vagrantfile的参数:

  

目前无法实现这一点,因为在创建环境之前会解析Vagrantfile。此信息可用于   供应商和插件,但不是因为Vagrantfile本身   负载排序。换句话说,@env直到之后才存在   所有Vagrantfile都已被解析,不幸的是,这很难   要求,因为Vagrantfile中的信息决定了方式   该对象已创建。这是你的用例的第22个。

     

一种可能的替代方法是检查Vagrantfile中的ARGV。   类似的东西:

if ARGV.include?("up") || (ARGV.include?("reload") && ARGV.include?("--provision")) 
    ... 
end

使用示例

我在Vagrantfile的底部添加了两个函数:

def provisioned?(vm_name='default', provider='virtualbox')
  File.exists?(File.join(File.dirname(__FILE__),".vagrant/machines/#{vm_name}/#{provider}/action_provision"))
end

def explicit_provisioning?()
   (ARGV.include?("reload") && ARGV.include?("--provision")) || ARGV.include?("provision")
end

我可以使用我的Vagrantfile中的任何语句:

if (not provisioned?) || explicit_provisioning?
    ...
end