Ansible Jinja2模板空列表渲染YAML格式异常的解决咨询
Ansible Jinja2模板生成YAML时空列表场景的格式修复
问题场景
使用Ansible结合Jinja2模板生成YAML配置文件时,空列表场景下出现格式异常:
原Jinja2模板
test_dict: - index_patterns: {% if not test_list -%}[]{% else %} {% for ip in opensearch_index_patterns -%} - {{ ip }} {% endfor -%} {% endif %} next_param: ""
原Playbook代码
- name: Test2 hosts: 127.0.0.1 tasks: - name: stuff vars: test_list: [] template: src: path/to/jinja2file.yml.j2 dest: path/to/result.yml trim_blocks: false
异常现象
当test_list为空时,生成的YAML中next_param与index_patterns: []连在同一行,破坏了格式:
test_dict: - index_patterns: []next_param: ""
而test_list有值时,生成的格式符合预期:
test_dict: - index_patterns: - test1 - test2 next_param: ""
问题原因
空列表分支里,[]输出后未保留换行,Jinja2的-%}语法移除了标签前后空白,导致后续next_param直接拼接在同一行。
解决方案
修改Jinja2模板,在空列表的[]后添加换行,确保next_param处于独立行:
test_dict: - index_patterns: {% if not test_list -%}[] {% else %} {% for ip in opensearch_index_patterns -%} - {{ ip }} {% endfor -%} {% endif %} next_param: ""
也可以拆分条件判断,通过显式换行控制实现相同效果:
test_dict: - index_patterns: {% if not test_list -%}[]{% endif -%} {% if test_list %} {% for ip in opensearch_index_patterns -%} - {{ ip }} {% endfor -%} {% endif %} next_param: ""
验证结果
修改模板后,空列表场景下生成的YAML格式恢复正常:
test_dict: - index_patterns: [] next_param: ""
内容的提问来源于stack exchange,提问作者Zu Jiry
相关产品推荐
相关产品推荐

