Como instalar gems para Ruby não-padrão com Puppet?

1

O ruby incluído no RedHat / CentOS-6 é da versão 1.8.7, que é muito antigo para muitas aplicações. Embora seja possível atualizá-lo simplesmente com um RPM personalizado, meus colegas evitam a ideia e desejam usar o rh-ruby22 pacotes disponíveis no SCL-repo .

Isso instala o ruby-2.2, o que é ótimo, mas abaixo de /opt/rh/rh-ruby22 . Agora preciso instalar várias gemas e gostaria de usar, obviamente, o Puppet:

package {'example':
  ensure   => '0.25',
  provider => 'gem'
}

Infelizmente, o provedor gem invoca /usr/bin/gem em vez de /opt/rh/rh-ruby22/root/usr/bin/gem que precisa ser invocado. Existe alguma outra maneira? Obrigado!

    
por Mikhail T. 06.07.2016 / 06:28

1 resposta

0

Ok, a maneira "fácil" é implementar o próprio provedor de pacotes. Felizmente, pode-se herdar tudo do gem-provider existente, sobrescrevendo apenas o próprio comando gem.

Como o rh-ruby22 da SCL é tão retardado, você não pode invocar seu ruby ou gem diretamente - sem definir LD_LIBRARY_PATH primeiro - nós criamos wrappers para eles em /usr/bin . O /usr/bin/gem2 , por exemplo, define o caminho da biblioteca (e PATH ) e, em seguida, exec s o% real/opt/rh/rh-ruby22/root/usr/bin/gem com seus próprios argumentos ( "$@" ).

Meu novo provedor usa o script gem2 wrapper para fazer o seu trabalho.

Eu criei o arquivo gem2.rb em modules/SOMEMODULE/lib/puppet/provider/package/ com o seguinte conteúdo (testado com o Puppet-3.8.7):

require 'puppet/provider/package'

Puppet::Type.type(:package).provide File.basename(__FILE__, ".rb"),
    :parent => :gem, :source => :gem do
        desc "Ruby Gem support using #{@name}-executable"

        commands :gemcmd => @name.to_s
end

Embora eu esperasse, minha implementação permitiria especificar o comando gem como um parâmetro no manifesto puppet, é impossível fazer isso sem reescrever completamente o gem-provider existente. Meu caminho é muito mais fácil e eficiente.

Como bônus, copiar o arquivo para outro nome (como gem19.rb ) criará automaticamente o novo provedor - apenas certifique-se de que gem19 esteja no $PATH .

O módulo, sob o qual você salvará este arquivo, pode ser qualquer módulo usado pela (s) máquina (s) que precisam do novo provedor.

    
por 08.07.2016 / 05:10