Nested conditional loop

Hi all,

I have a dictionary on my site_vars.yml something like this:

services:

  • name: “service1”

    foo: “bar”

The playbook calls the role:

  • name: Configure backend
    hosts: backend
    gather_facts: true
    become: yes
    roles:
  • { role: myrole, type: ‘bar’ }

And on the tasks main.yml

  • name: do stuff
    file: path=/var/www/html/{{ item.name }} state=directory
    with_items: “{{ services }}”
    when: type == “bar” and item.foo == “bar”

I am aware this is not elegante. What I would like to do is to have a task which will only execute when the type passed from the invocation of the role matches the value of the variable foo. I tried a couple of with_x alternatives, but as I don’t know the order with which when and with_items executes, I’m stuck.

Can anyone chip in with a solution to this basic problem?

Thanks,
Miguel

Hi,

did you already solve your problem?

And on the tasks main.yml

- name: do stuff
  file: path=/var/www/html/{{ item.name }} state=directory
  with_items: "{{ services }}"
  when: type == "bar" and item.foo == "bar"

Normally this should be "split" up into as many separate tasks as you
have services in {{ services }}. Each one is run evaluating the
when-conditition. So one of them should work...

https://docs.ansible.com/ansible/playbooks_loops.html

Also be aware that when combining when with with_items (or any other loop statement), the when statement is processed separately for each item. See The When Statement for an example.

https://docs.ansible.com/ansible/playbooks_conditionals.html#the-when-statement

Try to debug this using the debug task, drop the type in when and see,
what works:

  - debug: msg="Works with {{ item.name }}"
    when: 'item.foo == "bar"'

Johannes