覆盖厨师食谱模板

时间:2015-03-27 15:26:14

标签: chef

我想覆盖cookbook包装器中的模板,但模板资源是在提供程序中定义的,而不是在配方中定义的。我已经覆盖了像这个例子http://syshero.org/post/67727745605/override-templates-from-third-party-cookbooks-on

这样的包装器中的模板
include_recipe "rsyslog"

begin
  t = resources(:template => "/etc/rsyslog.conf")
  t.source "rsyslog.conf.erb"
  t.cookbook "example"
rescue Chef::Exceptions::ResourceNotFound
  Chef::Log.warn "could not find template /etc/rsyslog.conf to modify"
end

并且始终按预期工作。

具有我试图改变的配置的食谱是git_user食谱 https://supermarket.chef.io/cookbooks/git_user

我试图改变的地方是提供者 https://github.com/lxmx/chef-git-user/blob/master/providers/default.rb#L30

尝试使用与食谱相同的格式似乎不起作用?

include_recipe "git_user::data_bag"                                              

def load_current_resource                                                        
    @login = new_resource.login                                                  
    @home  = new_resource.home  || (@login == 'root' ? '/root' : "/home/#{@login}")
end                                                                              

begin                                                                            
    home = @home                                                                 
    r = resources(:template => "#{home}/.ssh/config")                            
    r.cookbook "MY-git_user"                                                    
rescue Chef::Exceptions::ResourceNotFound                                        
    Chef::Log.warn "could not find MY-git_user::data_bag template to override!" 
end  

2 个答案:

答案 0 :(得分:2)

不是你想到的答案我认为并且可能不准确,但是变得太长而不能发表评论:

lwrp内部资源在汇聚阶段调用提供程序时进行编译和聚合,它们在编译时不会被处理,因此它们不能被访问,因为它们不会被访问。已经存在了。 (一旦lwrp完成,它们已经收敛,所以你无法在收敛时修改它们。)

use_inline_resources documentation用两个表解释这个(编译然后收敛阶段)。

因此,无法覆盖定义到提供程序中的资源,因为它不会出现在lwrp提供程序执行本身的资源列表中。

关于use_inline_resource:它使lwrp的内部资源的通知由lwrp资源本身触发,我看到lwrp资源充当提供者中定义的通知的代理。这允许lwrp中的资源通知"食谱"资源。

无论有没有use_inline_resources机制是相同的,内部资源都会在lwrp收敛时创建和收敛。

答案 1 :(得分:0)

好的,正确的做法是放入PR以允许您在LWRP中指定覆盖的cookbook和source作为属性。其他任何东西都将成为一个重大的黑客。但是,我相信这会起作用(它真的很难看,所以请在使用PR之前再使用它)

some_resource 'myname' do 
  some_attribute lazy do
    home = @home                                                                 
    r = resources(:template => "#{home}/.ssh/config")                            
    r.cookbook "MY-git_user" 
    my_value_for_some_attribute
  end
end

基本上,您正在劫持lazy属性,以便在正确的时间首先执行模板覆盖,然后实际设置您要设置的值。

由于您似乎通过其他食谱中的data_bags食谱包含LWRP,因此不确定这是否适用于您。您可能还必须在本地重新实现该配方,以便您可以使用lwrp资源。