Я использую сторонний модуль, который использует функцию Ruby, которая не была представлена до версии 2.1. Версия ruby в моей среде выполнения - 2.1.9:
Debug: Facter: fact "ruby" has resolved to {
platform => "x86_64-linux",
sitedir => "/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.1.0",
version => "2.1.9"
}.
, так что теоретически со мной все будет в порядке. Однако, когда я запускаю марионеточный агент, я получаю
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Function Call, undefined method `to_h' for #<Array:0xc8fd201>
Array # to_h
, доступный в Ruby 2.1.9, поэтому эта ошибка означает, что пользовательская функция в модуле оценивается с версией Ruby до 2.1, хотя я могу Я не нашел другой версии Ruby, которую она могла бы использовать. Я полностью очистил среду от всего до версии 2.4, в результате чего осталась только встроенная в Puppet версия 2.1.9.
Что здесь происходит?
Что происходит, так это то, что, хотя ваш агент марионетки имеет правильную рубиновую версию, как вы обнаружили, фактическая компиляция каталога происходит в главной службе марионеток.
Вот ваш виновник в Это дело; мастер не использует обычный рубин, он использует JRuby. Даже в самых последних версиях puppetserver на момент написания этой статьи (5.1.4) значение JRuby по умолчанию, используемое puppetserver, равно 1.7. Чтобы переключиться на JRuby 9k и получить ожидаемые функции (имейте в виду, что они называют это «несколько экспериментальным»), убедитесь, что ваш мастер марионеток работает под управлением версии 5.0 или новее, затем измените переменную среды, как описано в документы для новой версии JRuby.