You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:25:21