Рубин, включенный в RedHat / CentOS-6, имеет версию 1.8.7, которая слишком устарела для многих приложений. Хотя можно просто обновить его с помощью специально созданного RPM, мои коллеги уклоняются от этой идеи и хотят использовать rh-ruby22 пакеты доступны из SCL-репо.
Это устанавливает ruby-2.2, что отлично, но под /opt/rh/rh-ruby22
. Теперь мне нужно установить несколько драгоценных камней и, очевидно, я хотел бы использовать Puppet:
package {'example':
ensure => '0.25',
provider => 'gem'
}
К сожалению, поставщик гемов вызывает /usr/bin/gem
вместо того /opt/rh/rh-ruby22/root/usr/bin/gem
что нужно вызвать. Есть ли другой путь? Спасибо!
Хорошо, «простой» способ - реализовать собственного поставщика пакетов. К счастью, можно унаследовать все от существующего поставщика гемов, переопределив только саму команду gem.
Поскольку rh-ruby22 в SCL настолько отсталый, вы даже не можете вызвать его ruby
или gem
напрямую - без настройки LD_LIBRARY_PATH
сначала - создаем для них обертки в /usr/bin
. В /usr/bin/gem2
, например, задает путь к библиотеке (и PATH
) а потом exec
настоящий /opt/rh/rh-ruby22/root/usr/bin/gem
со своими аргументами ("$@"
).
Мой новый провайдер использует gem2
сценарий-оболочка, который сделает свое дело.
Я создал файл gem2.rb
в modules/SOMEMODULE/lib/puppet/provider/package/
со следующим содержимым (протестировано с 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
Хотя я надеялся, что моя реализация позволит указать gem-command в качестве параметра в марионеточном манифесте, это невозможно сделать, не переписав полностью существующий gem-provider. Мой путь намного проще и столь же эффективен.
В качестве бонуса копирование файла под другое имя (например, gem19.rb
) автоматически создаст нового провайдера - только убедитесь, gem19
находится в $PATH
.
Модуль, в котором вы сохраните этот файл, может быть любой модуль, используемый машинами, которым нужен новый провайдер.