在 Ruby 中,我们可以使用 nil 来表示某事为空。出于您的目的,您可以使用此功能最初将您的节点属性保持为空。然后根据需要在外部提供一个值。
示例:
在你的attributes/default.rb:
default['some']['attr'] = nil
default['default_attr'] = 'one, two, three, four'
在some.json:
{
"some": {
"attr": "one, two"
}
}
然后在你的recipes/default.rb:
list = nil
if node['some']['attr'].nil?
list = node['default_attr']
else
list = node['some']['attr']
end
puts "***** list: #{list}"
现在如果您通过-j some.json 设置值,那个 值将用于list。否则list 将被设置为node['default_attr']。
更新:
当您第一次提供 -j some.json 时,node attributes 已保存。所以在下一次运行中['some']['attr'] 不再是nil。要完成这项工作:
- 您必须
edit node 并删除此属性。
- 以
--override-runlist 模式运行chef-client(并跳过节点保存)。
例子:
没有some.json:
~$ chef-client -o recipe[my_cookbook]
Compiling Cookbooks...
***** list: one, two, three, four
some.json:
~$ chef-client -o recipe[my_cookbook] -j ./node.json
Compiling Cookbooks...
***** list: one, two
注意:虽然这将解决这个特殊要求,但始终跳过节点保存并不是一个好主意。您可能需要重新考虑使用属性优先级来为您的用例工作。