2017-01-11 2 views
2

Ich erstelle eine Puppet-Konfigurationsdatei für einen Service. Ich möchte den Hostnamen als Variable in der Zeile hinzufügen. Es wurde jedoch aufgrund verschachtelter Anführungszeichen (") in der Zeile ein Fehler angezeigt.Interpolieren und Verketten von Puppet-Variablen in verschachtelten String-Anführungszeichen

$hostlocal = "${hostname}" 

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam("topology_hiding", "th_callid_prefix", "$hostlocal_")" 
} 

Wenn ich $hostlocal nur drucken, zeigt es die richtig Hostnamen. Gibt es eine Möglichkeit, eine Puppet-Variable in verschachtelten String-Anführungszeichen (") zu verwenden?

Ich habe auch versucht, Vorlage zu verwenden. In der Vorlage

modparam("topology_hiding", "th_callid_prefix", "<$= @hostlocal %>_")" 

Aber das Ergebnis war kein Wert.

Antwort

0

Das hier grundlegende Problem ist, dass Sie geschachtelten String Anführungszeichen entkommen müssen, wenn Sie String Interpolation tun/Flucht Stil Anführungszeichen ("). Außerdem versuchen Sie, _ auf $hostlocal zu verketten, aber Puppet interpretiert das als eine Variable $hostlocal_, so dass Sie geschweifte Klammern benötigen, um Verkettung einzurichten. Sie können Ihr Problem mit beheben:

$hostlocal = "${hostname}" 

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam(\"topology_hiding\", \"th_callid_prefix\", \"${hostlocal}_\")" 
} 

Allerdings können wir dies weiter verbessern. Die ersten paar Dinge, die wir hier tun können, entfernen die Anführungszeichen um ${hostname}, da es nicht interpoliert wird. Das Gleiche gilt für topology_hiding und th_callid_prefix, außer dass wir sie in einzelne literale String-Anführungszeichen ändern müssen, da nichts interpoliert oder escaped wird. Wenn Sie Fact-2-Lookups auf Fakten anwenden, ist es besser, die Fact als globale Variable mit $:: einzurichten.

$hostlocal = $::hostname 

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam('topology_hiding', 'th_callid_prefix', \"${hostlocal}_\")" 
} 

Schließlich ist zu beachten, dass die Verwendung des $hostlocal Variable ist mit der Tatsache redundant, so dass es sicher für Klarheit und Effizienz entfernt werden. Dies ergibt die optimale Lösung unten.

file {'puppet_facts_example': 
    ensure => file, 
    path => '/tmp/test.txt', 
    content => "modparam('topology_hiding', 'th_callid_prefix', \"${::hostname}_\")" 
} 
+0

Funktioniert großartig! Danke für deine zusätzlichen Vorschläge. – Mike

0

Meiner Meinung nach Hostname ist eine Variable, so dass Sie nicht doppelte Anführungszeichen benötigen, weil Sie Wert der Variablen erhalten möchten. Versuchen

$hostlocal = $hostname 
+0

Es funktioniert ok mit oder ohne Anführungszeichen. Das Problem ist der Inhaltsteil, der mehrere doppelte Anführungszeichen enthält. Wenn ich nur $ hostlocal ausspreche, wird der korrekte Hostname angezeigt. – Mike

0

da hostname eine faster variable ist. muss es als $ hostlocal = $ referenziert werden :: Hostname

Dank Vinodh