是否可以配置可在配方中访问的属性?如果有,怎么样?我为每个食谱配置了属性,但是我想消除重复的重复。
答案 0 :(得分:5)
Chef的工作方式是,在汇聚开始时,Chef会遍历所有具有将在节点上运行的配方的烹饪书(直接在运行列表上或通过include_recipe
引用)。然后,对于每个食谱,Chef将读入所有存储在attributes
文件夹中的属性文件,并将属性添加到node
哈希。
这里需要注意的重要一点是,属性与您正在执行的配方无关,并且所有配方都会看到加载的属性的相同视图。
您的描述有点模糊,但是从我可以收集到的内容中您可以获得一份包含一些食谱的食谱,并为每个食谱创建相应的属性文件。在每个属性文件中,您都在重新定义相同的属性(例如default['myapp']['foo'] = "blah"
)。
由于我在开始时描述的过程,这不是必需的。在收敛时,Chef将读取您的所有属性文件,无论您正在运行什么配方。这意味着要加载的第二个(或第三个或第四个等)属性文件将只覆盖先前加载的属性文件设置的node['myapp']['foo']
属性。
在这种情况下,常见的模式是拥有一个default.rb
属性文件,该文件定义了所有配方将使用的所有常用属性。如果需要,您可以将配方/组件特定的属性移动到它们自己的属性文件中。
在这种情况下要注意的一件事是Chef按字母顺序加载属性文件。如果您的特定于配方的属性文件(例如client.rb
)引用了default.rb
中定义的属性之一,那么您将需要使用include_attribute
指令以使Chef加载{{ 1}}在default.rb
之前,否则client.rb
的所有属性仍为零。