Chef infra 厨师长:属性根据';取决于';秩序

Chef infra 厨师长:属性根据';取决于';秩序,chef-infra,Chef Infra,我有下一个部署方案: 应一起部署在同一台计算机上的两台服务器 它们的公共属性-主机名、端口、默认用户名和密码 特定属性-例如上下文路径 因此,我创建了base cookbook,并在其中指定了所有常用选项。之后,我创建了两个具有特定食谱的相关食谱,以运行这两个服务器并设置特定属性值。在我决定再买一本包装食谱之前,这件事一直在起作用 其目的是启动两台服务器并做一些额外的事情 我用下一种方式配置了最顶级的食谱: metadata.rb: depends "app1" depend

我有下一个部署方案:

  • 应一起部署在同一台计算机上的两台服务器
  • 它们的公共属性-主机名、端口、默认用户名和密码
  • 特定属性-例如上下文路径
因此,我创建了base cookbook,并在其中指定了所有常用选项。之后,我创建了两个具有特定食谱的相关食谱,以运行这两个服务器并设置特定属性值。在我决定再买一本包装食谱之前,这件事一直在起作用 其目的是启动两台服务器并做一些额外的事情

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

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”食谱覆盖的属性


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

您应该在节点对象中定义属性范围

node['app1']['attribute1']
node['app2']['attribute2']
在每个配方中,使用
app1
app2

Chef在复制阶段创建资源集合之前加载所有属性文件以构建节点对象,因此无法在同一节点上避免这种情况

我看不出您是如何使用单独的烹饪书来实现这一点的,除非使用不同的runlist进行不同的运行(这将更改每次运行的节点对象)


有关步骤的详细信息,请参见。

首先,您应该像Tensaibai所说的那样确定属性的范围。在大多数情况下,公共属性只有在它们确实是公共的情况下才应该存在,在这种情况下,您希望两本烹饪书看到相同的值

其次,您可以通过在属性文件中使用
include\u attribute
指令来控制属性的加载顺序。因此,您的包装器cookbook可以在
wrapper cookbook/attributes/default.rb

include_attribute 'app1::default'
include_attribute 'app2::default'

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

谢谢,但如果两个对象都存在公共属性,我该怎么办?只需执行类似于
node['app1']['common1']=node.default['common1']
?Commons属性可以保持不变,并在每个应用程序配方中按原样使用(当然,只要它们对所有应用程序具有相同的值)