Hi everyone,
I've been struggling to get the difference between 2 lists in Ansible.
List 1 contains numbers as integers. List 2 contains numbers as strings.
These obviously cannot be filtered with difference().
Does anyone know a workaround? Or a point where I can make a change in my parsing to remediate this difference?
We are using Ansible 2.7.10. Upgrading is an option if needed. My setup is below. Thank you for your time!
List 1 comes from parsing a JSON document.
- name: "Create list from JSON source."
set_fact:
cmdb_list: "{{ cmdb_call.json.results | map(attribute='vid') | list }}"
# Debug of cmdb_list. Output shortened for readability.
ok: [localhost] => {
"msg": [
[
2141,
2142,
2143
]
]
}
List 2 comes from parsing a XML document in 2 steps.
- name: "Create list from XML source. Step 1."
xml:
xmlstring: "{{ device_call.ansible_facts.ansible_net_config }}"
xpath: //vlan-id
content: "text"
register: device_call_filtered
# Debug of device_call_filtered. Output of matches and xmlstring keys shortened for readability.
ok: [some_switch] => {
"msg": [
{
"actions": {
"namespaces": {},
"state": "present",
"xpath": "//vlan-id"
},
"changed": false,
"count": 18,
"failed": false,
"matches": [
{
"vlan-id": "2141"
},
{
"vlan-id": "2056"
}
],
"msg": 18,
"xmlstring": "<?xml version='1.0' encoding='UTF-8'?>\\n <configuration>\\n <vlans>\\n <vlan>\\n <name>some_vlan</name>\\n <vlan-id>2141</vlan-id>\\n </vlan>\\n </vlans>\\n </configuration>"
}
]
}
- name: "Create list of configured VLANs per Device."
set_fact:
device_list: "{{ device_call_filtered.matches | map(attribute='vlan-id') | list }}"
delegate_facts: true
# Debug of device_list. Output shortened for readability.
ok: [some_switch] => {
"msg": [
[
"2141",
"2056"
]
]
}
- name: "Get difference."
set_fact:
difference_list: "{{ cmdb_list | difference(device_list) }}"
^ So that's not going to work in this state.