当源列表包含的值多于目标列表时,Ansible assert失败



我想使用一个断言任务来断言我们库存的网络配置。

- 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_policytem_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中的列表?

相关内容

  • 没有找到相关文章

最新更新