1

我正在使用 Chef 设置运行 Ubuntu 12.04 的节点。我想使用 Ruby 1.9.3,包括 Chef,我正在使用我发现的这个自定义引导文件来完成它。(我之前曾尝试将 RVM 与 Chef 结合使用,但发现它每时每刻都会出现问题——我希望这不会那么容易出错。)

当我在这个节点上运行 chef-client 时,它会尝试安装我的 Rails 应用程序,尝试安装 Bundler,但失败了,因此:

Recipe: <Dynamically Defined Resource>
  * gem_package[Bundler] action install
================================================================================
Error executing action `install` on resource 'gem_package[Bundler]'
================================================================================


NoMethodError
-------------
undefined method `full_name' for nil:NilClass


Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/application_ruby/providers/rails.rb

162:     gem_package gem do
163:       action :install
164:       source src if src
165:       version ver if ver && ver.length > 0
166:     end
167:   end



Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/application_ruby/providers/rails.rb:162:in `block in install_gems'

gem_package("Bundler") do
  provider Chef::Provider::Package::Rubygems
  action [:install]
  retries 0
  retry_delay 2
  package_name "Bundler"
  version ">1.3"
  cookbook_name "tiptap_api"
end

为了尝试隔离问题,我gem_package在部署尝试之前在配方中放置了以下调用:

gem_package 'Bundler' do
  version '>0'
  action :install
end

同样,这也失败了。

我发现gemapt-get 安装的可执行文件实际上名为gem1.9.1. 我认为这可能是问题所在,并将其重命名为gem. 完成后,我可以sudo gem install bundler正常运行并且没有任何问题,但是厨师客户端仍然会产生此错误。

发生了什么事,我该如何解决它,为什么这个错误信息如此可怕?

4

1 回答 1

1

从您的堆栈跟踪来看,您似乎想要安装一个名为Bundler. 但是,此 gem 不存在,这会导致您观察到错误。您可能想要安装bundlergem。大小写在 Ruby 世界中通常很重要 :)

虽然错误消息确实具有误导性,但其原因可能是 Chef 未明确检查不存在 gem 的情况,因此代码后期阶段的假设只是中断,导致奇怪的错误。

这反过来可能被认为是 Chef 中的一个错误,您可能想在http://tickets.opscode.com/上报告它(至少如果在最新版本的 Chef 中这仍然是一个问题,我还没有检查过) )。

于 2013-09-04T20:15:30.137 回答