1

我正在使用 chef-solo 来配置一个新的 vagrant VM。这是 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 中设置环境变量?还是有另一种方法可以强制 vagrant 使用 /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 运行类似的东西。

4

2 回答 2

1

使用vagrant Omnibus 插件,您可以安装具有自己嵌入式 Ruby 的 Chef Omnibus,以确保 Chef 运行始终使用相同的 Ruby 版本。

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

于 2013-12-06T12:32:46.990 回答
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 实用程序,如果用户的路径配置正确,它会调用在用户的 $PATH 中找到的第一个 sh,通常是 /bin/sh。

于 2013-04-16T15:23:18.377 回答