Puppet 评估模块中与配置版本不同的 Ruby 版本的自定义函数

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"
}.

所以理论上我应该没问题。但是,当我运行 puppet 代理时,我得到了

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 上可用,因此此错误意味着模块中的自定义函数正在使用 2.1 之前的 Ruby 版本进行评估,但我找不到它可能使用的任何其他 Ruby 版本。我已经完全清除了 2.4 版之前的任何环境,只留下 Puppet 内置的 2.1.9 版本。

这里发生了什么?

答案1

发生的情况是,虽然你的 Puppet 代理具有你所找到的正确的 Ruby 版本,但目录的实际编译发生在 Puppet Master 服务中。

在这种情况下,罪魁祸首就是主服务器不使用普通的 ruby​​,而是使用 JRuby。即使在撰写本文时最新的 puppetserver 版本(5.1.4)中,puppetserver 使用的默认 JRuby 也是 1.7。要切换到 JRuby 9k 并获得您期望的功能(请注意,他们称其为“有点实验性的”),请确保您的 puppet master 运行的是 5.0 或更新版本,然后按照文档中的说明更改环境变量适用于较新的 JRuby 版本。

相关内容