RedHat / CentOS-6中包含的ruby版本是1.8.7,对许多应用程序来说太旧了。 虽然简单地使用定制的RPM进行更新是可能的,但是我的同事们回避这个想法,并希望使用SCL-repo提供的rh-ruby22软件包。
安装ruby-2.2,这很好,但在/opt/rh/rh-ruby22 。 我现在需要安装几个gem,并且很想使用Puppet:
package {'example': ensure => '0.25', provider => 'gem' }
不幸的是,gem-provider会调用/usr/bin/gem而不是/opt/rh/rh-ruby22/root/usr/bin/gem 。 有没有其他的方法? 谢谢!
好吧,“简单”的方法是实现自己的包提供商。 幸运的是,可以从现有的gem-providerinheritance所有的东西,仅覆盖gem-command本身。
因为SCL的rh-ruby22太慢了,所以你甚至不能直接调用它的ruby或者gem ,而无需首先设置LD_LIBRARY_PATH – 我们在/usr/bin为它们创build了包装器。 例如, /usr/bin/gem2设置库path(和PATH ),然后使用自己的参数( "$@" )来exec真正的/opt/rh/rh-ruby22/root/usr/bin/gem )。
我的新提供者使用gem2包装脚本来做它的事情。
我在modules/SOMEMODULE/lib/puppet/provider/package/下创build了gem2.rb文件,内容如下(用Puppet-3.8.7testing):
require 'puppet/provider/package' Puppet::Type.type(:package).provide File.basename(__FILE__, ".rb"), :parent => :gem, :source => :gem do desc "Ruby Gem support using #{@name}-executable" commands :gemcmd => @name.to_s end
虽然我希望,但我的实现允许将gem-command指定为puppet-manifest中的一个参数,如果不完全重写现有的gem提供程序,就不可能做到这一点。 我的方式更容易,效率也更高。
作为奖励,将文件复制到其他名称(如gem19.rb )将自动创build新的提供程序 – 只要确保gem19位于$PATH 。
您将保存该文件的模块可以是需要新提供商的机器使用的任何模块。