Chef infra 覆盖厨师烹饪书模板

Chef infra 覆盖厨师烹饪书模板,chef-infra,Chef Infra,我想覆盖cookbook包装中的模板,但模板资源是在提供者中定义的,而不是在配方中定义的。我一直在覆盖包装器中的模板,如本例所示 这总是如预期的那样有效 我正在尝试更改配置的cookbook是git_用户cookbook 我想改变的是一个提供者 尝试使用与我相同的食谱格式似乎不起作用 include_recipe "git_user::data_bag" def load_current_resou

我想覆盖cookbook包装中的模板,但模板资源是在提供者中定义的,而不是在配方中定义的。我一直在覆盖包装器中的模板,如本例所示

这总是如预期的那样有效

我正在尝试更改配置的cookbook是git_用户cookbook

我想改变的是一个提供者

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

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  

我认为这不是你期望的答案,也可能不准确,但时间太长,无法作为评论:

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

本文将用两个表来解释这一点(编译然后收敛阶段)

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

关于
use\u inline\u resource
:它使来自lwrp内部资源的通知由lwrp资源本身触发,我看到lwrp资源充当提供程序中定义的通知的代理。这允许lwrp中的资源通知“配方”资源


无论是否使用
use\u inline\u resources
机制都是一样的,内部资源都是在lwrp聚合时创建和聚合的。

好的,正确的做法是在PR中,允许您将lwrp中覆盖的烹饪书和源指定为属性。其他任何东西都将是一个重大的黑客。然而,我相信这会起作用(它真的很难看,所以请在你获得公关批准之前使用它)

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


考虑到您似乎通过另一本烹饪书中的
数据包
配方包含LWRP,因此不确定这是否对您有效。您可能还需要在本地重新实现该菜谱,以便获得lwrp资源。

我不确定,但是否(在提供程序中定义)允许您这样做?是的,它不会引发任何错误,只是继续使用主菜谱中的默认模板。
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  
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