3

是否可以配置可跨配方访问的属性?如果是,如何?我已经为每个配方配置了属性,但我想消除大量重复。

4

1 回答 1

5

Chef 的工作方式是在收敛开始时,Chef 遍历所有具有将在节点上运行的食谱的食谱(直接在运行列表上或通过 引用include_recipe)。然后,对于每本食谱,厨师将读取存储在文件夹中的所有attributes属性文件,并将属性添加到node哈希中。

这里要注意的重要一点是,属性与您正在执行的配方无关,并且所有配方将看到已加载属性的相同视图。

您的描述有点含糊,但据我所知,您有一本包含一些食谱的食谱,并且您正在为每个食谱创建一个相应的属性文件。在这些属性文件中的每一个中,您都重新定义了相同的属性(例如default['myapp']['foo'] = "blah")。

由于我在开始时描述的过程,这不是必需的。在收敛时,无论您正在运行什么食谱,Chef 都会读取您的所有属性文件。这意味着要加载的第二个(或第三个或第四个等)属性文件将简单地覆盖node['myapp']['foo']由先前加载的属性文件设置的属性。

在这种情况下,通用模式是拥有一个default.rb属性文件,该文件定义所有配方将使用的所有通用属性。如果需要,您可以将您的配方/组件特定属性移动到它们自己的属性文件中。

在这种情况下需要注意的一件事是 Chef 按字母顺序加载属性文件。如果您的特定于配方的属性文件(例如client.rb)引用了 中定义的属性之一default.rb,那么您将需要使用该include_attribute指令来让 Chefdefault.rb在您的 之前加载client.rb,否则来自的所有属性default.rb仍然为零。

于 2013-09-23T16:58:52.387 回答