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_gem が実行されてハンドラー用の gem がインストールされる前に、chef_handler リソースがハンドラーをロードしようとしているように見えます。これは明らかに、gem をインストールするための別のレシピがあり、ハンドラーを構成する別のレシピに切り替える 2 ステップの手動プロセスで行うことができますが、複数ステップの手動プロセスは避けたいと考えています。1つのレシピでできますか?

4

2 に答える 2

2

chef 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_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 に答える