从 Chef 12.3.0 升级到 12.7.2 时自定义 LWRP 出错

Error with Custom LWRP when upgrading from Chef 12.3.0 to 12.7.2

如果有人能向我解释为什么我在一段时间前创建的自定义 LWRP 上遇到特定问题,我将不胜感激。

对于 Chef 12.3.0,我的自定义 LWRP 属性以这种方式定义得非常好:

attribute 'name',               'kind_of' => String, 'name_attribute' => true
attribute 'older_than',         'kind_of' => Integer, 'default' => 60
attribute 'cron_month',         'kind_of' => String, 'default' => '*'
attribute 'cron_day',           'kind_of' => String, 'default' => '*'
attribute 'cron_minute',        'kind_of' => String, 'default' => '1'
attribute 'cron_hour',          'kind_of' => String, 'default' => '3'
attribute 'log_file',           'kind_of' => String, 'default' => '/var/log/curator.log'
....

对于 Chef 12.7.2,尝试以相同方式指定 "properties" 会导致以下错误:

Chef::Exceptions::ValidationFailed
----------------------------------
Property older_than must be one of: {"kind_of"=>Integer, "default"=>60}!  You passed 7.

LWRP 属性(以前称为属性)在像前面的示例那样定义时不起作用。看来必须使用符号而不是字符串。如果我将代码转换为以下格式,它可以正常工作:

property 'name',               kind_of: String, name_attribute: true
property 'older_than',         kind_of: Integer, default: 60
property 'cron_month',         kind_of: String, default: '*'
property 'cron_day',           kind_of: String, default: '*'
property 'cron_minute',        kind_of: String, default: '1'
property 'cron_hour',          kind_of: String, default: '3'
property 'log_file',           kind_of: String, default: '/var/log/curator.log'
....

我似乎无法弄清楚为什么这是一个问题,也无法在 Chef 变更日志中找到任何表明不再支持这种定义 properties/attributes 的方法的内容。根据我对Ruby的理解,虽然我还远不是专家,但字符串可以用来代替符号,反之亦然。这是否有一个简单的原因,或者这可能是 Chef 中的一个错误?

正如在 IRC 上的回答(请不要交叉 post),字符串曾经起作用的事实是偶然的,并不是 API 的一部分。使用符号作为关键字参数是 Ruby 中的标准,我们坚持这一点。这可能在 12.5 中发生了变化,当时我们重写了资源 属性 处理的内部结构,使其更加独立,同时引入了新的 action-in-resource 语法和其他一些东西。