Назад | Перейти на главную страницу

Как установить драгоценные камни для Ruby не по умолчанию с помощью Puppet?

Рубин, включенный в 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.

Модуль, в котором вы сохраните этот файл, может быть любой модуль, используемый машинами, которым нужен новый провайдер.