首页 > 解决方案 > Chef:是否可以定义一个使用模板的 Chef 资源,并从另一个食谱中调用它?

问题描述

我有一个在 Chef 中使用模板的资源,它运行良好。食谱中的其他资源和食谱可以调用此资源。在我的例子中,我定义了一个 Maven 工件资源,在给定一些 Maven 参数(存储库名称、工件 ID 等)的情况下,您可以从 Nexus Maven 存储库下载文件。

但是,当我从定义它的任何其他食谱中调用资源时(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) 下载工件。

标签: chef-infra

解决方案


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

食谱/mytemplate/templates/foo.erb:

THIS IS THE DEFAULT TEMPLATE

食谱/测试/元数据.rb:

name "test"
version "0.0.1"

depends "mytemplate"

食谱/测试/食谱/default.rb:

foo "whatever"

然后调用者可以用他们自己的模板名称和位置覆盖它,并将模板“依赖注入”到资源中:

食谱/测试/食谱/default.rb:

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

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

THIS IS THE OVERRIDDEN TEMPLATE

cookbook_file资源具有cookbook应该以相同方式工作的属性。

您可以在 sous-chef tomcat 食谱中“在野外”使用这种模式,其中在此处定义属性,然后在此处此处呈现的模板资源中使用


推荐阅读