Ansible模板中出现额外的空格

时间:2017-03-20 21:31:40

标签: ansible jinja2 ansible-template

我正在生成配置文件,我希望它们缩进。我从一个简单的python程序调用时正确渲染的Jinja2模板开始。当我从ansible调用它时,除了循环的第一行之外,我将获得2个额外的空格。生成像YAML和python这样的东西真的很痛苦。我已经把注释行作为for block的第一行来解决这个问题......

以下是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是如何" pnp"注释不会缩进,因为它在模板中显示,但sgs,cst和dse注释缩进2个空格。所有ip地址的数组行也都是缩进的。我尝试了各种版本的添加" - "到"%"正如Jinja2所描述的那样,但没有一个能给出一致的正确结果。

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

1 个答案:

答案 0 :(得分:15)

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

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中的whitespace control

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

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

  

注意dc是如何“pnp”注释没有缩进,因为它在模板中显示,但sgs,cst和dse注释缩进了2个空格。

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

  

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

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