2015-11-15 192 views
0

我正在使用下载,安装,配置SDK的厨师社区食谱。 (我们称之为blah-sdk)。你只需要include_recipe'blah-sdk'和viola,它已经安装了。它有一个属性指定它将安装的blah-sdk的版本。这个版本属性反过来被用来形成相应的'download_url'属性的值。理论上,我应该能够将版本属性的值设置为食谱中的其他内容,其中包括blah-sdk。但有一个问题。在我的覆盖版本属性之前,download_url属性被设置(使用在blah-sdk食谱中指定的默认版本)。所以错误的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 /属性/默认值。 RB:

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

(。我一直在使用默认情况下,force_default,覆盖和force_override也试过没有什么区别)

食谱/ my_cookbook /食谱/ default.rb

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

输出:

==>默认:嗒嗒版本:24.4.1

==>默认:嗒嗒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

使用普通优先级属性是包装食谱并覆盖了源食谱默认值。看例子:http://stackoverflow.com/questions/28775225/how-to-use-chef-to-update-alternatives-for-java-using-execute/28775684#28775684 –

+0

试过。我也试过了force_default,override和force_override。同样的结果。 download_url属性使用blah-sdk cookbook中定义的版本属性来解析,而不是在我的包装器中定义的版本属性。 (顺便说一下,我编辑了这个问题来反映你的建议,希望能让它更清楚一点。) –

回答

4

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

+0

这就是我害怕的答案。不过,我可以停止将我的头撞在墙上,谢谢。真棒链接BTW。我会在写我自己的食谱时使用它。 –