Как установить драгоценные камни для 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 , который необходимо вызвать. Есть ли другой способ? Спасибо!

1
задан 6 July 2016 в 16:30
1 ответ

Хорошо, "легкий" способ - это реализовать собственного поставщика пакетов. К счастью, можно унаследовать все от существующего поставщика гемов, переопределив только саму команду 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 .

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

0
ответ дан 4 December 2019 в 06:08

Теги

Похожие вопросы