如何在单个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 %}
逻辑说明
第一个条件:
tem_var | difference(show_policy.stdout_lines[0]) | length == 0- 计算库存配置相对于设备配置的差集,若长度为0,说明所有库存配置项都已在设备上存在
第二个条件:
show_policy.stdout_lines[0] | difference(tem_var) | length == 0- 计算设备配置相对于库存配置的差集,若长度为0,说明设备上没有库存未定义的多余配置
自定义失败消息:通过Jinja2模板语法,在失败时明确提示是库存项缺失还是设备存在多余配置,便于快速定位问题
内容的提问来源于stack exchange,提问作者C.AN5
相关产品推荐
相关产品推荐

