Chef中的属性解析

Mar*_*ler 0 attributes cookbook chef-infra

我正在使用下载,安装和配置SDK的厨师社区食谱.(我们称之为blah-sdk.)你只需要包括'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"
Run Code Online (Sandbox Code Playgroud)

食谱/等等-SDK /食谱/ default.rb:

...
print("blah version: #{node['blah']['version']}")
print("blah download_url: #{node['blah']['download_url']}")
...
Run Code Online (Sandbox Code Playgroud)

食谱/ my_cookbook /属性/ default.rb:

normal['blah']['version'] = '24.4.1'
Run Code Online (Sandbox Code Playgroud)

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

食谱/ my_cookbook /食谱/ default.rb

...
include_recipe 'blah-sdk'
...
Run Code Online (Sandbox Code Playgroud)

输出:

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

cod*_*ger 5

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