如何使用当前的食谱模板目录与厨师在循环中递归复制所有模板

gan*_*est 5 templates chef

我试图弄清楚如何构建模板(或文件,因为它的工作方式相同)文件夹的路径,然后我可以读取它并在循环中使用模板资源,因此每个模板文件都可以触发更改通知.

我不能使用 remote_directory 因为我只想在模板更改时通知服务。

我也想避免手动模板规范,因为这些目录中可能有很多文件。另外,它允许我们只更改模板文件夹中的配置,而无需更改配方。

主要问题是那些子目录,如 default、host、host-version 和逻辑厨师通过确定正确的模板文件夹。我在想,我可以从我的自定义食谱中调用一个 Chef 类中的一个方法,以到达我的逻辑(循环)的起点。

我认为应该是这样的:

entry_point = CHEF::...getEntryPointDir

entry_point.glob..
.each do

    template fname do
    ...
    end

end
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助!

zts*_*zts 9

警告:此解决方案使用私有接口,该接口可能会在没有警告的情况下更改或删除。Chef 当前 (13.x) 不提供解决此问题的受支持方法 - 考虑使用替代方法来解决您的需求。

既然您已经收到警告,下面是您在食谱中的做法:

# Get the Chef::CookbookVersion for the current cookbook
cb = run_context.cookbook_collection[cookbook_name]

# Loop over the array of files.
# 'templates' will also work.
cb.manifest['files'].each do |cookbookfile|
  Chef::Log("found: " + cookbookfile['name'])
end
Run Code Online (Sandbox Code Playgroud)

我分享了一个示例食谱来在上下文中展示这一点。

在实践中,这需要更复杂 - 例如,您可能只需要说明书中文件/模板的子集,或者需要以某种方式转换路径。考虑编写一个库函数来列出您感兴趣的文件,并从您的配方中调用它。