在嵌套字符串引号内插入和连接Puppet变量

时间:2017-01-11 14:24:34

标签: 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", "_")"

3 个答案:

答案 0 :(得分:0)

在我看来,hostname是一个变量,所以你不需要双引号,因为你想得到变量的值。

尝试

$hostlocal = $hostname

答案 1 :(得分: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}_\")"
}

答案 2 :(得分:0)

因为hostname是一个facter变量。 它必须被引用为$ hostlocal = $ :: hostname

由于 vinodh