作为 YAML 树的变量。如何保存缩进?

Variable as a YAML tree. How to save indent?

我有 yml 个带模板的文件。模板是从 yml 树中间开始的密钥的一部分。

模板工作正常,但只为最后一个键保存缩进。如何保存所有键的缩进?

base.yml:

app:
  config1:
    base: {{ service1.company.backend | to_nice_yaml(indent=2) }}
  config2:
    node: {{ service1.company.addr | to_nice_yaml(indent=2) }}

config.yml:

service1:
  company:
    backend:
      node1: "xxx"
      node2: "yyy"
      node3: "zzz"
    addr:
      street: ""

我需要得到:

app:
  config1:
    base:
      node1: "xxx"
      node2: "yyy"
      node3: "zzz"
  config2:
    node:
      street: ""

但真正的结果是:

app:
  config1:
    base:
      node3: "zzz"
node1: "xxx"
node2: "yyy"
  config2:
    node:
      street: ""

node1node2 不保存缩进,Jinja2 解析器获取最后一个节点。在下一步中,其他角色使用了不正确的文件,无法正确处理它。

在 Jinja2 中使用 indent filter 并设置适当的缩进(to_nice_yaml 也会产生尾随换行符,因此 trim 是必需的):

app:
  config1:
    base:
      {{ service1.company.backend | to_nice_yaml(indent=2) | trim | indent(6) }}
  config2:
    node:
      {{ service1.company.addr | to_nice_yaml(indent=2) | trim | indent(6) }}

或者创建一个辅助变量并依赖 Ansible to_nice_yaml 过滤器获取整个值。例如:

...

vars:
  helper_var:
    app:
      config1:
        base: "{{ service1.company.backend }}"
      config2:
        node: "{{ service1.company.addr }}"

...

tasks:
  - copy:
      content: "{{ helper_var | to_nice_yaml(indent=2) }}"
      dest: my_file