Ansible模板中出现的额外空格

Ansible模板中出现的额外空格,ansible,jinja2,ansible-template,Ansible,Jinja2,Ansible Template,我正在生成配置文件,我想让它们缩进。我从一个简单的python程序调用时正确呈现的Jinja2模板开始。当我从ansible调用它时,除了循环的第一行之外,我将在所有行上获得2个额外的空格。生成YAML和python之类的东西真是一件痛苦的事情。我已经开始把注释行作为for块的第一行来修复这个问题 下面是YAML生成器的一个非常简单的示例: 剧本电话: - name: generate bgp vars file, put in includes directory local_ac

我正在生成配置文件,我想让它们缩进。我从一个简单的python程序调用时正确呈现的Jinja2模板开始。当我从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 %}
#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 %}
渲染输出:

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。

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

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
(注意:声明必须位于模板的第一行):

阅读更多关于金贾2的信息


Ansible在启用
trim_块
和禁用
lstrip_块
的情况下运行Jinja2

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

请注意,dc是如何“pnp”的注释没有如模板中所示缩进,但sgs、cst和dse注释缩进了2个空格

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

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


这些空格在模板的第5行中定义(位于主机的
{%前面).

就是这样。当我在python中运行它时,它的默认值肯定是相反的。谢谢。@JerryS请查看帮助中心:。谢谢@techraf提供的#jinja2:lstrip_块:是的,我不明白为什么作为模板的Jinja首先会弄乱空格,这似乎违背了模板的目的你需要指定多个jinja2配置
#jinja2:trim_blocks:True,lstrip_blocks:True
谢谢。
#jinja2:lstrip_blocks:True
对我来说更有意义,用Ansible从jinja2模板生成一个特使YAML配置。这一直困扰着我,直到我最终找到了这个答案。感觉就像starti一样为了能给你更多的代表@techraf:)而悬赏