diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index a8e6f0d834..bd5a3c33bd 100644 --- a/lib/ansible/playbook.py +++ b/lib/ansible/playbook.py @@ -390,8 +390,10 @@ class PlayBook(object): module_args = tokens[1] # include task specific vars - module_vars = task.get('vars') - + module_vars = task.get('vars', {}) + if 'first_available_file' in task: + module_vars['first_available_file'] = task.get('first_available_file') + # tasks can be direct (run on all nodes matching # the pattern) or conditional, where they ran # as the result of a change handler on a subset diff --git a/lib/ansible/runner.py b/lib/ansible/runner.py index 1cba37ce4f..1bf098b631 100644 --- a/lib/ansible/runner.py +++ b/lib/ansible/runner.py @@ -390,6 +390,20 @@ class Runner(object): # apply templating to source argument inject = self.setup_cache.get(conn.host,{}) + + # if we have first_available_file in our vars + # look up the files and use the first one we find as src + if 'first_available_file' in self.module_vars: + found = False + for fn in self.module_vars.get('first_available_file'): + fn = utils.template(fn, inject, self.setup_cache) + if os.path.exists(fn): + source = fn + found = True + break + if not found: + return (host, True, dict(failed=True, msg="could not find src"), '') + source = utils.template(source, inject, self.setup_cache) # transfer the file to a remote tmp location @@ -480,6 +494,20 @@ class Runner(object): # apply templating to source argument so vars can be used in the path inject = self.setup_cache.get(conn.host,{}) + + # if we have first_available_file in our vars + # look up the files and use the first one we find as src + if 'first_available_file' in self.module_vars: + found = False + for fn in self.module_vars.get('first_available_file'): + fn = utils.template(fn, inject, self.setup_cache) + if os.path.exists(fn): + source = fn + found = True + break + if not found: + return (host, True, dict(failed=True, msg="could not find src"), '') + source = utils.template(source, inject, self.setup_cache) (host, ok, data, err) = (None, None, None, None)