Chef:是否可以定义使用模板的 Chef 资源,并从另一本说明书中调用它?

sec*_*uce 2 chef-infra

我有一个使用 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:
[...]
Run Code Online (Sandbox Code Playgroud)

该模板基本上是一个 bash 脚本,在检查 MD5 和并与使用 Nexus HTTP API 的当前下载进行比较后,稍后运行该脚本以通过网络从 Maven 存储库 (Nexus) 下载工件。

lam*_*ont 5

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
Run Code Online (Sandbox Code Playgroud)

食谱/mytemplate/templates/foo.erb:

THIS IS THE DEFAULT TEMPLATE
Run Code Online (Sandbox Code Playgroud)

食谱/测试/metadata.rb:

THIS IS THE DEFAULT TEMPLATE
Run Code Online (Sandbox Code Playgroud)

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

name "test"
version "0.0.1"

depends "mytemplate"
Run Code Online (Sandbox Code Playgroud)

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

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

foo "whatever"
Run Code Online (Sandbox Code Playgroud)

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

THIS IS THE OVERRIDDEN TEMPLATE
Run Code Online (Sandbox Code Playgroud)

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

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