无论如何,是否可以为厨师中的多维属性树定义默认值



默认属性的典型用例

食谱属性:

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'

也要非常小心的数组,有时会合并其他时间(上)。

最新更新