Я использую сторонний модуль, который использует функцию 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.
Что здесь происходит?
Что происходит, так это то, что пока ваш агент марионетки имеет правильную версию Ruby, как вы нашли, фактическая компиляция каталога происходит в главной службе марионетки.
В этом деле ваш виноват; мастер не использует обычный рубин, он использует JRuby. Даже в самых последних версиях puppetserver на момент написания этой статьи (5.1.4) значение JRuby по умолчанию, используемое puppetserver, равно 1.7. Чтобы переключиться на JRuby 9k и получить ожидаемые функции (имейте в виду, что они называют это «несколько экспериментальным»), убедитесь, что ваш мастер марионеток работает под управлением версии 5.0 или новее, затем измените переменную среды, как описано в документации для более новой версии JRuby.