默认属性的典型用例
食谱属性:
default['human']['jack']['arms'] = 2
default['human']['jack']['legs'] = 2
default['human']['jack']['heads'] = 1
在节点/角色中:
override['human']['jack']['legs'] = 1
也在食谱中:
node.override['human']['jack']['legs'] = 1
我的用例带有动态收集
因此,如果我的食谱不知道杰克是否存在节点/角色,并且我想要许多条目的动态集合。在默认值中定义或合并的好策略是什么?
我不想建议解决方案,所以我将使用为杰克和吉尔不同的示例,我不必定义默认值(例如两个武器每次定义新实例时)。
食谱属性:
default['human'][*] = {
"arms" => 2,
"legs" => 2,
"heads" => 1
}
在节点/角色中:
default['human']['jack'] = {
"legs" => "1"
}
default['human']['jill'] = {
"superpower" => "flying"
}
是的,厨师属性使用深层合并,您可以在食谱中执行此操作,请参阅http://docs.oppcode.com/essentials_node_object_deep_merge.html
在食谱中执行此操作:
node['nginx']['sites'].each_key do |site|
node.default['nginx']['sites'][site] = node['nginx']['site_defaults']
end
log JSON.pretty_generate(node['nginx']['sites'])
食谱属性:
default['nginx']['site_defaults']['listen'] = [80]
default['nginx']['site_defaults']['location'] = '/'
default['nginx']['site_defaults']['index'] = ['index.html','index.htm']
default['nginx']['sites']['api']['index'] = 'api.cgi'
在节点/角色中:
"nginx" : {
"sites" : {
"blog" : {
"location" : "/blog/",
"listen" : [443]
},
"wiki" : {
"index" : ["index.php"]
}
}
},
产生
* log[{
"api": {
"listen": [
80
],
"location": "/",
"index": [
"index.html",
"index.htm"
]
},
"blog": {
"listen": [
443
],
"location": "/blog/",
"index": [
"index.html",
"index.htm"
]
},
"wiki": {
"listen": [
80
],
"location": "/",
"index": [
"index.php"
]
}
}] action write
请注意,如果执行此操作,则配方默认值优先于属性默认值,因此API索引被覆盖。以下将有效。
force_default['nginx']['sites']['api']['index'] = 'api.cgi'
也要非常小心的数组,有时会合并其他时间(上)。