【问题标题】:Chef: is it possible to define a Chef resource which uses a template, and call it from another cookbook?Chef:是否可以定义一个使用模板的 Chef 资源,并从另一个食谱中调用它?
【发布时间】:2020-09-11 03:56:37
【问题描述】:

我有一个在 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 存储库 (Nexus) 下载工件。

【问题讨论】:

  • 我应该补充一下 - cookbook_file 也不能在资源中使用,如果您依赖并从另一个食谱调用该资源。

标签: chef-infra


【解决方案1】:

您可以通过模板资源的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
end

cookbooks/mytemplate/templates/foo.erb:

THIS IS THE DEFAULT TEMPLATE

cookbooks/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"
end

cookbooks/test/templates/bar.erb:

THIS IS THE OVERRIDDEN TEMPLATE

cookbook_file 资源有一个 cookbook 属性,应该可以同样工作。

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

【讨论】:

  • 你是英雄。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多