我正在使用以下内容尝试使用 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
您可以执行以下操作:
irb
使用运行 Puppet 的 Ruby 运行时启动会话,然后require 'openssl'
保持会话运行- 在另一个终端中,运行
grep libssl /proc/$(pidof irb)/maps
并复制输出 - 使用上面捕获的输出更新你的帖子
有关您正在运行的 Ruby/OpenSSL 版本以及它们如何安装的其他信息对于诊断此问题也将非常有帮助。
答案2
好吧,我想我已经明白是怎么回事了……
似乎我收到的uninitialized constant Gem::RemoteFetcher::OpenSSL
错误不是因为 SSL 问题,而是因为找不到源服务器。我以为该--source
选项正在使用,但我认为没有(见下文)。
在 Puppet 客户端上,我以 root 身份将 gem 源位置更改为我的自定义 gem 服务器。gem env
以 root 身份运行确认了更改。然后,我更新了 Puppet 清单以输出gem env
Puppet 代理运行时的结果,而源仍为Puppet 代理执行命令http://rubygems.org/
时的gem
结果。经过进一步检查,我发现环境变量在执行命令之前HOME
被更改为(主要是因为在 Puppet 代理执行时被列为 GEM PATH,而不是或)。/
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 代理配置为将其主目录指向。/