【发布时间】:2021-02-14 19:33:01
【问题描述】:
我知道attribute precedence,我也知道不同的attribute sources
我真的无法解释(很长一段时间以来)跨来源的优先级。在阅读attribute precedence 时,人们会假设,
- 属性文件:
default[:mykey],将被覆盖 - recipe:
node.default[:mykey]来自配方,将被覆盖 - 配方:
node.normal[:mykey]来自配方
虽然 1. 和 2. 是正确的,但 3. 并不是因为它是“不同的来源”......我找不到一种基本上计算所有来源的一个属性的值的方法,我们称之为 @987654327 @
我明白了
# assume that default[:mykey]=1 in attributes/test.rb
# echo node.default[:mykey] would be 1
node.default[:mykey]=2
# echo node.default[:mykey] would be 2
# echo node.normal[:mykey] would be empty
# echo node[:mykey] would be empty
node.normal[:mykey] = 'foo'
# echo node.normal[:mykey] would 'foo;
在我的脑海中,我总是假设 node[:mykey] 会在未设置 node.normal[:mykey] 时回退到 node.default[:mykey],但显然情况并非如此。
这就是说,根本没有办法使用节点属性“覆盖默认值”?在我的食谱中,我必须决定是要使用“属性文件的默认源”还是“节点对象属性”......但我不能做类似的事情
只要没有节点对象属性覆盖它,就使用默认属性 - 没有getter,似乎不是设计计划的。
我当然可以在我的attribute/file.rb 中做到这一点
default[:mykey] = node.normal.dig(:mykey) unless node.normal.dig(:mykey).nil?
或者在我的食谱中
node.default[:mykey] = node.normal.dig(:mykey) unless node.normal.dig(:mykey).nil?
当getting 它时,总是在我的recpie 中使用node.default[:mykey] - 但这闻起来像是缺少一个概念。
我的问题:
a) 我所描述的是设计吗?原因是,有替代路线/不同的概念吗?
b) 什么是正确的概念:
“我想在attributes/myvals.rb 中为配方设置默认值,并希望使用节点属性使它们可以覆盖
【问题讨论】:
标签: chef-infra