Ruby 是否在Chef中定义多维属性树的默认值? 默认属性的典型用例
配方属性:Ruby 是否在Chef中定义多维属性树的默认值? 默认属性的典型用例,ruby,attributes,chef-recipe,chef-infra,Ruby,Attributes,Chef Recipe,Chef Infra,配方属性: default['human']['jack']['arms'] = 2 default['human']['jack']['legs'] = 2 default['human']['jack']['heads'] = 1 default['human'][*] = { "arms" => 2, "legs" => 2, "heads" => 1 } default['nginx']['site_defaults']['listen']
default['human']['jack']['arms'] = 2
default['human']['jack']['legs'] = 2
default['human']['jack']['heads'] = 1
default['human'][*] = {
"arms" => 2,
"legs" => 2,
"heads" => 1
}
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'
在节点/角色中:
override['human']['jack']['legs'] = 1
default['human']['jack'] = {
"legs" => "1"
}
default['human']['jill'] = {
"superpower" => "flying"
}
"nginx" : {
"sites" : {
"blog" : {
"location" : "/blog/",
"listen" : [443]
},
"wiki" : {
"index" : ["index.php"]
}
}
},
同样在配方中:
node.override['human']['jack']['legs'] = 1
我的动态集合用例
那么,如果我的配方不知道Jack将存在于节点/角色中,而我想要一个包含大量条目的动态集合,该怎么办呢。用默认值定义或合并的好策略是什么
我不想建议解决方案,所以我将使用一个虚构的通配符作为示例,其中Jack和Jill是不同的,但我不必每次定义新实例时都定义默认值(如双臂和头部)
配方属性:
default['human']['jack']['arms'] = 2
default['human']['jack']['legs'] = 2
default['human']['jack']['heads'] = 1
default['human'][*] = {
"arms" => 2,
"legs" => 2,
"heads" => 1
}
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'
在节点/角色中:
override['human']['jack']['legs'] = 1
default['human']['jack'] = {
"legs" => "1"
}
default['human']['jill'] = {
"superpower" => "flying"
}
"nginx" : {
"sites" : {
"blog" : {
"location" : "/blog/",
"listen" : [443]
},
"wiki" : {
"index" : ["index.php"]
}
}
},
是的,厨师属性使用深度合并,您可以在菜谱中执行此操作,请参阅 在配方中执行以下操作:
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['human']['jack']['arms'] = 2
default['human']['jack']['legs'] = 2
default['human']['jack']['heads'] = 1
default['human'][*] = {
"arms" => 2,
"legs" => 2,
"heads" => 1
}
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'
在节点/角色中:
override['human']['jack']['legs'] = 1
default['human']['jack'] = {
"legs" => "1"
}
default['human']['jill'] = {
"superpower" => "flying"
}
"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'
还要非常小心数组,有时会合并,有时会替换(如上所述) 顺便说一句,我选择了一些例子,因为我不能很容易地描述这个问题。下面是一个第三方,他解决了如何使用自定义。当然,chef/ruby有一个干净的内置解决方案,您最好使用数据包。如果不这样做,您可能会考虑缺省哈希,因为缺少更好的短语,可以从配方本身中复制模板。是的,我们确实使用了数据库,但我不知道它们是如何帮助逻辑在未定义实例的情况下合并默认值的。你是怎么解决的?