我想覆盖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
答案 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资源。