如何声明其内容取决于cookbook文件的Chef文件资源?

时间:2012-07-11 22:25:29

标签: chef

我需要部署一个文件fileC,它是另外两个文件fileAfileB的串联。在我当前的设置中,所有三个文件都在cookbook中,声明为Cookbook文件资源。

但感觉多余。我想将更大的文件声明为另外两个文件的函数。

首次需要fileC时,我通过将文件资源的内容声明为IO.read(file1) + IO.read(file2)来获得“几乎工作”。但是,只要将配方部署到新节点,就会失败,因为fileAfileB在编译时不存在。

我尝试访问底层Ruby对象的有关可以部署cookbook的信息。但是我看的越多,我就越不相信我的Chef / Ruby知识水平是可能的。资源↔供给者差距似乎太宽了。

我想避免使用cat fileA fileB >fileC类型的解决方案,原因如下:将来,我可能需要从需要A / B的节点中删除需要C的节点。

有关如何解决冗余的任何想法?

2 个答案:

答案 0 :(得分:5)

如果你使用了模板,我认为你可以逃脱它。 e.g。

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) %>    
<% } %>

答案 1 :(得分:1)

这是我的解决方案。不幸的是,它确实涉及一个“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安排的服务。