3

我有一本用于安装基础产品 (Mediaflux) 的食谱,以及第二本针对特定专业用例 (DaRIS) 量身定制的食谱。运行第一本食谱的食谱以进行“基本安装”,而运行第二本食谱的食谱以“定制”安装。

有一次,我有一个由基本食谱/食谱创建的文件,需要在第二个食谱/食谱中添加额外的东西。在这两种情况下,此文件都需要模板扩展。

我正在尝试找出实现这一点的好方法。

  • 最简单的想法是在两个食谱中都有一个模板副本,并让两个食谱扩展它们的版本模板,并依靠第二个食谱覆盖第一个食谱创建的文件。

    • 这不是 DRY,因为我有两个模板副本。

    • 我不确定这是“犹太洁食”……有一个模板扩展破坏另一个。

  • 一种变体是尝试只有一个模板扩展(在基本配方中)并参数化食谱名称......以便将第二个配方添加到运行列表导致第一个配方使用不同版本的模板。

    • 这也不是 DRY。

    • 存在基本配方不知道模板的定制配方扩展参数的问题。(也许模板可以直接从节点属性中获取...)

理想情况下,我希望能够执行以下操作之一:

  • 创建一个在展开时组合两个 (DRY) 模板的模板。

  • 以将第二个(剪裁)模板附加到第一个配方创建的文件的方式展开第二个(定制)模板。

  • 获取“模板”资源,一次操作将两个模板展开为一个文件。

有什么办法可以做这些事情吗?

还有另一种我错过的方法吗?

4

2 回答 2

3

chef文档描述了可选的“cookbook”属性,使您能够指定应从何处检索模板:

template "/path/to/this/file" do
  source "file.erb"
  cookbook "myothercookbook"
  mode 0440
  owner "me"
  group "me"
  variables({
     :var1 => node[:mycurrentcookbook][:var1],
     :var2 => node[:mycurrentcookbook][:var2]
  })
end

这使得通用模板能够被重用。

于 2013-10-23T16:48:21.703 回答
0

为了部分回答我自己的问题,一个模板可以使用 Ruby“渲染”方法合并另一个模板。这记录在这里:http ://docs.opscode.com/resource_template.html#partial-templates

于 2013-10-23T05:24:08.097 回答