我正在使用第三方模块,该模块使用了 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 版本。