Support for gathering facts before evaluating conditional playbook includes?

29 views
Skip to first unread message

Thomas Brezinski

unread,
Jul 26, 2016, 8:33:34 PM7/26/16
to Ansible Project
Hello,

I've been looking at using the support for conditionally including playbooks, that was introduced in Ansible 2.0, to simplify some old playbooks. I noticed that the playbook include conditionals are evaluated before any variables have been loaded. This means if you do something like:

- include: other_playbook.yml
 
when: false

you get the nice:
skipping playbook include 'other_playbook.yml' due to conditional test failure
and the conditional doesn't get applied to every task inside the playbook. This is great and prevents having potentially hundreds of skipped tasks for a playbook that never ran.

However, if you use a conditional with any variable in it, even something like:
- include:other_playbook.yml
 
when:"'{{ ansible_hostname }}' | match('special_server')"
the code in playbook/playbook_include.py will throw an AnsibleError when evaluating the conditional because ansible_hostname is undefined. It then passes the conditional on to every task.

Besides the extra skipped output, we've run into issues where roles get marked skipped inside other_playbook.yml and then aren't run by a later playbook. This led to some allow_duplicates being added to ensure the roles would be run the second time (which has led to some other complications with our upgrade to 2.x).

I'm curious if there's a reason fact gathering couldn't be done (if enabled) before playbook includes are evaluated to support better conditional includes. This would prevent a lot of skipped tasks and unnecessary allow_duplicate usage in our situation. Or is there a better way to approach this in general?

Thanks,
Thomas Brezinski
Reply all
Reply to author
Forward
0 new messages