2013-02-14 51 views
39

這裏是我的幼稚的做法:如何連接Puppet .pp文件中的字符串?

# puppet/init.pp 
$x = 'hello ' + 
    'goodbye' 

這是行不通的。 如何在Puppet中連接字符串?

+2

我沒有問完全正確的問題。我應該問的是,Puppet DSL中是否有一個字符串連接運算符?它似乎目前沒有這樣的東西:http://projects.puppetlabs.com/issues/15330 – rlandster 2013-02-17 16:46:25

回答

60

關鍵字變量代換:

$value = "${one}${two}" 

來源:http://docs.puppetlabs.com/puppet/4.3/reference/lang_variables.html#interpolation

注意的是,雖然它可能沒有大括號的工作,你應該總是使用它們。

+0

也不是這樣只會在變量賦值如上所示。如果你想在'=>'之後的puppet規則中使用它,首先將它分配給一個變量,然後在'=>'之後使用該變量。 – Tully 2014-12-01 23:01:52

+0

應該在'=>'之後正常工作,Tully。你使用的是哪個版本的Puppet? – Nick 2015-03-02 14:40:10

+0

這是拼接的替代方法,但不是對所提問題的回答。如果OP的需求得到滿足,那就很有用,但有很多情況下這是不行的,至少沒有中間步驟。例如。如果您試圖避免在一行中將整個事件分配爲傀儡代碼中的千字符長字符串,或者您要連接的其中一項是函數調用的輸出。 – mc0e 2016-12-01 09:05:41

1

以下爲我工作。

puppet apply -e ' $y = "Hello" $z = "world" $x = "$y $z" notify { "$x": } ' 
notice: Hello world 
notice: /Stage[main]//Notify[Hello world]/message: defined 'message' as 'Hello world' 
notice: Finished catalog run in 0.04 seconds 

下面的作品,以及:

$abc = "def" 

file { "/tmp/$abc": 
+3

不幸的是,當其中一個術語是表達式時,這不起作用。 *例如, '$ foo = regsubst($ bar,'/',' - ','G')+ $ version' – RoUS 2013-03-27 14:57:10

+0

您可以先將表達式的輸出放入另一箇中間變量中。即'$ temp = regsubst($ bar,'/',' - ','G')'然後是'$ foo =「$ {temp} $ {version}」' – mc0e 2015-03-27 04:35:18

18

我使用的構造,我把值放入一個數組然後'加入'他們。 在這個例子中,我的輸入是一個數組,並且在用':2181'連接之後,結果值再次被放入一個數組中,該數組與一個空字符串作爲分隔符連接。

$zookeeperservers = [ 'node1.example.com', 'node2.example.com', 'node3.example.com' ] 
$mesosZK = join([ "zk://" , join($zookeeperservers,':2181,') ,":2181/mesos" ],'') 

導致的$ mesosZK

zk://node1.example.com:2181,node2.example.com:2181,node3.example.com:2181/mesos 
+3

這使用puppetlabs-stdlib模塊的[join](https:// github。com/puppetlabs/puppetlabs-stdlib#join)函數,對於那些想知道的。 – MrAlias 2015-06-16 22:09:55

10

另一個選擇在其他的答案沒有提及值使用Puppet's sprintf()功能,它的功能與它背後的Ruby function。舉例:

$x = sprintf('hello user %s', 'CoolUser') 

已驗證可以與木偶完美配合。正如chutz所述,這種方法也可以幫助您連接函數的輸出。

+1

這樣就可以連接函數的輸出 - 對於其他答案來說並不那麼容易。例如。 '$ x = sprintf('%s /%s',dirname($ file),$ anotherfile)'' – chutz 2015-11-27 02:23:52

0

您可以使用puppetlabs-stdlib中的join()函數。我在想那裏應該有一個字符串concat函數,但我沒有看到它。寫一個會很容易。