Рубин, включенный в 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
s реальный / 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-команду в качестве параметра в марионеточном манифесте, это невозможно сделать без полной перезаписи существующего gem-provider. Мой способ намного проще и столь же эффективен.
В качестве бонуса копирование файла с другим именем (например, gem19.rb
) автоматически создаст нового провайдера - только убедитесь, gem19
находится в $ PATH
.
Модуль, под которым вы сохраните этот файл, может быть любым модулем, используемым машиной (ами) которым нужен новый провайдер.