我正在使用chef-solo来配置一个新的流浪汉虚拟机。它是Ubuntu 12.10。Chef在第一次运行时运行良好,但之后的任何时间都无法启动。
问题是chef-solo需要使用ruby 1.9.3运行,但我的一本食谱安装了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?
更新:我目前在虚拟机上使用以下命令作为解决方法:
sudo /usr/bin/ruby /usr/bin/chef-solo --config /tmp/vagrant-chef-1/solo.rb --override-runlist "my_runlist"当我在主机上输入vagrant provision时,我想强制Vagrant运行类似的命令。
发布于 2013-04-16 23:23:18
/usr/bin/env的工作方式是使用$PATH查找可执行文件。您应该确保/usr/bin/ruby位于您路径的最前面。确保这一点的一种方法是:
export PATH=/usr/bin:$PATH..and然后尝试你的chef-solo run。
更多信息来自:http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability
通常,程序/usr/bin/env可以通过引入一定程度的间接性来绕过此限制。#!后跟/usr/bin/env,后跟不带完整路径的所需命令,如下例所示:
!/usr/bin/env sh
这主要是因为路径/usr/bin/env通常用于env实用程序,并且如果用户的路径配置正确,它将调用在用户$PATH中找到的第一个sh,通常是/bin/sh。
发布于 2013-12-06 20:32:47
使用vagrant omnibus plugin,你可以安装Chef Omnibus,它有自己的嵌入式Ruby,以保证Chef的运行总是使用相同的Ruby版本。
我发现的唯一问题是,如果你的菜谱依赖于ruby的系统版本,一些设置将无法正常工作(例如,如果你在食谱中使用shell_out!,安装在/usr/local/bin中的ruby将不会被使用,但安装在/usr/bin中的ruby将会被使用)。
https://stackoverflow.com/questions/16040421
复制相似问题