2016-09-06 10 views
1

私はハッシュで繰り返したいルビーテンプレート(.erb)を持っています。パペットエージェントが実行されるたびに同じ出力ファイルが生成されるはずです。ruby​​テンプレートで定義された順序でループオーバーハッシュ

私が現在持っているものは次のとおりです。これは私のテンプレート(rsyslogの設定の一部、誰もが疑問に思っている場合)である:

<% log_files.each do |log_file, tag| -%> 
# <%= log_file %> 
$InputFileName <%= log_file %> 
$InputFileTag <%= tag %>: 

このテンプレートは、このようになりますハッシュでレンダリングされます。

log_files => { 
    '/root/apache_auth.local' => 'httpd', 
    '/root/install.log' => 'hugo', 
}, 

(未本当のログファイル)。これは動作し、私が望む設定ファイルを生成します。これは、Puppetエージェントを呼び出すたびに、ハッシュのログファイルの順序が変更されるため、設定ファイルが書き換えられ、その後デーモンが再起動されるという問題があります。機能は同じままですが、私は人形エージェントが実行されるたびに設定ファイルを書き直してrsyslogを再起動させたくありません。

ここでは、定義された順序がないという性質上、これはハッシュでは解決できないと仮定しています。私が欲しいものを達成するために他にどんな選択肢が必要ですか?

+0

人形テンプレート(.erb)です。 – Isaac

答えて

2

ERBテンプレート内のスクリプトレットはRubyコードで構成されているため、これは基本的にRubyの質問です。したがって、可能な回答はPuppetカタログコンパイラの下で実行されているRubyのバージョンによって異なります。しかし、新しいRubyでより良い代替案があるかもしれないが、あなたのコードでこの変化は人形2.7以降人形でサポートされている任意のRubyで動作します:

<% @log_files.sort.each do |log_file, tag| -%> 
# <%= log_file %> 
$InputFileName <%= log_file %> 
$InputFileTag <%= tag %>: 
<% end -%> 

ここで鍵(しゃれが意図していない)sortです。

+0

ちょうど興味深い:これはルビーのハッシュを注文するための標準アルゴリズムですか? –

+2

@MattSchuchard、Ruby 1.9+には順序保存のハッシュがあるので、挿入の順序が一致すれば必ずしも他のものは必要ありません。一方、 'Hash.sort'は長年の標準的なメソッドです。私が提示したのは、ソートされた順序でハッシュを反復処理するかなり慣用的な方法です。しかし、 'Hash.sort'はハッシュではなく2要素配列の配列を返します。 –

+0

情報ありがとうございます。私はもうインタビュー中に「Python辞書とルビー・ハッシュ」の違いを使うことはできないと思う。 –

関連する問題