CHEF可以延迟加载多个属性吗?

时间:2015-12-08 18:47:01

标签: ruby chef

如果你有一个覆盖衍生属性的包装器食谱,你需要像这样使用延迟加载:

图书馆食谱

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

1 个答案:

答案 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