access: fix VLAN database idempotency

Do not try and match the global VLAN list as printed by the switch.
Instead, only try to realize the truth: there may be some VLANs added
and some removed.

We keep the compact_numlist filter and use it instead of the built-in
vlan_parser when listing VLANs for tagged ports. This is because some
switches compact 1,2,4,5,6 as 1-2,4-6 and others as 1,2,4-6 (see next
commit).

All of this should reduce the number of cases where Ansible reports a
change in configuration where there was in fact no change.
This commit is contained in:
Timotej Lazar 2025-09-18 13:45:16 +02:00
parent bd4299732d
commit 6ade4f2f8a
5 changed files with 43 additions and 31 deletions

View file

@ -11,6 +11,20 @@
set_fact:
snmp_engine_id: '{{ (serial | sha1)[:24] }}'
- name: Get switch facts
cisco.ios.ios_facts:
gather_subset: config
# Determine VLANs to add and remove from switch.
- set_fact:
actual_vlans: "{{ vlans | map(attribute='vid') }}"
switch_vlans: "{{ ansible_net_config | split('\n') | select('match', '^ *vlan (range )?[0-9]')
| map('regex_search', '[0-9,-]+') | join(',') | ansible.netcommon.vlan_expander }}"
- set_fact:
add_vlans: "{{ actual_vlans | difference(switch_vlans) }}"
del_vlans: "{{ switch_vlans | difference(actual_vlans) }}"
- name: Set configuration
ansible.netcommon.cli_config:
config: '{{ lookup("template", "config-"~manufacturer~"-"~device_type~".j2") }}'