我真的很感激,如果有人能向我解释为什么我在一段时间内创建了自定义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中的一个错误?
答案 0 :(得分:1)
正如在IRC上的回答(请不要交叉发布),过去工作的字符串是偶然的,而不是API的一部分。使用符号作为关键字参数是Ruby的标准,我们坚持这一点。当我们将资源属性处理的内部重写为更加自包含,并引入新的action
- 资源内语法和其他一些东西时,这可能在12.5中发生了变化。