如果你有一个覆盖衍生属性的包装器食谱,你需要像这样使用延迟加载:
图书馆食谱
default['foo'] = 42
default['url'] = "http://example.com/#{foo}"
包装食谱
default['foo'] = 9000
default['url'] = "http://example.com/#{foo}"
some_resource 'derp' do
url node['url'] % { foo: node['foo'] }
action :do_stuff
end
以上作品。
如何对多个派生属性使用延迟加载?
例如,我需要从url
派生derp
foo
来自 default['foo'] = 42
default['derp'] = "bar-#{foo}"
default['url'] = "http://example.com/#{derp}"
some_resource 'derp' do
url node['url'] % { foo: node['foo'], derp: node['derp'] } #Guessing this is the right syntax
action :do_stuff
end
KeyError
--------
key{node['url']} not found
然而,这会产生错误
No such module 'Scaffold'
此示例大大简化,完整代码在此处列出:https://github.com/SimpleFinance/chef-zookeeper/issues/151
更新
供参考,此问题已解决:https://github.com/SimpleFinance/chef-zookeeper/commit/6750ea8c11a6dd7ef1c0f76ac8c61b71a172fb80
答案 0 :(得分:1)
正如我之前向您解释的那样,这就像任何普通的基于C语言的sprintf一样。没有魔力。您还在字符串中使用#{}
而不是%{}
,因此这些都不起作用。
请按照我给你的例子:
default['foo'] = 42
default['derp'] = "bar-%{foo}"
default['url'] = "http://example.com/%{derp}"
some_resource 'derp' do
derp = node['derp'] % {foo: node['foo']}
url node['url'] % { foo: node['foo'], derp: derp }
end