If you read a little further down, under the "Loops and Conditionals"[1] this information is present:
Combining when with with_items (see Loops), be aware that the when > statement is processed separately for each item... If you need to skip the > whole task depending on the loop variable being defined, used the |default > filter to provide an empty iterator [1] http://docs.ansible.com/ansible/playbooks_conditionals.html#loops-and-conditionals On Wed, Nov 2, 2016 at 7:41 PM, Dan Lang <[email protected]> wrote: > Thanks for the info Matt. The Ansible docs, http://docs.ansible.com/ > ansible/playbooks_conditionals.html, indicate this is should work as > before. Specifically, >> >> If a required variable has not been set, you can skip or fail using >> Jinja2’s defined test. For example: >> >> tasks: >> - shell: echo "I've got '{{ foo }}' and am not afraid to use it!" >> when: foo is defined >> >> - fail: msg="Bailing out. this play requires 'bar'" >> when: bar is undefined >> >> This is especially useful in combination with the conditional import of >> vars files (see below). >> > > Do you know where this behavior is documented? I'd like to update the > docs and submit a PR. > > On Wednesday, November 2, 2016 at 5:44:18 PM UTC-4, Matt Martz wrote: >> >> In 2.1 this would have been a deprecation warning. What you need is >> something like: >> >> with_items: "{{ existing_rules.files | default([]) | >> map(attribute='path') | list }}" >> >> That gives existing_rules.files a default of an empty list. >> >> Also off note here, is that `when` statements are processed for each >> iteration of the with_items loop, and not before the with_items. So your >> with_items needs to process correctly all the time. As such, you could >> remove `when` statement altogether as it isn't doing what you wanted it to >> do. >> >> On Wed, Nov 2, 2016 at 4:37 PM, Dan Lang <[email protected]> wrote: >> >>> I'm testing existing roles and playbooks against Ansible 2.2, and I've >>> noticed that several roles that I have written that take advantage of >>> "when: variable is defined" or "when: variable is undefined" in tasks no >>> longer work. This happens when a variable is used from a previous task, >>> but is empty because maybe the results were empty. Here is an example: >>> >>> - name: Find existing rules >>>> find: path=/etc/software/rules/ >>>> register: existing_rules >>>> - name: Clean rules >>>> file: path={{ item }} state=absent >>>> with_items: "{{ existing_rules.files | map(attribute='path') | list >>>> }}" >>>> when: existing_rules is defined >>> >>> >>> In this case, there were no existing files, so the variable is empty and >>> I would expect this *Clean rules* task to be skipped, but instead >>> Ansible errors with something like >>> >>>> FAILED! => {"failed": true, "msg": "'dict object' has no attribute >>>> 'files'"} >>> >>> >>> What are the options then to allow for this sort of conditional logic? >>> This definitely worked in Ansible 2.1, but I don't recall if any DEPRECATED >>> warnings were given. >>> >>> >>> -- >>> 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 post to this group, send email to [email protected]. >>> To view this discussion on the web visit https://groups.google.com/d/ms >>> gid/ansible-project/0240be2f-27d7-41f3-a188-7c346d01e593% >>> 40googlegroups.com >>> <https://groups.google.com/d/msgid/ansible-project/0240be2f-27d7-41f3-a188-7c346d01e593%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> >> >> -- >> Matt Martz >> @sivel >> sivel.net >> > -- > 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 post to this group, send email to [email protected]. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/ansible-project/f2cc398e-bb26-4fa1-a351-d743cd58d3b5%40googlegroups. > com > <https://groups.google.com/d/msgid/ansible-project/f2cc398e-bb26-4fa1-a351-d743cd58d3b5%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- Matt Martz @sivel sivel.net -- 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 post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/CAD8N0v9o2hptSZRrs09kJBpn7jN14okjhfcuKqGUFLByDXbH-Q%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
