2016-05-26 47 views
1

我正在嘗試爲文件創建一個Puppet ERB模板,其中包含一些默認內容和一個可選尾部。可選部分由Ppuppet客戶端的主機名/ FQDN確定,不需要存在。目前,我有這個:如何在Puppet ERB模板中有選擇地包含文件?

<%= scope.function_file(['mod/default']) %> 
<%= scope.function_file(["mod/" + @hostname, "mod/" + @fqdn, 'mod/empty']) %> 

mod是模塊名稱。我必須創建一個空的mod/files/empty,以便scope.function_file不會因爲主機名或FQDN找到文件而失敗。我覺得這很醜陋。

我已經試過的變化:

<%= File.read('default') %> 
<% if File.file?(@hostname) %> 
<%= File.read(@hostname) %> 
<$ elsif File.file?(@fqdn) %> 
<%= File.read(@fqdn) %> 
<& end %> 

隨着放置在mod/templates目錄而不是mod/files文件,但我通常得到一個錯誤丟失的文件。使用scope.function_templatemod/templates中的文件也有與scope.function_file相同的問題 - 如果文件丟失,操作將失敗。

我該怎麼做,而不必創建佔位符文件(如empty這裏)?

+1

@MattSchuchard請不要張貼廢話。你的回答根本沒有提供任何可行的方法。木偶解決方案是受歡迎的,只要你真的有一個。你說「這是錯誤的道路」,而沒有真正解釋爲什麼它是錯誤的道路。 – muru

回答

1

而不是在erb模板本身中使用scope.function_file,您應該考慮在清單中使用它。下面的內容應該足夠了,並且應該會阻止您創建「empty」文件。

$default_content = file('mod/default') 
$tail = file(
    "mod/${::hostname}", 
    "mod/${::fqdn}", 
    "/dev/null" 
) 

if $tail != "" { 
    $real_content = "${default_content}\n${tail}" 
} else { 
    $real_content = $default_content 
} 

然後在你的template你可以用<%= @real_content %>

如果是文件的唯一內容,那麼你可以跳過完全使用模板,只是使用文件資源,如下所示:

file { '/path/to/file': 
    ensure => file, 
    content => $real_content 
} 

通過使用/dev/null如果mod/${::hostname}mod/${::fqdn}不存在,您將收到空的內容。或者您可以堅持您的路線,只需將/dev/null添加到您的scope.function_file呼叫。

+0

因此,最終的'file'聲明將具有'content => file('default')+ $ tail'? – muru

+0

@muru:我更新了我的答案,上面列出了默認內容的情況,以及根本不使用erb模板的可能解決方案。 – ptierno

+0

謝謝,雖然在我的情況下,測試將'如果$尾!=「」,默認內容總是存在。我可能會完全跳過檢查。 – muru

相關問題