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

ico*_*ast 6 vagrant vagrantfile

当运行vagrant up(或vagrant provision等)时,我想在屏幕上显示一些文本,当且仅当正在进行配置时.(因为vagrant up它只是第一次运行,或者如果特别强制使用--provision.)

如何才能做到这一点?

tma*_*lai 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
Run Code Online (Sandbox Code Playgroud)

如果你喜欢过度工程,你甚至可以在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
Run Code Online (Sandbox Code Playgroud)


spo*_*rcc 5

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

目前这是不可能的,因为 Vagrantfile 在创建环境之前被解析。此信息可供配置程序和插件使用,但由于加载顺序,Vagrantfile 本身无法使用。换句话说,@env直到所有 Vagrantfile 都被解析之后,它才存在,不幸的是,这是一个硬性要求,因为 Vagrantfile 中的信息决定了该对象的创建方式。对于您的用例来说,这是一个第 22 条军规。

ARGV一种可能的替代方法是在 Vagrantfile 中进行检查。就像是:

if ARGV.include?("up") || (ARGV.include?("reload") && ARGV.include?("--provision")) 
    ... 
end
Run Code Online (Sandbox Code Playgroud)

用法示例

我在 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
Run Code Online (Sandbox Code Playgroud)

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

if (not provisioned?) || explicit_provisioning?
    ...
end
Run Code Online (Sandbox Code Playgroud)