![使用函数调用和变量作为参数的木偶弦插值](https://linux22.com/image/667786/%E4%BD%BF%E7%94%A8%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%92%8C%E5%8F%98%E9%87%8F%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0%E7%9A%84%E6%9C%A8%E5%81%B6%E5%BC%A6%E6%8F%92%E5%80%BC.png)
尝试构造一个字符串。
我可以:
"Blah blah ${::osfamily} blah blah"
"Blah blah ${$::osfamily} blah blah"
但是,使用变量作为参数来调用函数并进行字符串插值的语法是什么?
以下操作均不起作用:
"Blah blah ${downcase($::osfamily)} blah blah"
"Blah blah ${downcase($osfamily)} blah blah"
"Blah blah ${downcase(::osfamily)} blah blah"
"Blah blah ${$downcase(osfamily)} blah blah"
"Blah blah ${$downcase($osfamily)} blah blah"
等等。
我得到的是:
Error 400 on SERVER: Syntax error at '('; expected ')'
在 Puppet 语言中这可能吗?
答案1
这是不可能的。Puppet 的语言有点怪异,很多你认为可以工作的东西……却不行。你需要将函数的返回值赋给一个变量,然后将该变量插入到字符串中,如下所示:
$downcased_osfamily = downcase($::osfamily)
"Blah blah ${downcased_osfamily} blah blah"
当然,字符串本身没有任何用处,因此大概您将该字符串分配给它自己的变量,或将其用作资源属性的值。
答案2
它不是可能,但现在是。以下使用您的示例有效:
notice("Blah blah ${downcase($::osfamily)} blah blah")
这是在 Puppet 4.10.x 上测试的,它的文档可以追溯到 4.6:https://puppet.com/docs/puppet/4.6/lang_data_string.html#interpolation
答案3
除了 bogit 的答案之外,您还可以使用以下语法
puppet apply -e 'notice("Blah blah ${::osfamily.downcase} blah blah")'
你可能还想使用较新的事实哈希
puppet apply -e 'notice("Blah blah ${facts['os']['family'].downcase} blah blah")'