从 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 语法和其他一些东西。
如果有人能向我解释为什么我在一段时间前创建的自定义 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 语法和其他一些东西。