如何使用 Puppet 為非預設 Ruby 安裝 gem?
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
屬性。現在支持您的特定範例,如下所示:package {'example': ensure => '0.25', provider => 'gem', command => '/opt/rh/rh-ruby22/root/usr/bin/gem' }
好的,“簡單”的方法是實現自己的包提供程序。幸運的是,可以從現有的 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/
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-provider,就不可能做到這一點。我的方法更容易,也同樣有效。
作為獎勵,將文件複製到其他名稱(例如
gem19.rb
)將自動創建新的提供程序 - 請確保gem19
在$PATH
.您將保存此文件的模組可以是需要新提供程序的機器使用的任何模組。