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

如何在单个Ansible assert任务中校验网络配置一致性?

单个Ansible Assert任务整合网络配置双向校验逻辑

我需要用单个Ansible assert任务结合库存文件完成网络配置的双向校验:既要确保库存定义的所有配置项都存在于设备运行配置中,也要检测设备上是否存在库存未预期的多余配置项。

现有代码(存在局限性)

当前已实现的任务逻辑如下:

- name: 获取设备运行的class-map配置
      vars:
        ansible_connection: network_cli
      ios_command:
        commands:
          - 'sh run | in class-map match-any'
      register: show_policy

    - name: 渲染模板到变量
      set_fact:
        tem_var: "{{ lookup( 'template', 'test_policy.j2' ).splitlines() }}"

    - name: 校验库存class-map是否全部存在于设备配置
      ansible.builtin.assert:
        that:
          - "'{{item}}' in show_policy.stdout_lines[0]"
        success_msg: "TEST: {{ UNIT_HOSTNAME }}: VALIDATE RUNNING POLICY: PASSED"
        fail_msg: "TEST: {{ UNIT_HOSTNAME }}: VALIDATE RUNNING POLICY: FAILED"
      loop: "{{ tem_var }}"

现有逻辑的问题

上述assert任务仅能校验tem_var(库存模板渲染出的配置项)的每一项都存在于设备运行配置中,但无法检测设备配置行数多于库存预期的情况(比如库存定义8行,设备实际有9行)。目前通过以下两个额外任务实现了多余配置的检测,现需将这部分逻辑整合到同一个assert任务中:

- name: 计算设备配置与库存的差异项
      set_fact: diff_list="{{ show_policy.stdout_lines[0] | difference(tem_var) }}"

    - name: 检测到未授权配置时报错
      ansible.builtin.fail:
        msg: "CONSISTENCY FAILURE: Please remove {{ diff_list }} from {{ UNIT_HOSTNAME }}"
      when: diff_list|default("")|length > 0

整合后的单Assert任务解决方案

通过集合运算的方式,在同一个assert任务中完成双向校验,无需额外任务:

- name: 获取设备运行的class-map配置
      vars:
        ansible_connection: network_cli
      ios_command:
        commands:
          - 'sh run | in class-map match-any'
      register: show_policy

    - name: 渲染模板到变量
      set_fact:
        tem_var: "{{ lookup( 'template', 'test_policy.j2' ).splitlines() }}"

    - name: 双向校验class-map配置一致性
      ansible.builtin.assert:
        that:
          # 校验库存所有配置项都存在于设备中
          - tem_var | difference(show_policy.stdout_lines[0]) | length == 0
          # 校验设备没有库存外的多余配置项
          - show_policy.stdout_lines[0] | difference(tem_var) | length == 0
        success_msg: "TEST: {{ UNIT_HOSTNAME }}: 配置完全一致,校验通过"
        fail_msg: >-
          TEST: {{ UNIT_HOSTNAME }}: 配置校验失败!
          {% if tem_var | difference(show_policy.stdout_lines[0]) | length > 0 %}
          库存缺失配置项: {{ tem_var | difference(show_policy.stdout_lines[0]) }}
          {% endif %}
          {% if show_policy.stdout_lines[0] | difference(tem_var) | length > 0 %}
          设备多余配置项: {{ show_policy.stdout_lines[0] | difference(tem_var) }}
          {% endif %}

逻辑说明

  1. 第一个条件:tem_var | difference(show_policy.stdout_lines[0]) | length == 0

    • 计算库存配置相对于设备配置的差集,若长度为0,说明所有库存配置项都已在设备上存在
  2. 第二个条件:show_policy.stdout_lines[0] | difference(tem_var) | length == 0

    • 计算设备配置相对于库存配置的差集,若长度为0,说明设备上没有库存未定义的多余配置
  3. 自定义失败消息:通过Jinja2模板语法,在失败时明确提示是库存项缺失还是设备存在多余配置,便于快速定位问题

内容的提问来源于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.05 22:35:36