Puppet 安装 Rubygem 失败,但 Rubygem 可以正常安装

Puppet 安装 Rubygem 失败,但 Rubygem 可以正常安装

我正在使用以下内容尝试使用 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 <[email protected]>
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。有什么想法吗?!

答案1

我以前遇到过类似的问题,我大约 99% 确定您的 Ruby 运行时正在尝试加载与其构建版本不同的 OpenSSL 版本,很可能是因为存在自定义libssl/usr/local您可以执行以下操作:

  1. irb使用运行 Puppet 的 Ruby 运行时启动会话,然后require 'openssl'保持会话运行
  2. 在另一个终端中,运行grep libssl /proc/$(pidof irb)/maps并复制输出
  3. 使用上面捕获的输出更新你的帖子

有关您正在运行的 Ruby/OpenSSL 版本以及它们如何安装的其他信息对于诊断此问题也将非常有帮助。

答案2

好吧,我想我已经明白是怎么回事了……

似乎我收到的uninitialized constant Gem::RemoteFetcher::OpenSSL错误不是因为 SSL 问题,而是因为找不到源服务器。我以为该--source选项正在使用,但我认为没有(见下文)。

在 Puppet 客户端上,我以 root 身份将 gem 源位置更改为我的自定义 gem 服务器。gem env以 root 身份运行确认了更改。然后,我更新了 Puppet 清单以输出gem envPuppet 代理运行时的结果,而源仍为Puppet 代理执行命令http://rubygems.org/时的gem结果。经过进一步检查,我发现环境变量在执行命令之前HOME被更改为(主要是因为在 Puppet 代理执行时被列为 GEM PATH,而不是或)。/gem/.gem/ruby/1.8gem 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 代理配置为将其主目录指向。/

相关内容