尽管输入变量在 Puppet 中是单引号,但还是将 \n 转换为新行

尽管输入变量在 Puppet 中是单引号,但还是将 \n 转换为新行

如果变量被双引号引起来,并且它包含一个\n

$test="hello\nworld"

file { '/tmp/hello':
        content => $test
}

然后会创建一个新行:

/tmp/hello
hello
world

问题

如果由于 hiera 输入或 regsubst 结果导致输入没有双引号该怎么办:

$test2=hiera("hiera::input")

file { '/tmp/hello':
        content => $test2
}

结果是:

hello\nworld

尝试解决问题

假设对内容变量使用双引号可以解决这个问题。但都不是:

file { '/tmp/hello':
        content => "$test2"
}

也不:

file { '/tmp/hello':
        content => "\"$test2\""
}

解决了这个问题。后者导致:

"hello\nworld"

第二次尝试

阅读后又尝试了一次StackOverflow 上的这个答案

hiera.yaml

---
bla: haha\nblabla

清单文件

$test=hiera('bla')

$quoted = regsubst($test, '(.*)', '"\1"')

file { '/tmp/hello':
        content => $quoted
}

结果是:

"haha\nblabla"

答案1

我们正在使用 Hiera 的 YAML 后端,但我确信 JSON 和其他后端也可以实现同样的功能。

您只需在 YAML 中按照您想要的方式格式化字符串,Puppet 就会很乐意接受它。

例如:

---
hiera::input: |
  my string
  with newlines
  preserved

注意键名|后面的hiera::input。它告诉 YAML 解析器将后面的值视为一个块,并保留换行符和任何其他缩进。

参考章节2.38.1.2请参阅 YAML 规范以获取详细信息。

相关内容