我使用下载,安装,配置SDK的厨师社区食谱。 (让我们称之为blah-sdk。)你只需要包括#recipe' blah-sdk'和中提琴,它已经安装好了。它有一个属性,指定它将安装的blah-sdk的版本。此版本属性依次用于形成相应的' download_url'属性。从理论上讲,我应该能够将版本属性的值设置为cookbook中包含blah-sdk的其他内容。但有一个问题。在我的覆盖版本属性之前,将设置download_url属性(使用blah-sdk cookbook中指定的默认版本)。所以错误的URL用于检索默认版本而不是我想要的版本。我也可以在我的食谱中设置download_url,但这打破了'blah-sdk'菜谱。在开始工作之前,我也可能会在实验中使用一些长长的属性来玩傻瓜。必须有一个更好的方法。它是什么?
食谱/嗒嗒-SDK /属性/ default.rb:
default['blah']['version'] = '24.4'
default['blah']['download_url'] = "http://dl.company.com/blah/blah-sdk_r#{node['blah']['version']}-linux.tgz"
食谱/嗒嗒-SDK /食谱/ default.rb:
...
print("blah version: #{node['blah']['version']}")
print("blah download_url: #{node['blah']['download_url']}")
...
食谱/ my_cookbook /属性/ default.rb:
normal['blah']['version'] = '24.4.1'
(我还尝试过使用default,force_default,override和force_override。没有任何区别。)
食谱/ my_cookbook /食谱/ default.rb
...
include_recipe 'blah-sdk'
...
输出:
==>默认值:blah version: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/
答案 0 :(得分:5)
有关此问题的概述,请参阅https://coderanger.net/derived-attributes/。没有好的解决方案不涉及修改上游菜谱。最简单的解决方案是在包装器中复制派生属性。