[英]Using vagrant and chef-solo, how can I specify which version of ruby to run?
我正在使用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运行类似的操作。
/usr/bin/env
使用$ PATH查找可执行文件。 您应该确保/usr/bin/ruby
位于路径的最前面。 确保这一点的一种方法是:
export PATH=/usr/bin:$PATH
..然后尝试您的厨师独奏。
这里的更多信息来自: http : //zh.wikipedia.org/wiki/Shebang_(Unix)#Portability
通常,可以通过引入间接级别来使用程序/ usr / bin / env来规避此限制。 #! 后面是/ usr / bin / env,然后是没有完整路径的所需命令,如本例所示:
!/ usr / bin / env sh
之所以能成功,是因为/ usr / bin / env路径通常用于env实用程序,并且如果正确配置了用户的路径,它将调用用户$ PATH中的第一个sh,通常是/ bin / sh。
使用无业游民的omnibus插件,您可以安装拥有自己的嵌入式Ruby的Chef Omnibus,以确保Chef运行始终使用相同的Ruby版本。
我发现的唯一问题是,如果您的食谱依赖于系统版本的ruby,则某些设置将无法正常工作(例如,如果您在shell_out!
中使用/usr/local/bin
安装的ruby,则不会使用) shell_out!
菜谱,但在/usr/bin
中将安装)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.