I came across a similar chicken/egg scenario when I was writing a
custom package provider which needed to leverage a gem that I knew did
not exist on the system. Here's how I solved it in my provider:
def gem_dependency(name, package =
nil)
raise Puppet::Error, "Required 'name' argument must be a string."
unless name.is_a?
String
package = name if
package.nil?
begin
require
"#{name}"
rescue
LoadError
begin
puppet_package_provider(package,
"gem")
rescue
Exception
puppet_package_provider(package, "gem", "http://
gems.rubyforge.org")
end
Gem.clear_paths
retry
end
end
# Installs a package with
Puppet
# source should not be required so the provider can use its
configured
default(s)
def puppet_package_provider(package, provider, source =
nil)
if
source.nil?
ppp = Puppet::Type.type(:package).new(:name =>
"#{package}", :provider =>
provider).provider
else
ppp = Puppet::Type.type(:package).new(:name =>
"#{package}", :provider => provider, :source =>
source).provider
end
ppp.install if ppp.properties[:ensure]
== :absent
end
Then in my install method...
def install
gem_dependency('sys/filesystem', 'sys-filesystem')
end
The magic happens with the call to Gem.clear_paths
Best,
Adam
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-users?hl=en.