2017-01-11 18 views
2

我正在爲服務創建Puppet配置文件。 我想添加主機名作爲行中的變量。但是,由於該行中的嵌套引號("),所以出現錯誤。在嵌套字符串引號內插入和連接Puppet變量

$hostlocal = "${hostname}" 

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

如果我只是打印$hostlocal,它正確地顯示了主機名。 有什麼辦法在嵌套字符串引號(")內使用Puppet變量?

我也試過使用模板。 在模板中,

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

但結果是沒有價值。

modparam("topology_hiding", "th_callid_prefix", "_")" 

回答

0

這裏的基本問題是,你需要逃跑嵌套字符串引號當你正在做串插/逃避風格引號(")。此外,您試圖將_連接到$hostlocal,但Puppet正在將其解釋爲變量$hostlocal_,因此您需要花括號來建立連接。你可以解決你的問題:

$hostlocal = "${hostname}" 

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

但是,我們可以進一步改進。我們可以在這裏做的第一件事是刪除${hostname}附近的引號,因爲它沒有被插入。 topology_hidingth_callid_prefix也是如此,除非我們必須將它們更改爲單個文字字符串引號,因爲沒有任何內容被插入或轉義。此外,如果您正在對事實進行Facter 2樣式查找,那麼將作爲全局變量來確定事實的方式會更好。

$hostlocal = $::hostname 

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

最後,要注意的是,使用$hostlocal變量是多餘的事實,因此它可以對效率和透明性被安全地移除。這產生了下面的最佳解決方案。

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

工程太棒了!感謝您的其他建議。 – Mike

0

在我看來,hostname是一個變量,所以你不需要雙引號,因爲你想獲得變量的值。

嘗試

$hostlocal = $hostname 
+0

它的工作原理確定有或沒有雙引號。問題是包含多個雙引號的內容部分。如果我只打印$ hostlocal,它會顯示正確的主機名。 – Mike

0

因爲hostname是一個因變量。 它必須被引用爲$ hostlocal = $ ::主機名

感謝 vinodh