5

我正在尝试通过 chef_handler lwrp 安装厨师处理程序。这个处理程序(chef-handler-email)捆绑在一个 gem 中。我正在尝试安装 gem,然后从单个配方中打开处理程序,如下所示:

chef_gem "chef-handler-mail"

chef_handler "MailHandler" do
  source 'chef/handler/mail'
  arguments :to_address => "root"
  action :nothing
  supports :exception => true, :report => false
end.run_action(:enable)

如果 gem 已经安装,这可以正常工作。但是,如果尚未安装 Gem,我会收到此错误:

[2012-12-09T20:47:56-05:00] FATAL: LoadError: chef_handler[MailHandler] (chef_handler::email line 13) had an error: LoadError: no such file to load -- chef/handler/mail.rb

似乎 chef_handler 资源正在尝试在 chef_gem 执行并为处理程序安装 gem 之前加载处理程序。我显然可以在两步手动过程中执行此操作,其中我有一个单独的安装 gem 的配方,然后翻转到另一个配置处理程序的配方,但我希望避免多步骤手动过程。可以通过单一配方完成吗?

4

2 回答 2

2

我有一个类似的厨师 minitest-chef-handler 食谱:

chef_gem 'minitest'
chef_gem 'minitest-chef-handler'

require 'rubygems'
require 'minitest-chef-handler'

[... some unrelated code ...]

chef_handler "MiniTest::Chef::Handler" do
    source "minitest-chef-handler"
    arguments :verbose => true
    action :nothing
end.run_action( :enable )

在创建 chef_handler 资源之前尝试要求您的 gem,或者可能是源应该不同......

于 2012-12-10T22:02:14.263 回答
-1

#run_action调用导致chef_handler资源在“编译”阶段立即运行,而chef_gem资源在“执行”阶段正常运行。

所以 gem 也需要在编译阶段安装。似乎require还需要一个声明(如另一个答案中所建议的那样)供厨师加载宝石。

chef_gem 'chef-handler-mail' do
  action :nothing
end.run_action(:install)

require 'chef/handler/mail'

chef_handler 'MailHandler' do
  source 'chef/handler/mail'
  # ... other attributes
  action :nothing
end.run_action(:enable)
于 2013-07-09T21:42:36.870 回答