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

Puppet, оценивающий пользовательскую функцию в модуле с версией Ruby, отличной от настроенной версии

Я использую сторонний модуль, который использует функцию 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.