3

我需要一个fileC部署的文件,它是其他两个文件fileAfileB. 在我当前的设置中,所有三个文件都在说明书中,声明为说明书文件资源。

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

fileC第一次需要时,我通过将文件资源的内容声明为IO.read(file1) + IO.read(file2). 但是,一旦将配方部署到新节点,这就会失败,因为fileA并且fileB在编译时不存在。

我试图访问底层 Ruby 对象的信息,了解可以在何处部署说明书。但是我看的越多,我就越不相信我的 Chef/Ruby 知识水平是可能的。资源↔提供者的差距似乎太大了。

我想避免使用这种cat fileA fileB >fileC解决方案,原因如下:将来,我可能需要区分需要 C 的节点和需要 A/B 的节点。

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

4

2 回答 2

5

如果您使用模板,我认为您可以摆脱它。例如

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) %>    
<% } %>
于 2012-10-25T20:09:18.713 回答
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 安排的服务,需要将两个配置片段混合在一起。

于 2012-07-12T22:43:05.543 回答