【发布时间】: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