Reputation: 67
I have two list of dicts:
member_added:
pool1:
- name: 10.99.99.101:80
- name: 10.99.99.102:80
pool2:
- name: 10.98.98.101:80
member_updated:
pool1:
- name: 10.99.99.99:80
status: present
- name: 10.99.99.101:80
status: present
- name: 10.99.99.102:80
status: present
pool2:
- name: 10.98.98.99:80
status: present
- name: 10.98.98.101:80
status: present
I need to remove duplicate members from member_updated
End result should be
member_updated_without_duplicates:
pool1:
- name: 10.99.99.99:80
status: present
pool2:
- name: 10.98.98.99:80
status: present
I can imagine how to do it in Python, bus Ansible less flexible in data manipulation.
Does anybody have idea how remove those duplicates?
Upvotes: 1
Views: 69
Reputation: 67959
Given the data member_added:
pool1:
- name: 10.99.99.101:80
- name: 10.99.99.102:80
member_updated:
pool1:
- name: 10.99.99.99:80
status: present
- name: 10.99.99.101:80
status: present
- name: 10.99.99.102:80
status: present
The declarations
without: "{{ member_updated.pool1|
rejectattr('name', 'in', member_added.pool1|
map(attribute='name')|
list) }}"
member_updated_without_duplicates: "{{{'pool1': without}}}"
give what you want
member_updated_without_duplicates:
pool1:
- name: 10.99.99.99:80
status: present
Given the data
member_added:
pool1:
- name: 10.99.99.101:80
- name: 10.99.99.102:80
member_updated:
pool1:
- name: 10.99.99.99:80
status: present
- name: 10.99.99.101:80
status: present
- name: 10.99.99.102:80
status: present
pool2:
- name: 10.99.99.98:80
status: present
- name: 10.99.99.101:80
status: present
The declarations
blist: "{{ member_added.pool1|map(attribute='name')|list }}"
without: "{{ member_updated.values()|list|
map('rejectattr', 'name', 'in', blist)|
list }}"
member_updated_without_duplicates: "{{ dict(member_updated.keys()|zip(without)) }}"
give
member_updated_without_duplicates:
pool1:
- name: 10.99.99.99:80
status: present
pool2:
- name: 10.99.99.98:80
status: present
Upvotes: 2