23

我正在生成配置文件,我希望它们能够缩进。我从一个 Jinja2 模板开始,该模板在从一个简单的 python 程序调用时正确呈现。当我从 ansible 调用它时,除了循环的第一行之外,我将得到 2 个额外的空格。生成 YAML 和 python 之类的东西真的很痛苦。我已采取将注释行作为 for 块的第一行来解决此问题...

这是一个非常简单的 YAML 生成器示例:

剧本调用:

  - name: generate bgp vars file, put in includes directory
    local_action: template src={{ role_dir }}/templates/bgp_vars.j2 dest={{ incvar_dir }}/bgp_vars.yaml
    run_once: true

模板部分:

dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
  {% for host in groups[bgpgroupname] if dc == hostvars[host].MYDC %}
    - "{{ hostvars[host].MAIN_MYADDR }}"
  {% endfor %}
{% endfor %}

渲染输出:

dc_route_reflectors:

# dc is "pnp"
  pnp:
      - "10.100.16.3"
      - "10.100.32.3"
  # dc is "sgs"
  sgs:
      - "10.8.0.3"
      - "10.8.16.3"
  # dc is "cst"
  cst:
      - "10.4.0.3"
      - "10.4.16.3"
  # dc is "dse"
  dse:
      - "10.200.0.3"
      - "10.200.16.3"

注意 dc is "pnp" 注释没有像模板中显示的那样缩进,但是 sgs、cst 和 dse 注释缩进了 2 个空格。ip 地址的所有数组行也是缩进的。正如 Jinja2 所描述的那样,我尝试了各种版本的将“-”添加到“%”的东西,但没有一个给出一致的正确结果。

其他人一定以前见过。我在 CentOS7 上运行 2.2.1.0。

4

1 回答 1

41

首先,您可以删除在语句前面显式添加的空格,并仅为数据保留缩进:

dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
{% for host in groups[bgpgroupname] if dc == hostvars[host].MYDC %}
    - "{{ hostvars[host].MAIN_MYADDR }}"
{% endfor %}
{% endfor %}

如果要保持语句的缩进,可以将lstrip_blocks选项设置为True(注意:声明必须在模板的第一行):

#jinja2:lstrip_blocks: True
dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
  {% for host in groups[bgpgroupname] if dc == hostvars[host].MYDC %}
    - "{{ hostvars[host].MAIN_MYADDR }}"
  {% endfor %}
{% endfor %}

阅读更多关于Jinja2 中的空白控制


Ansible 在trim_blocks启用和lstrip_blocks禁用的情况下运行 Jinja2。

因此,您在模板中输入的所有空格(语句和表达式之外)都被视为输出的一部分。没有添加“额外空格”。

注意 dc is "pnp" 注释没有像模板中显示的那样缩进,但是 sgs、cst 和 dse 注释缩进了 2 个空格。

这两个空格包含在您的模板中的第 7 行(之前{% endfor %})。

ip 地址的所有数组行也是缩进的。

这些空格在模板中的第 5 行(在 前面{% for host)中定义。

于 2017-03-20T22:09:34.993 回答