On Thu, 17 Aug 2023 13:11:25 -0400 Brian Coca <[email protected]> wrote:
> see map/select/reject filters .. they are actually loops and normally
> much simpler than using jinja command syntax ( {% %} ).
Unfortunately, some filters are not *map* friendly. For example, the
filter *product*
list1|product(list2) .............. works fine
list1|zip(list2)|map('product') ... does not work
Details: Given the list
l1:
- dir: /tmp/test/d1
sub_dir: [a, b]
- dir: /tmp/test/d2
sub_dir: [a, b, c]
the goal is to create the list of products
l2:
- /tmp/test/d1/a
- /tmp/test/d1/b
- /tmp/test/d2/a
- /tmp/test/d2/b
- /tmp/test/d2/c
The iteration (the filter *subelements* not used
to demonstrate the functionality of *product*)
- debug:
msg: "{{ [item.0]|product(item.1) }}"
loop: "{{ dirs|zip(sdirs) }}"
vars:
dirs: "{{ l1|map(attribute='dir') }}"
sdirs: "{{ l1|map(attribute='sub_dir') }}"
works as expected. Gives (abridged)
msg:
- - /tmp/test/d1
- a
- - /tmp/test/d1
- b
msg:
- - /tmp/test/d2
- a
- - /tmp/test/d2
- b
- - /tmp/test/d2
- c
But, the filter *product* doesn't work with *map*
dirs: "{{ l1|map(attribute='dir') }}"
sdirs: "{{ l1|map(attribute='sub_dir') }}"
l3: "{{ dirs|zip(sdirs)|map('product') }}"
gives
l3:
- - - /tmp/test/d1
- - - a
- b
- - - /tmp/test/d2
- - - a
- b
- c
This leaves you with Jinja if you want to avoid the loops in tasks
l3: |
{% filter from_yaml %}
{% for i in l1 %}
{% for s in i.sub_dir %}
- {{ i.dir }}/{{ s }}
{% endfor %}
{% endfor %}
{% endfilter %}
--
Vladimir Botka
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/20230817202944.3f3512c8%40gmail.com.
pgpzQmp4GVXoP.pgp
Description: OpenPGP digital signature
