我正在为服务创建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 :(得分: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_hiding
和th_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