如何声明内容依赖于烹饪书文件的Chef文件资源



我需要一个部署的文件fileC,它是另外两个文件fileAfileB的级联。在我当前的设置中,这三个文件都在烹饪书中,声明为烹饪书文件资源。

但这感觉是多余的。我想声明较大的文件是另外两个文件的函数。

当第一次需要fileC时,我通过将文件资源的内容声明为IO.read(file1) + IO.read(file2),幸运地使它"几乎可以工作"。但一旦将配方部署到新节点,就会失败,因为fileAfileB在编译时不存在。

我试图访问底层Ruby对象的信息,了解食谱可以部署在哪里。但我看得越多,就越不相信以我的厨师/Ruby知识水平这是可能的。资源↔供应商的差距似乎太大了。

我希望避免cat fileA fileB >fileC类型的解决方案,原因如下:将来,我可能需要将需要C的节点与需要A/B的节点区分开来。

关于如何解决裁员问题,有什么想法吗?

如果你使用了一个模板,我认为你可以逃脱惩罚。例如

template "/var/tmp/fileC.txt" do
   source "fileC.erb"
   variables(:included_files => ["/var/tmp/file1.txt", "/var/tmp/file2.txt"])
end

然后在你的模板中

<% @included_files.each { |file|  %>
<%= File.read(file) %>    
<% } %>

这是我的解决方案。不幸的是,它确实涉及一个"cat"命令,但文件列表被抽象成一个列表,可以使用属性设置或修改:

files = ["foo", "bar"]    # Or retrieve from an attribute
execute "cat files" do
  command "cat #{files.map {|f| "/var/tmp/#{f} "}} > /var/tmp/foobar"
  action :nothing
end
files.each do |f|
  cookbook_file "/var/tmp/#{f}" do
    source f
    notifies :run, "execute[cat files]", :immediately
  end
end

我很好奇这里的用例是什么。我的猜测是,对于不支持conf.d安排的服务,需要将两个配置片段拼凑在一起。

相关内容

最新更新