I am trying to build a list of names from a list of objects. It works fine, but some of the objects don't have a name. No problem, I use the default() filter to set those elements of my list to empty strings, like this:
# Build a list of names from a list of things- set_fact: names: "{{ names |default([]) + [ item.name |default('') ] }}" with_items: "{{ things }}"
This got me, as expected, this result (because at the moment, my test list of things has two items, and neither has a name attribute):
ok: [localhost] => {
"names": [
"",
""
]
}
Now, how can I remove those empty strings from my list? I have read numerous articles that mention "rejectattr", but I don't understand how to use it.
I tried this:
# Remove any empty elements from the list of instance profile names
- set_fact:
names: "{{ names |default([]) |reject('equalto', '') }}"
And got this mystifying output:
ok: [localhost] => {
"names": "<generator object _select_or_reject at 0x7f4ecd9c9aa0>"
}
I also tried using rejectattr on the first loop like this:
# Build a list of names from a list of things
- set_fact:
names: "{{ names |default([]) + [ item.name |default('') ] }}"
with_items: "{{ things |rejectattr('name', 'undefined') }}"
That got me a list with ONE empty string:
ok: [localhost] => {
"names": [
""
]
}
Grateful for any pointers...
Regards, K.
PS: Pointers to USEFUL, COMPLETE examples of how to use rejectattr(), reject() and so on would be useful too. All the examples I have found seem to assume a huge amount of knowledge I don't have, or are tiny fragments of code...
--