我有一个资源,它在Chef中使用了一个模板,它工作得很好。食谱中的其他资源和食谱可以调用此资源。在我的例子中,我定义了一个maven工件资源,其中给定了一些maven参数(repo名称、工件ID等),您可以从Nexus maven repo下载一个文件。
但是,当我从定义该资源的食谱之外的任何其他食谱中调用该资源时(当然,使用metadata.rb指定依赖项),我得到一个错误
Chef::Exceptions::FileNotFound
------------------------------
template[/usr/local/nexus-download.bash] (/tmp/kitchen/cache/cookbooks/cookbook-1/resources/nexus_http_artifact.rb line 52) had an error: Chef::Exceptions::FileNotFound: Cookbook 'cookbook-2' (1.0.0) does not contain a file at any of these locations:
[...]该模板基本上是一个bash脚本,在检查了MD5总和并使用Nexus HTTP API与当前下载进行比较后,运行该脚本以通过网络从maven repo (Nexus)下载工件。
发布于 2020-08-25 09:36:36
您可以通过模板资源的cookbook属性控制模板所来自的食谱。对于自定义资源,cookbook属性默认为使用该资源的调用cookbook,而不是声明该资源的位置。您可以很容易地覆盖它,因为您知道您正在编写的食谱的名称。所以我们可以这样做:
cookbooks/mytemplate/resources/foo.rb
provides :foo
property :template_source, String, default: "foo.erb"
property :template_cookbook, String, default: "mytemplate"
action :run do
template "/tmp/foo.xyz" do
source new_resource.template_source
cookbook new_resource.template_cookbook
end
endcookbooks/mytemplate/templates/foo.erb:
THIS IS THE DEFAULT TEMPLATEcookbooks/test/metadata.rb:
name "test"
version "0.0.1"
depends "mytemplate"cookbooks/test/recipes/default.rb:
foo "whatever"然后,调用者可以使用自己的模板名称和位置覆盖它,并将模板“依赖注入”到资源中:
cookbooks/test/recipes/default.rb:
foo "whatever" do
template_cookbook cookbook_name
template_source "bar.erb"
endcookbooks/test/templates/bar.erb:
THIS IS THE OVERRIDDEN TEMPLATEcookbook_file资源有一个应该以相同方式工作的cookbook属性。
您可以在sous-chef tomcat食谱中“在野外”使用这种模式,其中属性被定义为here,随后在模板资源中使用它呈现here和here。
https://stackoverflow.com/questions/63568162
复制相似问题