【问题标题】:Is there anyway to define defaults for multidimensional attribute trees in Chef?无论如何在 Chef 中定义多维属性树的默认值吗?
【发布时间】:2014-06-25 08:14:17
【问题描述】:

默认属性的典型用例

配方属性:

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

我的动态集合用例

如果我的配方不知道 Jack 将存在某个节点/角色并且我想要一个用于大量条目的动态集合怎么办。定义或合并默认值的好策略是什么?

我不想建议一个解决方案,所以我将在我的示例中使用 组成的通配符,其中 Jack 和 Jill 不同但我不必定义默认值(比如两个手臂和一个头)每次我定义一个新实例时。

配方属性:

default['human'][*] = { 
    "arms" => 2,
    "legs" => 2,
    "heads" => 1
}

在节点/角色中:

default['human']['jack'] = { 
    "legs" => "1"
}
default['human']['jill'] = { 
    "superpower" => "flying"
}

【问题讨论】:

  • 顺便说一句,我选择示例是因为我无法轻松描述这个问题。这是第三方解决了如何使用自定义merge_attribute_tree“为多元素属性树提供默认值”的方法。 Chef/ruby 肯定有一个干净的内置解决方案
  • 您最好为此使用数据包。如果做不到这一点,您可能会考虑创建一个默认哈希,因为缺少更好的短语,您可以在配方本身中复制模板。
  • 是的,我们确实使用了数据包,但我看不出它们如何帮助逻辑在未为实例定义时合并默认值......你是如何解决这个问题的?

标签: ruby attributes chef-recipe chef-infra


【解决方案1】:

是的,厨师属性使用深度合并,您可以在食谱中执行此操作,请参阅http://docs.opscode.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'

还要非常小心数组,有时它们会被合并,有时会被替换(上图)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2015-06-06
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多