Jer*_*ryS 14 jinja2 ansible ansible-template
我正在生成配置文件,我希望它们是缩进的.我从一个简单的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
Run Code Online (Sandbox Code Playgroud)
模板部分:
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 %}
Run Code Online (Sandbox Code Playgroud)
渲染输出:
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"
Run Code Online (Sandbox Code Playgroud)
注意dc是如何"pnp"注释没有缩进,因为它在模板中显示,但sgs,cst和dse注释缩进2个空格.所有ip地址的数组行也都是缩进的.我已经尝试过各种版本的添加" - "到Jinja2描述的"%"的东西,但没有一个给出一致的正确结果.
其他人一定以前见过这个.我在CentOS7上运行2.2.1.0.
tec*_*raf 21
首先,您可以删除在语句前明确添加的空格,并仅为数据保留缩进:
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 %}
Run Code Online (Sandbox Code Playgroud)
如果要保留语句的缩进,可以将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 %}
Run Code Online (Sandbox Code Playgroud)
阅读Jinja2中有关空白控制的更多信息.
Ansible运行Jinja2 trim_blocks启用和lstrip_blocks禁用.
因此,您键入模板的所有空格(在语句和表达式之外)都被视为输出的一部分.没有添加"额外空格".
注意dc是如何"pnp"注释没有缩进,因为它在模板中显示,但sgs,cst和dse注释缩进2个空格.
这两个空格包含在第7行(之前{% endfor %})的模板中.
所有ip地址的数组行也都是缩进的.
这些空间在模板中的第5行(在前面{% for host)中定义.
| 归档时间: |
|
| 查看次数: |
7566 次 |
| 最近记录: |