【问题标题】:Attribute Resolution in ChefChef 中的属性解析
【发布时间】:2016-02-16 09:11:16
【问题描述】:

我正在使用一个厨师社区食谱来下载、安装和配置 SDK。 (我们称它为 blah-sdk。)您只需 include_recipe 'blah-sdk' 和 viola,它就已安装。它有一个属性指定它将安装的 blah-sdk 的版本。该版本属性又用于形成相应的“download_url”属性的值。从理论上讲,我应该能够将版本属性的值设置为包含 blah-sdk 的食谱中的其他内容。但有一个问题。在我的覆盖版本属性设置之前,download_url 属性被设置(使用 blah-sdk 食谱中指定的默认版本)。所以错误的 url 用于检索默认版本而不是我想要的版本。我也可以在我的食谱中设置 download_url,但这会破坏“blah-sdk”食谱的封装。在开始工作之前,我也可能会尝试用一些长长的属性流来试验性地打地鼠。必须有更好的方法。这是什么?

cookbooks/blah-sdk/attributes/default.rb:

default['blah']['version'] = '24.4'
default['blah']['download_url'] = "http://dl.company.com/blah/blah-sdk_r#{node['blah']['version']}-linux.tgz"

cookbooks/blah-sdk/recipes/default.rb:

...
print("blah version: #{node['blah']['version']}")
print("blah download_url: #{node['blah']['download_url']}")
...

cookbooks/my_cookbook/attributes/default.rb:

normal['blah']['version'] = '24.4.1'

(我也尝试过使用 default、force_default、override 和 force_override。没有区别。)

cookbooks/my_cookbook/recipes/default.rb

...
include_recipe 'blah-sdk'
...

输出:

==> 默认值:blah 版本:24.4.1

==> 默认值:blah download_url: http://dl.company.com/blah/blah-sdk_r24.4-linux.tgz

演示问题的代码和 coderanger 建议的解决方案(如果您可以修复第三方说明书): https://github.com/marc-swingler/stackoverflow_question

不是最佳解决方案,但由于加载属性的顺序,将版本放入角色或环境也可以。 https://christinemdraper.wordpress.com/2014/10/06/avoiding-the-possible-pitfalls-of-derived-attributes/

【问题讨论】:

  • 使用正常优先级属性是包装食谱并覆盖源食谱默认值。参见示例:stackoverflow.com/questions/28775225/…
  • 试过了。我还尝试了 force_default、override 和 force_override。结果相同。 download_url 属性是使用 blah-sdk 食谱中定义的版本属性而不是我的包装器中定义的属性解析的。 (顺便说一句,我编辑了这个问题以反映你的建议。希望让它更清楚一点。)

标签: attributes chef-infra cookbook


【解决方案1】:

有关此问题的概述,请参阅https://coderanger.net/derived-attributes/。没有不涉及修改上游说明书的好的解决方案。最简单的解决方案是在包装器中复制派生属性。

【讨论】:

  • 这就是我害怕的答案。不过,我将能够停止用头撞墙,谢谢。很棒的链接顺便说一句。我会在编写自己的食谱时使用它。
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多