【问题标题】:chef - precedence of attributes set on node levelchef - 在节点级别设置的属性的优先级
【发布时间】:2014-10-02 02:00:24
【问题描述】:

也许我错过了文档中的某些内容,但是在阅读了在多个地方定义属性时使用的顺序后,我不明白在 节点级别 设置的属性在哪里进入等式

在可以设置和覆盖属性的 1 到 15 级中,它提到了配方、环境、角色、属性文件,但它似乎从未提到节点上定义的属性会发生什么,比如knife node edit ...

看起来你只能在节点上定义 normal 类型的属性?仅在列表...属性文件和配方中分别提到了优先级 7 和 8 的普通属性。

那么,如果我在节点上设置了一个同样在环境和角色级别上定义的属性,谁会赢?

【问题讨论】:

  • 在这里回答我自己的问题,以防其他人偶然发现这个问题。主厨医生说有 15 个优先级……错误。有 16 个。如果你编辑一个节点 JSON,你可以在那里设置普通属性。这些值取代了配方中使用 force_default 设置的相同键/值对,但不是食谱属性文件中设置的正常值。此外,Chef 文档暗示您可以设置各种类型的节点 JSON 属性……但您不能。它只接受普通类型。如果您尝试使用其他类型,则在使用“刀编辑节点..”时,它将在保存时从配置中静默删除。
  • 此问题与chef versioning - is there an order of precedence 不重复 - 该问题与食谱版本有关,而此问题与节点属性优先级有关。

标签: chef-infra knife


【解决方案1】:

The Chef Documentation 有一个table showing the node attribute precedence。如果您在 Chef 服务器上编辑节点对象,或使用 JSON 文件提供节点属性(-j 选项给 chef-solo 或 chef-client),这些都是“节点”级别。这与从配方设置属性的级别相同。顺便说一句,您可以使用属性方法(node.normal 等)在配方中轻松设置任何级别的节点属性,但自动除外。在节点对象本身上(在 Chef 服务器中),您可以设置 default、normal 和 override,但不能设置 force_default 或 force_override,也不能设置 automatic。

我们告诉人们的一般准则是始终使用默认属性:

  1. default['thing'] = 'thang' - 在食谱的属性文件中。
  2. node.default['thing'] = 'thang' - 在食谱中。
  3. "default": { "thing": "thang" } - 在节点对象的 JSON 中
  4. default_attributes("thing" => "thang") - 担任角色 (ruby DSL syntax shown)。
  5. 一般避免environment设置属性...

当您需要在其他地方设置其他优先级的属性时,您就会知道。 :)

这似乎是任意过度设计的;最初只有节点对象/配方和属性文件,它们只是 Ruby 哈希。然后我们添加了角色和环境。在某些时候,也需要设置“默认”值,这些值可以很容易地被覆盖,出于各种组织原因,现在我们有了你今天看到的矩阵。我们对现在的情况非常满意,并认为它为极其广泛的 Chef 用例提供了最大的灵活性。

注意

此问题与 chef versioning - is there an order of precedence 不重复 - 该问题与食谱版本有关,而此问题与节点属性优先级有关。

还要注意,由于配方是 Ruby,并且由客户端执行,您可以编写库以有趣的方式操作属性。一个例子是Chef's whitelist-node-attrs cookbook

【讨论】:

  • 嗨...感谢您提供的信息,但您告诉我的不是我在测试时看到的。当我尝试“刀编辑节点...”并尝试设置除正常以外的任何类型的任何属性键/值对时,在 vim 中保存更改后,我只会得到输出“节点未更新,跳过节点保存”。当我尝试定义默认或覆盖对时,有时也会得到 Yajl::ParseError。这是刀 11.8.2。您能否给出一个节点 json 的要点或示例,其中键/值属性设置为正常、默认、覆盖等。正如“属性优先级”文档页面所建议的那样?谢谢。
  • 好吧,没关系...我找到了答案,这很烦人。 ---- 默认情况下,edit 命令不会编辑自动、默认或覆盖属性,为此您必须将 -a 或 --all 标志传递给 edit 命令,这将允许您编辑所有当前在节点上设置的属性。文档表明 --all 仅控制显示的内容.. 并不是说​​除非使用它,否则它会阻止您添加/编辑节点 JSON。
  • 请注意,您不能编辑节点对象的自动属性。这些是在 chef-client 运行时由 ohai 的插件(内置或您自己的)生成的。
  • 好的,谢谢.. 关于这个主题的最后一个问题.. 如果查看和编辑所有节点属性类型的唯一方法是传递 --all 参数,该参数还列出了来自 ohai 的节点自动信息。如何从服务器备份节点 JSON,本地存储在 SCM 中,而不下载带有自动信息的 JSON。如果它是动态的,是否真的不需要存储/备份?谢谢。
  • 使用刀下载子命令(在 Chef 11 中可用,或通过刀必备 gem)下载 JSON 对象。节点在恢复后下次运行 chef 时会覆盖自动属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多