我想使用一个断言任务来断言我们库存的网络配置。
- name: Get running class-map config
vars:
ansible_connection: network_cli
ios_command:
commands:
- 'sh run | in class-map match-any'
register: show_policy
- name: Render template to variable
set_fact:
tem_var: "{{ lookup( 'template', 'test_policy.j2' ).splitlines() }}"
- name: Validate running class-map with acl
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工作得很好,但是路由器上的配置有时比预期的要多。我想使用与我已经使用的相同的断言任务。所以上面的assert也应该用来比较两个变量
"tem_var"是从我们的库存文件生成的变量。
例如,我们的库存有8个配置行,而路由器有9个。
在这种情况下,我不希望断言失败,如果每个变量中的行数"show_policy"one_answers";tem_var"是不一样的
我已经成功地完成了2个额外的任务,但是如果assert模块可以失败就好了。
这是工作的,但它增加了正在运行的任务的数量:
- name: Consistency check running
set_fact: diff_list="{{ show_policy.stdout_lines[0] | difference(tem_var) }}"
- name: CONSISTENCY CHECK FAILED !! Device has unvalidated config
ansible.builtin.fail:
msg: "CONSISTENCY FAILURE: Please remove {{ diff_list }} from {{ UNIT_HOSTNAME }}"
when: diff_list|default("")|length > 0
当源列表包含比目标列表更多的值时,如何断言失败?
根据当前问题标题和当前描述
例如,我们的库存有8个配置行,而路由器有9个。
在这种情况下,我不希望断言失败,如果每个变量
show_policy
和tem_var
的行数不相同。
你只需要比较两个列表的长度。
最小示例剧本
---
- hosts: localhost
become: false
gather_facts: false
vars:
show_policy:
stdout_lines:
- '1'
- '2'
tem_var:
stdout_lines:
- '1'
- '2'
- '3'
tasks:
- name: Assert failure
ansible.builtin.assert:
that: # the number of lines in each variable is the same
- show_policy.stdout_lines | length == tem_var.stdout_lines | length
success_msg: "VALIDATE RUNNING POLICY: PASSED"
fail_msg: "VALIDATE RUNNING POLICY: FAILED"
将导致输出
TASK [Assert failure] **********************************************************
fatal: [localhost]: FAILED! => changed=false
assertion: show_policy.stdout_lines | length == tem_var.stdout_lines | length
evaluated_to: false
msg: 'VALIDATE RUNNING POLICY: FAILED'
TASK [Assert failure] **********************************************************
ok: [localhost] => changed=false
msg: 'VALIDATE RUNNING POLICY: PASSED'
取决于列表长度
进一步文档
assert
模块-断言给定表达式为真 Jinja2模板设计器文档-内置过滤器列表jinja-filters.length
后续
如果您对配置(列表)之间的差异感兴趣,在示例中如果设置缺失
- Ansible:如何比较两个列表变量?
- 如何比较Ansible中的列表?