0

如果有人能向我解释为什么我在不久前创建的自定义 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,尝试以相同方式指定“属性”会导致以下错误:

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 更改日志中找到任何表明不再支持这种定义属性/属性的方法的内容。根据我对 Ruby 的理解,虽然我远非专家,但字符串可以用来代替符号,反之亦然。这是否有一个简单的原因,或者这可能是 Chef 中的一个错误?

4

1 回答 1

1

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

于 2016-03-09T16:47:18.980 回答