Puppet falha ao instalar o Rubygem que é instalado normalmente

1

Estou usando o seguinte para tentar instalar um Rubygem com o Puppet.

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

Quando executo puppet agent --test , recebo o seguinte erro.

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

No entanto, quando executo gem install --source http://192.168.1.101:9292/ reaper como root na linha de comando, a gem é instalada muito bem.

Alguém tem uma ideia do que está acontecendo? O agente Puppet é executado com algumas variáveis de ambiente diferentes que podem estar causando esse erro?

===== EDIT =====

Veja algumas informações adicionais sobre o ambiente:

#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 e RubyGems (instalados via 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 (instalado automaticamente):

# 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

===== EDIT # 2 =====

Estou me perguntando por que estou encontrando um erro do OpenSSL ... a fonte que estou usando é http , não https . Pensamentos?!

    
por Bryan 12.06.2013 / 00:11

2 respostas

1

Tudo bem, então acho que descobri qual era o problema ...

Parece que recebi o erro uninitialized constant Gem::RemoteFetcher::OpenSSL não por causa de um problema de SSL, mas porque o servidor de origem não pôde ser encontrado. Fiquei com a impressão de que a opção --source estava se acostumando, mas não acho que foi (veja abaixo).

Como root na caixa do cliente Puppet, mudei a localização da fonte gem para ser o meu servidor gem personalizado. A execução de gem env como root confirmou a alteração. Em seguida, atualizei meu manifesto Puppet para gerar o resultado de gem env quando o agente Puppet foi executado e a origem ainda estava http://rubygems.org/ quando o comando gem foi executado pelo agente Puppet. Após uma inspeção adicional, tive a impressão de que a variável de ambiente HOME estava sendo alterada para / antes do comando gem ser executado (principalmente porque /.gem/ruby/1.8 foi listado como GEM PATH quando gem env foi executado por o agente Puppet em vez de /root/.gem/ruby/1.8 ou /var/lib/puppet/.gem/ruby/1.8 ).

Para testar, copiei meu arquivo /root/.gemrc (que especificou minha origem de gemas personalizada) para /.gemrc e executei novamente o agente Puppet. Desta vez, nenhum erro ocorreu e a gema que eu queria foi instalada com sucesso. O diretório pessoal do Puppet, por /etc/passwd , está definido como /var/lib/puppet , portanto, o agente do Puppet deve ser configurado para apontar seu diretório inicial para / antes de executar manifestos.

    
por 18.06.2013 / 05:25
2

Já me deparei com problemas semelhantes antes, e tenho cerca de 99% de certeza de que seu tempo de execução Ruby está tentando carregar uma versão do OpenSSL diferente da que foi construída, provavelmente devido à presença de uma% customizadalibssl em /usr/local . Você pode fazer o seguinte:

  1. Inicie uma sessão irb com o tempo de execução do Ruby usado para executar o Puppet e, em seguida, require 'openssl' e deixe a sessão em execução
  2. Em outro terminal, execute grep libssl /proc/$(pidof irb)/maps e copie a saída
  3. Atualize sua postagem com a saída capturada acima

Outras informações sobre qual versão do Ruby / OpenSSL que você está executando e como elas foram instaladas também seriam extremamente úteis para diagnosticar esse problema.

    
por 13.06.2013 / 06:53