Chef Exception Handlers and gem dependancies

Hey Everyone,
I’m a bit confused on how to get a gem (or other resource) installed on a machine that is a dependency for a Chef Exception Handler.

I’m using the EmailMe example from the wiki to familiarize myself with writing handlers:
http://wiki.opscode.com/display/chef/Exception+and+Report+Handlers

I have the example working if I already have the pony gem installed, but once I try to perform a run on a clean machine, I get:

FATAL: LoadError: no such file to load – pony

After reading the following wiki page, I thought the proper place was to put it above the handler code.
http://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Time

However that results in:

FATAL: NoMethodError: chef_handler[MyOrganization::EmailMe] (chef_handler::email_me line 25) had an error: NoMethodError: undefined method `gem_package’ for main:Object

I seem to be caught in a catch-22. The handler is evaluated during the compile stage, but I need to install a gem which doesn’t happen until the execute. How are others doing this with gems or other dependancies not on the system?

I’m using the chef_handler cookbook and pulling the chef handler via the LWRP in a recipe.

Where is the best place to call gem_package? Thanks!


Aaron Bento

you can use gem_package during the compile phase:

gem_package "foo" do
action :nothing
end.run_action(:install)

This file does exactly what you are talking about, fwiw:
https://github.com/fujin/chef-minitest/blob/develop/cookbooks/minitest/recipes/default.rb#L19-32

--AJ

On 17 February 2012 15:01, Aaron Bento rkive.lists@gmail.com wrote:

Hey Everyone,
I'm a bit confused on how to get a gem (or other resource) installed on a
machine that is a dependency for a Chef Exception Handler.

I'm using the EmailMe example from the wiki to familiarize myself with
writing handlers:
http://wiki.opscode.com/display/chef/Exception+and+Report+Handlers

I have the example working if I already have the pony gem installed, but
once I try to perform a run on a clean machine, I get:

FATAL: LoadError: no such file to load -- pony

After reading the following wiki page, I thought the proper place was to put
it above the handler code.
http://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Time

However that results in:

FATAL: NoMethodError: chef_handler[MyOrganization::EmailMe]
(chef_handler::email_me line 25) had an error: NoMethodError: undefined
method `gem_package' for main:Object

I seem to be caught in a catch-22. The handler is evaluated during the
compile stage, but I need to install a gem which doesn't happen until the
execute. How are others doing this with gems or other dependancies not on
the system?

I'm using the chef_handler cookbook and pulling the chef handler via the
LWRP in a recipe.

Where is the best place to call gem_package? Thanks!

--
Aaron Bento

AJ,
Thanks for your pointers. I had the gem_package in there, but the wrong location. It was in the handler code file. I now have a working setup by making these two changes:

  1. Call the gem_package resource in the recipe.
  2. Insert gem "pony" at the top of my handler code.

Thanks again!

--
Aaron Bento

On Thursday, February 16, 2012 at 6:09 PM, AJ Christensen wrote:

you can use gem_package during the compile phase:

gem_package "foo" do
action :nothing
end.run_action(:install)

This file does exactly what you are talking about, fwiw:
https://github.com/fujin/chef-minitest/blob/develop/cookbooks/minitest/recipes/default.rb#L19-32

--AJ

On 17 February 2012 15:01, Aaron Bento <rkive.lists@gmail.com (mailto:rkive.lists@gmail.com)> wrote:

Hey Everyone,
I'm a bit confused on how to get a gem (or other resource) installed on a
machine that is a dependency for a Chef Exception Handler.

I'm using the EmailMe example from the wiki to familiarize myself with
writing handlers:
http://wiki.opscode.com/display/chef/Exception+and+Report+Handlers

I have the example working if I already have the pony gem installed, but
once I try to perform a run on a clean machine, I get:

FATAL: LoadError: no such file to load -- pony

After reading the following wiki page, I thought the proper place was to put
it above the handler code.
http://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Time

However that results in:

FATAL: NoMethodError: chef_handler[MyOrganization::EmailMe]
(chef_handler::email_me line 25) had an error: NoMethodError: undefined
method `gem_package' for main:Object

I seem to be caught in a catch-22. The handler is evaluated during the
compile stage, but I need to install a gem which doesn't happen until the
execute. How are others doing this with gems or other dependancies not on
the system?

I'm using the chef_handler cookbook and pulling the chef handler via the
LWRP in a recipe.

Where is the best place to call gem_package? Thanks!

--
Aaron Bento