使用vagrant和chef-solo,如何指定运行哪个版本的ruby?

时间:2013-04-16 15:00:02

标签: ruby ubuntu chef vagrant chef-solo

我正在使用chef-solo来配置一个新的流浪汉VM。这是Ubuntu 12.10。厨师第一次运行正常,但此后无法启动。

问题是Chef-solo需要使用ruby 1.9.3运行,但我的一本cookbook安装了ruby 2.0.0。它将新版本的ruby链接到/ usr / local / ruby​​,因此系统版本仍可在/ usr / bin / ruby​​中使用。

/ usr / bin / chef-solo中的shebang行是#!/usr/bin/env ruby

有没有办法在chef-solo运行之前在Vagrantfile中设置环境变量?或者是否有另一种方法可以使用/ usr / bin / ruby​​强制流浪者运行chef-solo?

更新:我目前正在VM上使用以下命令作为解决方法:

sudo /usr/bin/ruby /usr/bin/chef-solo --config /tmp/vagrant-chef-1/solo.rb --override-runlist "my_runlist"

当我在主机上输入vagrant provision时,我想强制Vagrant运行类似的东西。

2 个答案:

答案 0 :(得分:1)

/usr/bin/env使用$ PATH查找可执行文件。您应该确保/usr/bin/ruby位于您的前方。确保这一点的一种方法是:

export PATH=/usr/bin:$PATH

..然后尝试你的厨师独奏。

以下内容来自:http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  

通常,程序/ usr / bin / env可用于规避这一点   通过引入间接级别来限制。 #!接下来是   / usr / bin / env,后跟没有完整路径的所需命令,如   这个例子:

     

!/ usr / bin / env sh

     

这主要是有效的,因为路径/ usr / bin / env通常用于env实用程序,它调用第一个sh发现   在用户的$ PATH中,通常是/ bin / sh,如果用户的路径是   正确配置。

答案 1 :(得分:1)

使用vagrant omnibus plugin,你可以安装拥有自己的嵌入式Ruby的Chef Omnibus,以保证Chef运行总是使用相同的Ruby版本。

我发现的唯一问题是,如果您的食谱依赖于ruby的系统版本,某些设置将无法正常工作(例如,/usr/local/bin中安装的ruby将无法使用shell_out! {1}}在食谱中,/usr/bin中的安装将会发生。