有没有办法在脚本中获得流浪汉自动更正端口的值?

时间:2016-01-13 10:33:01

标签: vagrant chef vagrantfile chef-solo

我使用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变量。< / p>

这可能吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

来自shell:

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

vagrant port --guest 80

默认情况下会打印8000 - 或者无论主机端口是什么,如果它必须自动更正它。

我尝试的不起作用的东西:

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

来自Chef-zero:

我没有使用Chef-zero + Vagrant足以知道如何将其插入那里,所以我将其作为练习留给读者阅读。但是,我会说,你不想在Vagrantfile中运行这个shell命令,因为这会产生递归的恶意(因为运行这个命令反过来会读取Vagrantfile)。

从Vagrantfile中:

我怀疑在Vagrant文​​件中是否有或者可以成为从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 的主机端口。我不知道是否或如何在选择此之前强制检测/更正代码运行,和/或如何以不同方式访问它以获得如此通知的数据。但是如果你可以从Vagrant文​​件中单独运行某些东西,那么vagrant port --guest 80技巧(或者其他可能使用的其他端口)应该在stdout上获得正确的信息。