Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Installing a gem after native extension packages during chef execution

I am trying to install the fog gem in a chef recipe though the gem installation occurs before the native packages are being installed so the gem installation fails

package "libxslt-dev"
package "libxml2-dev"

chef_gem "fog"

This is the output

[Thu, 14 Mar 2013 13:04:30 +0000] INFO: Processing chef_gem[fog] action install (ebs4000::update_volumes line 23)
[Thu, 14 Mar 2013 13:04:52 +0000] ERROR: Running exception handlers
[Thu, 14 Mar 2013 13:04:52 +0000] FATAL: Saving node information to /var/cache/chef/failed-run-data.json
[Thu, 14 Mar 2013 13:04:52 +0000] ERROR: Exception handlers complete
[Thu, 14 Mar 2013 13:04:52 +0000] ERROR: Gem::Installer::ExtensionBuildError: chef_gem[fog] (cookbook::recipe line 4) had an error: Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.8 extconf.rb
checking for libxml/parser.h... no
-----
libxml2 is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    ...
    --with-pkg-config
    --without-pkg-config


Gem files will remain installed in /var/lib/gems/1.8/gems/nokogiri-1.5.6 for inspection.
Results logged to /var/lib/gems/1.8/gems/nokogiri-1.5.6/ext/nokogiri/gem_make.out

I am aware of the notifies attribute of the chef resources but still can get this run properly.

So how can I actually force the execution order to first install the native packages and then the gem in the same run.

Note: Manual installation of the packages is not an option, since we want that to be fully automated for new nodes.

like image 274
vervas Avatar asked Mar 14 '13 13:03

vervas


People also ask

What is gem in chef?

What's the difference? The chef_gem and gem_package resources are both used to install Ruby gems. For any machine on which the chef-client is installed, there are two instances of Ruby. One is the standard, system-wide instance of Ruby and the other is a dedicated instance that is available only to the chef-client.

What is gem native extension?

“Native extensions” are the glue that connects a Ruby gem with some other non-Ruby software component or library present on your machine.


1 Answers

Why not try installing the dependencies at the start of the resource collection phase, as mentioned here: OPSCODE wiki: Run Resources from the Resource Collection

So your recipe would look like:

xsltdev = package "libxslt-dev" do
   action :nothing
end

xmldev = package "libxml2-dev" do
   action :nothing
end

xsltdev.run_action(:install)
xmldev.run_action(:install)

chef_gem "fog"
like image 101
Giannis Nohj Avatar answered Nov 01 '22 17:11

Giannis Nohj