2013-02-14 13 views
39

Ecco il mio approccio ingenuo:Come si concatenano le stringhe in un file .pp di Puppet?

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

Questo non funziona. Come fa una stringa concatena in Puppet?

+2

Non ho fatto esattamente la domanda giusta. Quello che avrei dovuto chiedere è che c'è un operatore di concatenazione di stringhe nella Puppet DSL? Sembra che al momento non ci sia nulla di simile: http://projects.puppetlabs.com/issues/15330 – rlandster

risposta

60

chiave di interpolazione variabile:

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

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

Nota che, anche se potrebbe funzionare senza le parentesi graffe, è dovrebbe sempre usarli

+0

Inoltre, non funzionerà solo in un assegnazione variabile come dimostrato sopra. Se vuoi usarlo in una regola fantoccio dopo '=>' prima assegnalo a una variabile, quindi usa la variabile dopo '=>'. – Tully

+0

Dovrebbe funzionare bene dopo un '=>', Tully. Quale versione di Puppet stai usando? – Nick

+0

Questa è un'alternativa alla concatenazione, ma non una risposta alla domanda come posta. Se il bisogno dell'OP è soddisfatto, è utile, ma ci sono molti casi in cui questo non funzionerà, almeno senza passaggi intermedi. Per esempio. se si sta tentando di evitare di assegnare una stringa lunga di un migliaio di caratteri nel codice puppet con il tutto su una riga, o se una delle cose che si concatenano è l'uscita di una chiamata di funzione. – mc0e

1

Quanto segue ha funzionato per me.

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 

Le seguenti opere così:

$abc = "def" 

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

Sfortunatamente, questo non funziona quando uno dei termini è un'espressione. * Es. *, '$ foo = regsubst ($ bar, '/', '-', 'G') + $ version' – RoUS

+0

È possibile inserire prima l'espressione dell'espressione in un'altra variabile intermedia. cioè '$ temp = regsubst ($ bar, '/', '-', 'G')' e quindi '$ foo =" $ {temp} $ {versione} "' – mc0e

18

Uso il costrutto in cui inserisco i valori in un array e li "unisco". In questo esempio il mio input è un array e dopo che quelli sono stati uniti con ': 2181', il valore risultante viene di nuovo messo in una matrice che viene unita con una stringa vuota come separatore.

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

conseguente valore di $ mesosZK

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

Utilizza il modulo [join] di puppetlabs-stdlib (https: // github.com/puppetlabs/puppetlabs-stdlib # join) funzione, per chi si chiede. – MrAlias

10

Un'altra opzione non menzionato in altre risposte sta usando Puppet's sprintf() funzione, che funziona in modo identico alla Ruby function dietro di esso. Un esempio:

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

Verificato per funzionare perfettamente con fantoccio. Come menzionato da chutz, questo approccio può anche aiutarti a concatenare l'output delle funzioni.

+1

In questo modo è possibile concatenare l'output di funzioni - qualcosa di non facile con altre risposte. Per esempio. '$ x = sprintf ('% s /% s', dirname ($ file), $ anotherfile)' – chutz

0

È possibile utilizzare la funzione join() di puppetlabs-stdlib. Stavo pensando che lì dovrebbe esserci una funzione di concat di stringhe, ma non la vedo. Sarebbe facile scriverne uno.

Problemi correlati