使用Ansible Assert模块结合Jinja模板验证配置失败求助
Ansible验证思科Class-Map配置时的语法错误与修复
问题背景
编写Ansible Playbook验证思科设备class-map配置时,使用ios_command拉取运行配置,通过Jinja模板生成期望配置,再用assert模块做断言对比,但执行时持续报错:Invalid conditional detected: EOL while scanning string literal。即使将模板渲染结果存入变量后再断言,问题依旧。另外,模板输出与设备返回的配置内容完全一致,仅顺序不同。
使用的核心模块:
ios_command:拉取设备class-map配置并存储到变量ansible.builtin.assert:对比运行配置与group_vars中定义的期望状态- Jinja
lookup():调用模板生成期望的class-map配置
现有代码
Ansible任务代码
- name: Get running class-map config tags: - policy vars: ansible_connection: network_cli ios_command: commands: - 'sh run | in class-map match-any' register: show_policy - name: Validate running class-map with acl ignore_errors: yes tags: - policy ansible.builtin.assert: quiet: yes that: - \"'{{lookup('template', 'test_policy.j2')[:-1]}}' in show_policy.stdout\" success_msg: \"TEST: {{ UNIT_HOSTNAME }}: VALIDATE RUNNING POLICY: PASSED\" fail_msg: \"TEST: {{ UNIT_HOSTNAME }}: VALIDATE RUNNING POLICY: FAILED\"
Jinja模板(test_policy.j2)
#jinja2: lstrip_blocks: False, trim_blocks: True {% for classmap in CLASS_MAP %} class-map match-any {{classmap.NAME}} {% endfor -%}
错误原因与修复方案
1. 语法转义冲突
断言条件中多余的\"转义和多层引号嵌套是触发语法错误的直接原因。YAML字符串无需额外转义内部的Jinja表达式,直接使用双引号包裹即可避免冲突。
2. 配置顺序不一致问题
直接用字符串包含判断会因为设备输出和模板生成的配置顺序不同导致验证失败,需要将两边内容转换成列表后排序再比对。
修复后的任务代码
- name: Get running class-map config tags: - policy vars: ansible_connection: network_cli ios_command: commands: - 'sh run | in class-map match-any' register: show_policy - name: Render expected class-map config set_fact: expected_classmaps: "{{ lookup('template', 'test_policy.j2').splitlines() | sort }}" - name: Validate running class-map with acl tags: - policy ansible.builtin.assert: quiet: yes that: - show_policy.stdout[0].splitlines() | sort == expected_classmaps success_msg: "TEST: {{ UNIT_HOSTNAME }}: VALIDATE RUNNING POLICY: PASSED" fail_msg: "TEST: {{ UNIT_HOSTNAME }}: VALIDATE RUNNING POLICY: FAILED"
修复说明
- 新增
set_fact任务单独处理模板渲染,将结果按行分割并排序,避免在断言条件中嵌套复杂Jinja表达式引发语法问题。 - 设备返回的
show_policy.stdout[0]是单条命令的输出内容,同样按行分割排序后,与期望配置列表做相等比对,彻底解决顺序差异的问题。 - 移除了所有不必要的引号转义,YAML语法更简洁规范。
内容的提问来源于stack exchange,提问作者C.AN5
相关产品推荐
相关产品推荐

