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