3

fileC他の 2 つのファイルfileAfileB. 私の現在のセットアップでは、3 つのファイルすべてがクックブックにあり、クックブック ファイル リソースとして宣言されています。

しかし、それは冗長に感じます。より大きなファイルを他の 2 つの関数として宣言したいと思います。

が最初に必要になったときfileC、ファイル リソースの内容をIO.read(file1) + IO.read(file2). しかし、fileAfileBはコンパイル時に存在しないため、レシピが新しいノードにデプロイされるとすぐに失敗します。

クックブックをデプロイできる場所に関する基礎となる 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 の取り決めをサポートしないサービスのために一緒にマッシュする必要がある 2 つの構成フラグメントです。

于 2012-07-12T22:43:05.543 に答える