【问题标题】:Chef cookbook not seeing overridden attributes in another cookbook厨师食谱没有在另一本食谱中看到被覆盖的属性
【发布时间】:2015-07-31 21:30:40
【问题描述】:

我有一个这样的 run_list [ recipe["git_deploy"], recipe["my_role_cookbook"] ]
我在 my_role_cookbook 的 default.rb 配方中设置了 git_deploy 需要的属性。但是, git_deploy 没有获得这些属性。 如果我将 git_deploy 所需的属性放在 my_role_cookbook/attributes/default.rb 中,那么它可以工作。如果我在 git_deploy 中进行惰性评估 - 它也可以。
如果我在 my_rolecook_book/recipes/default.rb 中使用 node.override,我不明白为什么它不起作用

更大的图景:我有三个环境,在 my_role 的角色文件中,我有这样的 env_run_lists:

"production" => ["recipe[git_deploy]","recipe[my_role]"],
"staging" =>["recipe[git_deploy]","recipe[my_role]"],
"develop" => ["recipe[my_role]"]

编辑
在两本食谱中使用debug_value 后:

  • 在 git_deploy 中使用惰性求值时(my_role_cookbook/recipe/default.rb 中使用的 node.override):

    • Chef::git_deploy 的日志输出
      [2015-07-31T11:44:12+00:00] FATAL: [["set_unless_enabled?", false], ["default", :not_present], ["env_default", :not_present], ["role_default", :not_present], ["force_default", :not_present], ["normal", :not_present], ["override", :not_present], ["role_override", :not_present], ["env_override", :not_present], ["force_override", :not_present], ["automatic", :not_present]]
    • 来自 my_role_cookbook 的日志输出
      [2015-07-31T11:44:12+00:00] FATAL: [["set_unless_enabled?", false], ["default", :not_present], ["env_default", :not_present], ["role_default", :not_present], ["force_default", :not_present], ["normal", :not_present], ["override", "youtube-minion"], ["role_override", :not_present], ["env_override", :not_present], ["force_override", :not_present], ["automatic", :not_present]]
  • 不使用惰性求值时(my_role_cookbook 中只有 node.override)

    • 来自 git_deploy 的日志。在带有 debug_value 的日志之后,git_deploy 失败并显示 undefined method `[]' for nil:NilClass

    [2015-07-31T11:45:53+00:00] FATAL: [["set_unless_enabled?", false], ["default", :not_present], ["env_default", :not_present], ["role_default", :not_present], ["force_default", :not_present], ["normal", :not_present], ["override", :not_present], ["role_override", :not_present], ["env_override", :not_present], ["force_override", :not_present], ["automatic", :not_present]]

    • 来自 my_role_cookbook 的日志 - 此日志未显示,因为之前的配方失败。

【问题讨论】:

  • 试试debug_value
  • 感谢您的提示。我添加了命令的输出。

标签: attributes vagrant chef-infra chef-solo


【解决方案1】:

attributes/* 中的所有文件都会在任何配方运行之前进行合并和评估。由于您已将 git_deploy 放在您的运行列表的首位,因此它的食谱在您之前运行。您必须使用属性文件才能在 git deploy 的配方运行之前注入您的属性,然后再运行您的配方。或者将 git_deploy 作为你的配方中的一个包含。

这是how attribute files work上的更多链接。

【讨论】:

  • 感谢您的回复,Martin :) 不过我有点困惑,我认为在编译阶段,将对 node.override 语句进行评估,并且在编译阶段结束时,所有属性都将是根据优先级设置。之后,在收敛阶段,将应用属性。谢谢
  • @JoroTenev:你说得对,node.override 将在编译阶段进行评估。但由于首先评估了 git deploy 配方,并构建了其中的资源,所以这并不重要。
  • 谢谢马丁 - 非常感谢。但是,我正在阅读厨师文档,并且不断看到让我感到困惑的东西。 This link,在重置节点属性部分,还有这个 link 在深度合并部分。我真的很想了解事情是如何运作的,我感觉文档所说的和我从实验中看到的不同,这让我很困扰。干杯
  • 我认为您缺少的是所有属性都按食谱顺序评估,然后所有食谱都按食谱顺序评估。由于 git deploy 食谱的配方在您之前编译和融合,因此除非您重新排序配方或使用属性文件插入具有更高优先级的属性,否则您无法影响它们,以便它覆盖 git deploy 中属性文件的优先级。您的链接专门讨论了属性文件中定义的属性。但是您将它们设置在配方中(这不太常见)。
  • I think what you're missing is that all attributes are evaluated in cookbook order, and then all recipes are evaluated in cookbook order. 这就是我所缺少的——非常感谢。我目前正在环境文件或食谱的属性文件夹中设置我的所有属性。再次感谢:)
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2015-05-31
  • 2021-11-01
  • 2019-01-29
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多