【问题标题】:Chef: attributes get overriden based on 'depends' order厨师:属性根据“依赖”顺序被覆盖
【发布时间】:2014-12-09 00:25:51
【问题描述】:

我有下一个部署方案:

  • 两台服务器应该一起部署在同一台机器上
  • 它们的共同属性 - 主机名、端口、默认用户名和密码
  • 特定属性 - 例如上下文路径

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

我通过以下方式配置了最顶层的食谱:

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

我应该怎么做才能限制包含资源的属性范围?

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    您应该限定节点对象中的属性

    node['app1']['attribute1']
    node['app2']['attribute2']
    

    并且在每个配方中使用 app1app2 的正确范围

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

    我看不出你是如何使用单独的说明书来完成这项工作的,除非使用不同的运行列表进行不同的运行(这会改变每次运行的节点对象。

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

    【讨论】:

    • 谢谢,但如果两个对象都存在共同属性,我该怎么办?只需执行node['app1']['common1'] = node.default['common1'] 之类的操作?
    • Commons 属性可以保留并在每个应用程序配方中按原样使用(当然,只要它们对所有应用程序具有相同的值)
    【解决方案2】:

    首先,您应该像 Tensaibai 所说的那样确定您的属性范围。在大多数情况下,只有当它们确实很常见时,共同属性才应该存在,在这种情况下,您希望两本食谱都看到相同的值。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多