【问题标题】:How do I declare a Chef file resource whose contents depend on cookbook files?如何声明内容依赖于说明书文件的 Chef 文件资源?
【发布时间】:2012-10-26 04:09:18
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • (发布在 SO 而不是 SF 上,因为感觉更像是编程而不是实际的管理员)

标签: chef-infra


【解决方案1】:

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

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

【讨论】:

  • 看起来很有希望。我试试看。
  • 我相信这只有在文件被复制到节点时才有效。话虽这么说,如果它们还没有被复制,你总是可以将它们复制到缓存路径..
  • @KevinCox 你是对的。如果您可以将文件作为静态模板放置,则可以使用部分和渲染。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。恐怕这不是我真正的想法,但我只会责怪自己没有正确传达这一点。与您的建议相比:我不需要对文件的数量或名称进行抽象;而且我真的很想有一天甚至不部署部分文件。问题:我不知道为什么你需要通知框架而不是仅仅在cookbook_files 之后声明执行。资源顺序不是保留在配方中吗?
  • 我的直觉是我希望在编译时访问cookbook_file 内容,以便我可以从它们声明file 内容。如果做不到这一点,我想我可以对cookbook_files的本地位置进行收敛时间访问,并使用executeruby_block生成它。我不喜欢 cat 之类的,因为它们从部署的文件中操作,我不想指望它们。
  • 请不要在任何答案中考虑此评论,我真的很想更好地了解 Chef 资源管理。我的用例是 SSL 证书配置:Apache 希望将实际证书和中间证书放在单独的文件中;而 nginx 希望将它们连接在一个文件中。
  • 需要通知以便如果 foo 或 bar 发生变化,则重新运行 cat 命令。如果只有两个 cookbook_files 后跟一只猫,它只会运行一次。
  • 出于好奇,为什么要使用:immediately?这不会触发运行操作的次数与更改的文件数量相同吗?使用延迟调用将其排队并且只运行一次不是更可取吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
相关资源
最近更新 更多