我正在使用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运行类似的东西。
答案 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
中的安装将会发生。