Chef:是否可以定义一个使用模板的Chef资源,并从另一本食谱中调用它



我有一个使用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总和并使用NexusHTTPneneneba API与当前下载进行比较后,通过网络从maven repo(Nexus(下载工件。

您可以通过模板资源的cookbook属性来控制模板的烹饪书。对于自定义资源,cookbook属性默认为使用资源的调用cookbook,而不是声明资源的位置。你可以很容易地覆盖它,因为你知道你正在写的食谱的名字。所以我们可以这样做:

食谱/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
end

cookbooks/mytemplate/templates/foo.erb:

THIS IS THE DEFAULT TEMPLATE

烹饪书/测试/元数据.rb:

name "test"
version "0.0.1"
depends "mytemplate"

食谱/测试/食谱/默认。rb:

foo "whatever"

呼叫者然后可以用他们自己的模板名称和位置来覆盖这一点;依赖性注入";将模板放入资源:

食谱/测试/食谱/默认。rb:

foo "whatever" do
template_cookbook cookbook_name
template_source "bar.erb"
end

食谱/测试/模板/bar.erb:

THIS IS THE OVERRIDDEN TEMPLATE

cookbook_file资源有一个cookbook属性,其工作方式应该相同。

你可以用这种模式";在野外";在副厨师tomcat食谱中,属性在这里定义,然后在模板资源中使用,它在这里和这里呈现

最新更新