saltstack,插入到模板中的多行支柱项目

saltstack, multi-line pillar items interpolated into template

我有一个像这样的柱子:

inline_blocks:
  the_seven: |
    dog cat horse cow
    ardvaark beatle snail

然后我想将其插入到文件中

{% set inline_block = pillar['inline_blocks'].get(val, '') %}
/etc/animals.conf:
  file.managed:
    - source: salt://farm/animals.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - defaults:
        extras: {{ inline_block }}

然后在 animals.conf,

{{ extras }}

我希望如果键 valinline_blocks 中,那么它的值将被插入。如果不是,一个空字符串将被插入。

确实,如果我明确地编写默认语句,就会发生这种情况:

    - defaults:
        extras: |
          dog cat horse cow
          ardvaark beatle snail

但是如上所述,我收到错误 could not find expected ':'

作为现实检查,pillar.items 愉快地检索了支柱条目,因此 (1) 可以检索支柱条目,并且 (2) 可以对值进行插值,但是 (X) 多行.sls 文件中的值导致问题。

任何指示正确的语法是什么?

发生的事情是

    - defaults:
        extras: {{ inline_block }}

加工成

    - defaults:
        extras: dog cat horse cow
ardvaark beatle snail

因此 YAML 尝试将第二行解析为另一个顶级键。但是,标记此密钥结尾的 : 永远不会出现,因此会出现错误。

要修复它,请执行以下操作:

    - defaults: 
        extras: |
          {{ inline_block | indent(10) }}

indent 不缩进第一行,但会在随后的每一行中添加 10 个空格。

此问题也在 bug 中讨论过,但针对的是 content 参数。它似乎也适用于作为 defaultscontext 传递的多行 YAML 块。

由于您使用 Jinja 模板文件作为源,我们可以轻松地从模板本身获取支柱数据(正如上面 link 中的评论之一所建议的)。

将支柱视为:

inline_blocks:
  val: |
    dog cat horse cow
    ardvaark beatle snail

那么 animals.conf.j2 模板为:

{{ salt.pillar.get('inline_blocks:val', default="foo") }}

注意:如果保证这个pillar data一直被定义,我们甚至可以在模板中使用pillar['inline_blocks']['val']

渲染状态如下:

create-animals-conf:
  file.managed:
    - name: /tmp/animals.conf
    - source: salt://animals.conf.j2
    - mode: 0664
    - template: jinja

应按预期生成模板:

$ cat /tmp/animals.conf
dog cat horse cow
ardvaark beatle snail