7

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

如何才能做到这一点?

4

3 回答 3

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
于 2014-02-20T14:43:49.003 回答
4

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

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

一种可能的替代方法是检查ARGV您的 Vagrantfile。就像是:

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
于 2017-08-10T11:21:48.463 回答
3

我不确定我是否正确理解了您的问题,但是如果您想在配置运行时且仅在配置运行时显示短信,并且您已经知道配置仅在首先运行vagrant up并且在使用--provision开关强制它时运行 - 那么为什么不只是将消息的输出添加到配置本身?

这可以像使用 shell 配置器并在其中运行echo命令一样简单。

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

于 2014-02-19T19:16:32.280 回答