Chef:属性基于'依赖'订购

时间:2014-10-14 09:15:35

标签: chef

我有下一个部署计划:

  • 应在同一台计算机上一起部署的两台服务器
  • 他们的共同属性 - 主机名,端口,默认用户名和密码
  • 具体属性 - 例如上下文路径

所以,我创建了基本食谱并指定了所有常用选项。之后,我创建了两个具有特定配方的依赖烹饪书,以运行两个服务器并设置特定的属性值。这件事一直有效,直到我决定再买一本包装食谱 其目的是启动两台服务器并做一些额外的工作。

我以下一种方式配置了最顶级的食谱:

metadata.rb:
    depends "app1"
    depends "app2"

recipe.rb:
    include_recipe "app1::start"
    include_recipe "app2::start"

问题是' include_recipe" app1 :: start"'看到属性覆盖了'app2'菜谱。 因此,如果我将metadata.rb中的顺序更改为: 取决于" app2" 依赖" app1"

然后' include_recipe" app2 :: start"'通过' app1'看到属性覆盖食谱。

如何限制所包含资源的属性范围?

2 个答案:

答案 0 :(得分:1)

您应该在节点对象

中确定属性的范围
node['app1']['attribute1']
node['app2']['attribute2']

在每个食谱中使用app1app2

的正确范围

在复制阶段创建资源集合之前,

Chef加载所有属性文件以构建节点对象,因此无法在同一节点上避免这种情况。

我不知道你是如何使用单独的cookbook完成这项工作的,除非使用不同的运行列表进行不同的运行(这将改变每次运行的节点对象。

有关步骤的详细信息,请参阅this doc on chef-run

答案 1 :(得分:1)

首先,你应该对你的属性进行范围调整,就像Tensaibai说的那样。在大多数情况下,只有普通属性确实存在才会存在,在这种情况下,您希望两个烹饪书看到相同的值。

其次,您可以使用属性文件中的include_attribute指令来控制加载属性的顺序。因此,您的包装器食谱可以在wrapper-cookbook/attributes/default.rb

中包含这些行
include_attribute 'app1::default'
include_attribute 'app2::default'

这将确保首先加载app1的属性。无论哪种方式,所有属性文件都将在运行任何配方之前加载。