跨配方访问属性

时间:2013-09-23 13:50:28

标签: chef vagrant

是否可以配置可在配方中访问的属性?如果有,怎么样?我为每个食谱配置了属性,但是我想消除重复的重复。

1 个答案:

答案 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的所有属性仍为零。