Puppet - 为 Hiera 转义 YAML 变量

Puppet - Escaping YAML variables for Hiera

我有一个很简单的要求,但是我已经尝试了所有我能想到的转义序列,但无法获得所需的输出。

我需要随意输出到一个文件中:

%{VAR}

这是我的 YAML 文件:

myclass::outputstuff:
    - Heres a litteral var %{VAR}
    - Heres something else %{SOMETHING}

还有我的template.erb:

<%= @outputstuff.each do | ostuff | -%>
<%= ostuff -%>
<% end -%>

但它是这样的,它输出:

Heres a litteral var
Heres something else

如果我按照其他帖子的建议添加百分号 %%{VAR},它会输出:

Heres a litteral var %
Heres something else %

如果我添加像 %\{VAR} 这样的反斜杠,它会输出:

Heres a litteral var %\{VAR}
Heres something else %\{SOMETHING}

我需要这个哈哈:

Heres a litteral var %{VAR}
Heres something else %{SOMETHING}

从v2.0.0开始,有literal功能,更'proper'的做法是:

%{literal('%')}{VAR}

我设法让这个工作的唯一方法是这种 hacky 方法,发现 here

基本上我将 template.erb 更改为:

    <%- @oupputstuff.each do | ostuff | -%>
    <%- if ostuff -%>
    <%= ostuff.gsub(/___/, '%') %>
    <%- end -%>
    <%- end -%>

然后在 YAML 文件中:

myclass::outputstuff:
    - Heres a litteral var ___{VAR}
    - Heres something else ___{SOMETHING}

非常令人惊讶 none 的正常转义序列工作 Lol

我需要一种方法来表示在 Hiera 1.x 和 2.x 上工作的文字 %{VAR} 字符串,这样当我 mid-upgrade 时就不会出现任何问题。

这是我想出的愚蠢技巧,它在 1.3.4 和 2.0.0 中对我都有效:

---
"%": "%"

myclass::outputstuff:
  - "Heres a literal var %{hiera('%')}{VAR}"

插值后——在任一 Hiera 版本中——计算结果为:

{"%":"%","myclass::outputstuff":["Heres a literal var %{VAR}"]}

当然,这会导致额外的 % 键四处浮动,但这不会造成任何伤害。然后,post-upgrade 我可以切换到 %{literal('%')},并删除多余的 YAML 条目。

对于 Hiera 3.3.1,您可以在 YAML 中使用它:

%%{}{EXAMPLE}

这将输出这个文字:

%{EXAMPLE}