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
--
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/6e69872a-92ca-49dc-8dbb-69d2389e931c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.