O ruby incluído no RedHat/CentOS-6 é da versão 1.8.7, que é muito antigo para muitos aplicativos. Embora simplesmente atualizá-lo com um RPM personalizado seja possível, meus colegas evitam a ideia e desejam usar os pacotes rh-ruby22 disponíveis no SCL-repo .
Isso instala o ruby-2.2, o que é ótimo, mas abaixo do /opt/rh/rh-ruby22
. Agora preciso instalar várias gems e gostaria, obviamente, de usar o Puppet:
package {'example':
ensure => '0.25',
provider => 'gem'
}
Infelizmente, o provedor de gemas invoca /usr/bin/gem
em vez de /opt/rh/rh-ruby22/root/usr/bin/gem
precisar ser invocado. Existe alguma outra maneira? Obrigado!
O recurso de pacote e, em particular, o provedor de gem , agora suporta o uso do atributo . Seu exemplo particular agora é suportado assim:
command
Ok, a maneira "fácil" é implementar o próprio provedor de pacotes. Felizmente, pode-se herdar tudo do provedor de gem existente substituindo apenas o próprio comando de gem.
Como o rh-ruby22 do SCL é tão retardado, você não pode nem invocá-lo
ruby
ougem
diretamente - sem definirLD_LIBRARY_PATH
primeiro - criamos wrappers para eles em/usr/bin
. O/usr/bin/gem2
, por exemplo, define o caminho da biblioteca (ePATH
) e entãoexec
s o real/opt/rh/rh-ruby22/root/usr/bin/gem
com seus próprios argumentos ("$@"
).Meu novo provedor usa o
gem2
script wrapper para fazer seu trabalho.Eu criei o arquivo
gem2.rb
commodules/SOMEMODULE/lib/puppet/provider/package/
o seguinte conteúdo (testado com Puppet-3.8.7):Embora eu esperasse que minha implementação permitisse especificar o comando gem como um parâmetro no manifesto marionete, é impossível fazer isso sem reescrever completamente o provedor gem existente. Minha maneira é muito mais fácil e tão eficiente.
Como bônus, copiar o arquivo para algum outro nome (como
gem19.rb
) criará automaticamente o novo provedor - apenas certifique-se de quegem19
está no formato$PATH
.O módulo, no qual você salvará este arquivo, pode ser qualquer módulo usado pela(s) máquina(s) que precisa(m) do novo provedor.