2016-05-26 17 views
1

Ich versuche, eine Puppet-ERB-Vorlage für eine Datei mit einigen Standardinhalt und einem optionalen Schwanz zu erstellen. Der optionale Teil wird durch den Hostnamen/FQDN des Ppuppet-Clients bestimmt und muss nicht existieren. Derzeit habe ich das:Wie kann ich optional eine Datei in eine Puppet ERB-Vorlage einfügen?

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

mod ist der Modulname. Ich musste eine leere mod/files/empty erstellen, so dass scope.function_file nicht fehlschlägt, wenn es keine Datei für den Hostnamen oder FQDN findet. Ich denke, das ist hässlich.

Ich habe versucht, Variationen:

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

Mit einem platzierten Dateien im Verzeichnis mod/templates statt mod/files, aber ich habe in der Regel eine Fehlermeldung über fehlende Dateien. Die Verwendung von scope.function_template mit den Dateien in mod/templates hat auch das gleiche Problem wie scope.function_file - die Aktion schlägt fehl, wenn Dateien fehlen.

Wie kann ich das tun, ohne Platzhalterdateien erstellen zu müssen (wie empty hier)?

+1

@MattSchuchard bitte unterlassen, Unsinn zu posten. Ihre Antwort lieferte keine praktikablen Methoden. Puppet-Lösungen sind willkommen, sofern Sie eine haben. Du hast gesagt: "Das ist der falsche Weg", ohne zu erklären, warum es der falsche Weg ist. – muru

Antwort

1

Anstatt scope.function_file in der erb Vorlage selbst zu verwenden, sollten Sie es in Ihrem Manifest verwenden. Die folgenden sollten ausreichen und sollten Sie davon abhalten, die Datei "empty" zu erstellen.

$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 
} 

Dann in Ihrem template können Sie einfach <%= @real_content %>

verwenden Wenn das der einzige Inhalt der Datei ist, dann können Sie ganz mit einer Vorlage überspringen und einfach die Datei-Ressource wie folgt verwenden:

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

Wenn Sie /dev/null verwenden, erhalten Sie einen leeren Inhalt, wenn mod/${::hostname} oder mod/${::fqdn} nicht vorhanden sind. Oder Sie können bei Ihrer Route bleiben und einfach /dev/null zu Ihren scope.function_file Anrufen hinzufügen.

+0

Also hätte die endgültige 'file' Deklaration' content => file ('default') + $ tail'? – muru

+0

@muru: Ich habe meine Antwort oben mit dem Fall für den Standardinhalt aktualisiert, sowie eine mögliche Lösung, die überhaupt keine erb-Vorlage verwendet. – ptierno

+0

Danke, aber in meinem Fall wäre der Test 'if $ tail! =" "', Der Standardinhalt ist immer vorhanden. Ich würde den Scheck wahrscheinlich ganz überspringen. – muru