Chef infra 如何声明内容依赖于cookbook文件的Chef文件资源?

Chef infra 如何声明内容依赖于cookbook文件的Chef文件资源?,chef-infra,Chef Infra,我需要部署一个文件fileC,它是另外两个文件fileA和fileB的串联。在我当前的设置中,所有三个文件都在cookbook中,声明为cookbook文件资源 但这感觉是多余的。我想声明较大的文件是其他两个文件的函数 当第一次需要fileC时,我幸运地将文件资源的内容声明为IO.read(file1)+IO.read(file2),使它“几乎可以工作”。但是,只要将配方部署到新节点,该操作就会失败,因为编译时不存在fileA和fileB 我试图访问底层Ruby对象关于cookbook可以部署在

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

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

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

我试图访问底层Ruby对象关于cookbook可以部署在哪里的信息。但是我看得越多,我就越不相信我的厨师/红宝石知识水平可以做到这一点。资源↔供应商差距似乎太大

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


关于如何解决冗余问题有什么想法吗?

这是我的解决方案。不幸的是,它确实涉及一个“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安排的服务,需要将两个配置片段混合在一起。

如果使用模板,我认为您可以不受影响。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) %>    
<% } %>


(发布在SO而不是SF上,因为它更像是编程而不是实际的管理员)感谢您的回答。恐怕这不是我真正想要的,但我只是责备自己没有恰当地传达这一点。与您的建议相比:我不需要对文件的数量或名称进行抽象;我真的希望有一天甚至不部署部分文件。对于问题:我不确定您为什么需要通知框架,而不只是在cookbook_文件之后声明execute。资源顺序不是从菜谱中保留的吗?我的直觉是,我希望在编译时访问
cookbook\u文件
内容,这样我就可以从中声明
文件
内容。如果做不到这一点,我想我可以使用converge time访问cookbook_文件的本地位置,并使用
execute
ruby_块生成它。我不喜欢cat和samele,因为它们是从部署的文件进行操作的,我不想依赖它们。请不要在任何回答中考虑这一评论,我真正感兴趣的是更好地理解Chef资源管理。我的用例是SSL证书配置:Apache希望实际证书和中间证书在单独的文件中;而nginx希望将它们连接到单个文件中。需要通知,以便在foo或bar发生更改时,重新运行cat命令。如果只有两个cookbook_文件后跟一个cat,那么它只能运行一次。出于好奇,为什么要立即使用
:呢?这不会触发运行操作的次数与更改的文件数相等吗?使用延迟调用将其排队并只运行一次不是更可取吗?看起来很有希望。我会尝试一下。我相信只有当文件被复制到节点时,这才有效。也就是说,如果它们尚未被复制,您可以始终将它们复制到缓存路径。@KevinCox您是对的。如果可以将文件作为静态模板放置,则可以使用分区和渲染。