Chef 中的属性解析

Attribute Resolution in Chef

我正在使用厨师社区食谱来下载、安装和配置 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'

(我也试过使用默认值、force_default、覆盖和 force_override。没有任何区别。)

cookbooks/my_cookbook/recipes/default.rb

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

输出:

==> default: blah version: 24.4.1

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

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

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

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