我有下一个部署计划:
所以,我创建了基本食谱并指定了所有常用选项。之后,我创建了两个具有特定配方的依赖烹饪书,以运行两个服务器并设置特定的属性值。这件事一直有效,直到我决定再买一本包装食谱 其目的是启动两台服务器并做一些额外的工作。
我以下一种方式配置了最顶级的食谱:
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'看到属性覆盖食谱。
如何限制所包含资源的属性范围?
答案 0 :(得分:1)
您应该在节点对象
中确定属性的范围node['app1']['attribute1']
node['app2']['attribute2']
在每个食谱中使用app1
或app2
在复制阶段创建资源集合之前,
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的属性。无论哪种方式,所有属性文件都将在运行任何配方之前加载。