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 提供者,现在支持使用
command
属性。现在支持您的特定示例,如下所示:好的,“简单”的方法是实现自己的包提供程序。幸运的是,可以从现有的 gem-provider 继承所有内容,只覆盖 gem-command 本身。
因为 SCL 的 rh-ruby22 太迟钝了,你甚至不能直接调用它的
ruby
orgem
—— 没有LD_LIBRARY_PATH
先设置—— 我们在/usr/bin
. 例如/usr/bin/gem2
,设置库路径(和PATH
),然后是带有自己参数exec
的实数( )。/opt/rh/rh-ruby22/root/usr/bin/gem
"$@"
我的新提供者使用
gem2
包装脚本来做它的事情。我使用以下内容创建了文件(使用 Puppet-3.8.7 测试)
gem2.rb
:modules/SOMEMODULE/lib/puppet/provider/package/
尽管我希望,我的实现将允许将 gem-command 指定为 puppet-manifest 中的参数,如果不完全重写现有的 gem-provider,就不可能做到这一点。我的方法更容易,也同样有效。
作为奖励,将文件复制到其他名称(例如
gem19.rb
)将自动创建新的提供程序 - 请确保gem19
在$PATH
.您将保存此文件的模块可以是需要新提供程序的机器使用的任何模块。