Vagrant 是否有任何方法可以在脚本中向前获取流浪自动更正端口的值?

Vagrant 是否有任何方法可以在脚本中向前获取流浪自动更正端口的值?,vagrant,chef-infra,vagrantfile,chef-solo,Vagrant,Chef Infra,Vagrantfile,Chef Solo,我正在使用Vagrant和Chef zero部署测试服务器,我正在测试的程序需要的一个属性是它的服务URL。 在我的流浪者档案中有以下几行: config.vm.network :forwarded_port, guest: 80, host: 8000, auto_correct: true ... chef.json = { 'pywps' => { :serverurl => 'http://localhost:8000/cgi-bin/wps.py',

我正在使用Vagrant和Chef zero部署测试服务器,我正在测试的程序需要的一个属性是它的服务URL。 在我的流浪者档案中有以下几行:

 config.vm.network :forwarded_port, guest: 80, host: 8000, auto_correct: true
 ...
 chef.json = {
  'pywps' => {
    :serverurl => 'http://localhost:8000/cgi-bin/wps.py',
    ...
    }
   }
对于我启动的第一个VM,一切正常,但是如果我需要第二个VM,或者某个VM已经在使用端口8000,那么Vagrant会自动更正我的端口,但我需要某种方法将该端口号放入serverurl变量中


这是可能的吗?

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

来自shell: vagrant port命令可以提供此信息,例如:

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

我尝试过但不起作用的事情: 未来答案的改进空间

从零号厨师: 我还没有用过Chef zero+Vagrant,所以我把它作为练习留给阅读本文的人。不过,我要说的是,您不希望从Vagrantfile内部运行这个shell命令,因为当运行这个命令读取Vagrantfile时,这会产生递归的污点

从文件中: 我怀疑在Vagrant文件中有或者可能有一种从ruby内部获取信息的方法,但我不确定如何做到这一点。可悲的是,类似于以下的东西不起作用:

port=config.vm.networks.select do | type,options| 类型==:转发的\u端口和选项[:来宾]==80 end.map do |类型、选项| 选项[:主机] 完
。。。因为在进行冲突检测和纠正之前,端口只获取来宾端口80的主机端口。我不知道在选择此选项之前是否或如何强制运行检测/纠正代码,和/或如何以不同的方式访问它,从而获得如此知情的数据。但是,如果您可以独立于vagrant文件运行某些内容,那么对于可能使用的其他端口,vagrant端口-guest 80技巧或其他技巧应该可以从这个线程获得正确的stdout信息。

,你可以看到一个潜在的插件:一个后触发器可以用来执行ruby代码并将端口写入一个文件有趣的是,这出现在流浪版本2.1.0中,它显然是在我发布这个答案的前两天发布的我当时不知道他们。