chef-infra - 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) 下载工件。
解决方案
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 食谱中“在野外”使用这种模式,其中在此处定义属性,然后在此处和此处呈现的模板资源中使用
推荐阅读
- python - 如何更新 AlexNet 以使用 FCN?对上采样感到困惑
- javascript - 为什么结果不是我所期望的?
- css - Material UI Drawer响应高度?
- python - PyTorch softmax 返回
- javascript - 在 REACT/JSX 中处理嵌套数组
- one-time-password - Google Authenticator TOTP 和常规 TOTP 有什么区别
- python - 根据用户输入更改文件名
- mysql - MySQL 插入问题:#1136 - 列计数与第 1 行的值计数不匹配
- vue.js - 输入表单不起作用 - 更新 bootstrap-vue 版本
- python - 使用 Pytest,如何检查 API 端点返回的聚合是否正确?