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.