Я использую следующее, чтобы попытаться установить Rubygem с Puppet.
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 из командной строки гем устанавливается нормально.
Кто-нибудь имеет представление о том, что происходит? Выполняется ли агент 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
. Мысли ?!
Я сталкивался с подобными проблемами раньше, и я примерно на 99% уверен, что ваша среда выполнения Ruby пытается загрузить версию OpenSSL, отличную от той, для которой он был создан, скорее всего, из-за наличия настраиваемого libssl
в /usr/local
. Можете ли вы сделать следующее:
irb
сеанс со средой выполнения Ruby, используемой для запуска Puppet, затем require 'openssl'
и оставьте сеанс запущеннымgrep libssl /proc/$(pidof irb)/maps
и скопируйте выводДругая информация о том, какая версия Ruby / OpenSSL у вас установлена и как они были установлены, также будет чрезвычайно полезна при диагностике этой проблемы.
Хорошо, думаю, я понял, в чем заключалась сделка ...
Кажется, я получил uninitialized constant Gem::RemoteFetcher::OpenSSL
ошибка не из-за проблемы с SSL, а из-за того, что не удалось найти исходный сервер. У меня создалось впечатление, что --source
вариант был привычным, но я не думаю, что это было (см. ниже).
В качестве пользователя root в клиентском окне Puppet я изменил местоположение источника гемов на свой собственный сервер гемов. Бег gem env
как root подтвердил изменение. Затем я обновил свой манифест Puppet, чтобы вывести результат gem env
когда запущен агент Puppet, а источник все еще http://rubygems.org/
когда gem
команда была выполнена агентом Puppet. При дальнейшем осмотре у меня создалось впечатление, что HOME
переменная среды была изменена на /
перед gem
команда выполнялась (в основном потому, что /.gem/ruby/1.8
был указан как ПУТЬ GEM, когда gem env
был выполнен агентом Марионетки вместо /root/.gem/ruby/1.8
или /var/lib/puppet/.gem/ruby/1.8
).
Чтобы проверить, я скопировал свой /root/.gemrc
файл (в котором указан мой пользовательский источник драгоценного камня) в /.gemrc
и снова запустил агент Марионетки. На этот раз ошибок не произошло, и драгоценный камень, который я хотел, был успешно установлен. Домашний каталог Puppet, на /etc/passwd
, установлен на /var/lib/puppet
, поэтому агент Puppet должен быть настроен так, чтобы его домашний каталог указывал на /
перед исполнением манифестов.