Puppet

Puppet 無法安裝正常安裝的 Rubygem

  • June 18, 2013

我正在使用以下內容嘗試使用 Puppet 安裝 Rubygem。

package { 'reaper':
 ensure           => 'installed',
 provider         => 'gem',
 source           => 'http://192.168.1.101:9292/',
 install_options  => ['--no-ri', '--no-rdoc']
}

當我執行時,puppet agent --test我收到以下錯誤。

Error: Execution of '/usr/bin/gem install --source http://192.168.1.101:9292/ reaper' returned 1: ERROR:  While executing gem ... (NameError)
   uninitialized constant Gem::RemoteFetcher::OpenSSL

Error: /Package[reaper]/ensure: change from absent to present failed: Execution of '/usr/bin/gem install --source http://192.168.1.101:9292/ reaper' returned 1: ERROR:  While executing gem ... (NameError)
   uninitialized constant Gem::RemoteFetcher::OpenSSL

但是,當我從命令行gem install --source http://192.168.1.101:9292/ reaper以 root 身份執行時,gem 安裝得很好。

有人知道發生了什麼嗎?Puppet 代理是否使用一些可能導致此錯誤的不同環境變數執行?

===== 編輯 =====

以下是有關環境的一些附加資訊:

#output from `grep libssl /proc/{irb pid}/maps`
b70e0000-b7131000 r-xp 00000000 08:01 393357     /lib/i386-linux-gnu/libssl.so.1.0.0
b7131000-b7133000 r--p 00050000 08:01 393357     /lib/i386-linux-gnu/libssl.so.1.0.0
b7133000-b7137000 rw-p 00052000 08:01 393357     /lib/i386-linux-gnu/libssl.so.1.0.0

Ruby 和 RubyGems(通過 安裝aptitude install rubygems):

# ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]

# gem env
RubyGems Environment:
 - RUBYGEMS VERSION: 1.8.15
 - RUBY VERSION: 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]
 - INSTALLATION DIRECTORY: /var/lib/gems/1.8
 - RUBY EXECUTABLE: /usr/bin/ruby1.8
 - EXECUTABLE DIRECTORY: /usr/local/bin
 - RUBYGEMS PLATFORMS:
   - ruby
   - x86-linux
 - GEM PATHS:
    - /var/lib/gems/1.8
    - /root/.gem/ruby/1.8
 - GEM CONFIGURATION:
    - :update_sources => true
    - :verbose => true
    - :benchmark => false
    - :backtrace => false
    - :bulk_threshold => 1000
 - REMOTE SOURCES:
    - http://rubygems.org/

SSL(自動安裝):

# aptitude search ~i | grep ssl
i A libssl-dev                      - SSL development libraries, header files an
i A libssl-doc                      - SSL development documentation documentatio
i   libssl1.0.0                     - SSL shared libraries                      
i A openssl                         - Secure Socket Layer (SSL) binary and relat

# aptitude show libssl1.0.0
Package: libssl1.0.0                     
State: installed
Automatically installed: no
Multi-Arch: same
Version: 1.0.1-4ubuntu5.9
Priority: required
Section: libs
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: i386
Uncompressed Size: 2,748 k
Depends: libc6 (>= 2.7), zlib1g (>= 1:1.1.4), debconf (>= 0.5) | debconf-2.0
PreDepends: multiarch-support
Breaks: openssh-client (< 1:5.9p1-4), openssh-server (< 1:5.9p1-4)
Description: SSL shared libraries

===== 編輯#2 =====

我想知道為什麼我什至會遇到 OpenSSL 錯誤…我使用的源是http,而不是https. 想法?!

好吧,所以我想我知道交易是什麼了…

似乎我收到uninitialized constant Gem::RemoteFetcher::OpenSSL錯誤不是因為 SSL 問題,而是因為找不到源伺服器。我的印像是該--source選項正在被使用,但我不認為它是(見下文)。

作為 Puppet 客戶端的 root 使用者,我將 gem 源位置更改為我的自定義 gem 伺服器。以 root 身份執行gem env確認了更改。然後我更新了我的 Puppet 清單以輸出gem envPuppet 代理執行時的結果,並且源仍然是 Puppet 代理執行命令http://rubygems.org/時的結果。gem經過進一步檢查,我得到的印像是環境變數在命令執行之前HOME被更改為(主要是因為在 Puppet 代理執行時被列為 GEM PATH而不是or )。/``gem``/.gem/ruby/1.8``gem env``/root/.gem/ruby/1.8``/var/lib/puppet/.gem/ruby/1.8

/root/.gemrc為了測試,我將我的文件(它指定了我的自定義 gem 源)複製到/.gemrc並再次執行 Puppet 代理。這次沒有報錯,我想要的gem也安裝成功了。Puppet 的主目錄 per/etc/passwd設置為/var/lib/puppet,因此必須將 Puppet 代理配置為/在執行清單之前將其主目錄指向。

libssl我之前也遇到過類似的問題,並且我大約 99% 確定您的 Ruby 執行時正在嘗試載入 OpenSSL 的版本,而不是它所針對的版本,這很可能是由於/usr/local. 你能做到以下幾點:

  1. irb使用用於執行 Puppet 的 Ruby 執行時啟動會話,然後require 'openssl'保持會話執行
  2. 在另一個終端中,執行grep libssl /proc/$(pidof irb)/maps並複制輸出
  3. 使用您在上面擷取的輸出更新您的文章

有關您正在執行的 Ruby/OpenSSL 版本以及它們的安裝方式的其他資訊也將非常有助於診斷此問題。

引用自:https://serverfault.com/questions/515134