有什么方法可以在脚本中获取 vagrant autocorrect port forward 的值吗?

is there any way to get value of a vagrant autocorrect port forward in a script?

我正在使用 Vagrant 和 Chef-zero 部署测试服务器,我正在测试的程序需要的属性之一是它的服务 URL。 在我的 Vagrant 文件中包含以下几行:

 config.vm.network :forwarded_port, guest: 80, host: 8000, auto_correct: true
 ...
 chef.json = {
  'pywps' => {
    :serverurl => 'http://localhost:8000/cgi-bin/wps.py',
    ...
    }
   }

我启动的第一个 VM 一切正常,但如果我需要第二个(或者某些东西已经在使用端口 8000),那么 Vagrant 会自动更正我的端口,但我需要一些方法将该端口号放入 serverurl 变量.

这可能吗?

AFAIK 不是现成的。您可以制作一个 Vagrant 插件来连接到配置过程并重写数据,但这可能有点过头了。

来自shell:

vagrant port 命令可以为您提供此信息,例如与:

vagrant port --guest 80

在您的情况下,默认情况下会打印出 8000——或者如果必须自动更正主机端口最终会是什么。


我试过但没有用的东西:

(未来答案的改进空间...)

来自 Chef-zero:

我对 Chef-zero + Vagrant 的使用还不够了解如何将其插入其中,因此我将其作为练习留给阅读本文的人。不过,我要说的是,你不想从 Vagrantfile 中 运行 这个 shell 命令,因为这会产生递归的污秽(因为 运行 反过来,读取 Vagrantfile)。

来自 Vagrantfile:

我怀疑有或可能有一种方法可以从 Vagrantfile 中的 ruby 中获取信息,但我不确定该怎么做。遗憾的是,类似以下的内容不起作用:

theport = config.vm.networks.select do |type,options|
  type == :forwarded_port and options[:guest] == 80
end.map do |type, options|
  options[:host]
end.first

... 因为 theport 只是获取来宾端口 80 的主机端口 是什么,然后再执行碰撞检测和校正。我不知道在选择这个之前是否或如何将 detection/correction 代码强制为 运行,and/or 如何以不同的方式访问它以获得如此知情的数据。但是,如果你可以 运行 一些与 Vagrantfile 分开的东西,vagrant port --guest 80 技巧(或任何其他可能使用的端口)应该在 stdout 上获得正确的信息。