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

时间:2018-06-28 13:35:21

标签: ansible ansible-template

我有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解析器获取最后一个节点。下一步,错误的文件会被其他角色使用,无法正确处理。

1 个答案:

答案 0 :(得分:1)

在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