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

jim*_*ock 3 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) }}
Run Code Online (Sandbox Code Playgroud)

config.yml

service1:
  company:
    backend:
      node1: "xxx"
      node2: "yyy"
      node3: "zzz"
    addr:
      street: ""
Run Code Online (Sandbox Code Playgroud)

我需要得到:

app:
  config1:
    base:
      node1: "xxx"
      node2: "yyy"
      node3: "zzz"
  config2:
    node:
      street: ""
Run Code Online (Sandbox Code Playgroud)

但真正的结果是:

app:
  config1:
    base:
      node3: "zzz"
node1: "xxx"
node2: "yyy"
  config2:
    node:
      street: ""
Run Code Online (Sandbox Code Playgroud)

node1并且node2不要保存缩进,Jinja2 解析器会获取最后一个节点。在下一步中,不正确的文件用于其他无法正确处理的角色。

tec*_*raf 15

使用indent过滤器中的Jinja2与适当压痕装置(也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) }}
Run Code Online (Sandbox Code Playgroud)

或者创建一个辅助变量并依赖 Ansibleto_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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!`indent` 效果很好,但我认为更正确地使用辅助变量。 (3认同)
  • 这两种方法我都喜欢。不过,我最终使用了第一个,因此我可以限制用户可以在我创建的配置文件中更改的内容。 (2认同)