Vagrant 仅在设置时在文件中运行代码

Vagrant 仅在设置时在文件中运行代码,vagrant,vagrantfile,Vagrant,Vagrantfile,我想在运行vagrant up(或vagrant provision等)时在屏幕上显示一些文本当且仅当设置完成时。(对于vagrant up而言,它仅在第一次运行时运行,或者如果使用--规定强制运行) 如何做到这一点?我不确定是否正确理解了您的问题,但如果您希望在且仅在设置运行时显示文本消息,您已经知道,设置只在第一个vagrant up上运行,当使用--provision开关强制它时,为什么不将消息的输出添加到设置本身 这可能很简单,只需使用shell provisioner并在其中运行ech

我想在运行
vagrant up
(或
vagrant provision
等)时在屏幕上显示一些文本当且仅当设置完成时。(对于
vagrant up
而言,它仅在第一次运行时运行,或者如果使用
--规定
强制运行)


如何做到这一点?

我不确定是否正确理解了您的问题,但如果您希望在且仅在设置运行时显示文本消息,您已经知道,设置只在第一个
vagrant up
上运行,当使用
--provision
开关强制它时,为什么不将消息的输出添加到设置本身

这可能很简单,只需使用shell provisioner并在其中运行
echo
命令即可


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

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

另一种选择是使用插件:

Vagrant.configure('2')do | config|
#其他配置和供应器
# [...]
config.vm.provision:host_shell,内联:“echo”Provisioned!”
结束
如果你喜欢过度工程化,你甚至可以在Vagrantfile中制作自己的插件

类EchoPlugin根据某人希望使用
@env[:provision\u enabled]
查看是否正在运行资源调配。答案是,您还可以检查调用Vagrantfile时使用的参数:

这在当前是不可能的,因为Vagrant文件是在创建环境之前解析的。此信息可供参考 提供程序和插件,但不是Vagrant文件本身,因为 加载顺序。换句话说,
@env
在之后才存在 所有的Vagrantfile都已被解析,不幸的是这是一个困难的问题 要求,因为文件中的信息决定了方法 该对象已创建。对于您的用例来说,这是第22条军规

一种可能的替代方法是检查您的文件中的
ARGV
。 比如:

if ARGV.include?("up") || (ARGV.include?("reload") && ARGV.include?("--provision")) 
    ... 
end
示例用法 我在文件底部添加了两个函数:

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
if (not provisioned?) || explicit_provisioning?
    ...
end
我可以在我的文件中的任何语句中使用:

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
if (not provisioned?) || explicit_provisioning?
    ...
end

令人惊叹的。我想我可以写我自己的插件只是为了好玩。看看例如,vagrant主机外壳代码的例子,看看如何以比vagrant文件更干净的方式来做。文本可以是配置选项等。