【问题标题】:How do you concatenate strings in a Puppet .pp file?如何在 Puppet .pp 文件中连接字符串?
【发布时间】:2013-01-30 20:54:09
【问题描述】:

这是我幼稚的做法:

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

这不起作用。 如何在 Puppet 中连接字符串?

【问题讨论】:

  • 我没有问完全正确的问题。我应该问的是,Puppet DSL 中是否有字符串连接运算符?看来目前没有这样的东西:projects.puppetlabs.com/issues/15330

标签: string-concatenation puppet


【解决方案1】:

关键字变量插值:

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

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

请注意,虽然它可能在没有花括号的情况下工作,但您应该始终使用它们。

【讨论】:

  • 也不是说这只会在变量赋值中起作用,如上所示。如果你想在=>之后的puppet规则中使用它,首先将它分配给一个变量,然后使用=>之后的变量。
  • => 之后应该可以正常工作,Tully。您使用的是哪个版本的 Puppet?
  • 这是串联的替代方法,但不是对所提出问题的答案。如果满足了 OP 的需求,那将很有用,但在很多情况下,这不会起作用,至少在没有中间步骤的情况下是这样。例如。如果您试图避免在 puppet 代码中分配一千个字符的长字符串,而将整个内容放在一行上,或者您要连接的内容之一是函数调用的输出。
【解决方案2】:

我使用将值放入数组然后“加入”它们的构造。 在这个例子中,我的输入是一个数组,在它们与 ':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】:

其他答案中未提及的另一个选项是使用Puppet's sprintf() 函数,其功能与它后面的Ruby function 相同。一个例子:

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

已验证可与 puppet 完美搭配。正如 chutz 所述,这种方法还可以帮助您连接函数的输出。

【讨论】:

  • 这种方式可以连接函数的输出 - 其他答案并不容易。例如。 $x = sprintf('%s/%s', dirname($file), $anotherfile)
【解决方案4】:

以下内容对我有用。

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":

【讨论】:

  • 不幸的是,当其中一个术语是表达式时,这不起作用。 例如$foo = regsubst($bar, '/', '-', 'G') + $version
  • 你可以先把表达式的输出放到另一个中间变量中。即$temp=regsubst($bar, '/', '-', 'G') 然后$foo = "${temp}${version}"
【解决方案5】:

您可以使用 puppetlabs-stdlib 中的 join() 函数。我在想那里应该有一个字符串 concat 函数,但我没有看到它。写一个很容易。

【讨论】:

    【解决方案6】:

    docs 中所述,您可以只使用 ${varname} 插值。这也适用于函数调用:

    $mesosZK = "zk://${join($zookeeperservers,':2181,')}:2181/mesos"
    $x = "${dirname($file)}/anotherfile"
    

    但不能将 {} 与函数参数一起使用:得到 Syntax error at '}'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多