2016-09-06 44 views
1

我有一個紅寶石模板(.erb),我想在一個散列上迭代。每次puppet代理運行時,它應該產生相同的輸出文件。以紅寶石模板中定義的順序循環散列

我現在擁有的是以下內容。這是我的模板(如果你想知道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代理時,哈希中日誌文件的順序都會改變,因此配置文件會被重寫,隨後守護進程會重新啓動。功能保持不變,但我寧願沒有重寫配置文件,每次puppet代理運行時都會重新啓動rsyslog。

現在我假設這是用哈希無法解決的,因爲它們的本質是它們沒有明確的順序。我還有什麼其他選擇可以實現我想要的?

+0

這是一個傀儡模板(.erb)。 – Isaac

回答

2

由於ERB模板中的scriptlet由Ruby代碼組成,因此這本質上是一個Ruby問題。因此可能的答案取決於哪個版本的Ruby在您的Puppet目錄編譯器下運行。然而,雖然有可能在新的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 dictionary和ruby hash'之間的區別。 –