From 72fd971822cad6043c762a8b599763625c3000b4 Mon Sep 17 00:00:00 2001 From: Seth Vidal Date: Fri, 27 Apr 2012 16:43:55 -0400 Subject: [PATCH] fall through file source list: first_available_file support add first_available_file look up to _execute_template and _execute_copy to runner. add this data to playbook handler so it can be included into module_vars --- lib/ansible/playbook.py | 6 ++++-- lib/ansible/runner.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/ansible/playbook.py b/lib/ansible/playbook.py index a8e6f0d834c..bd5a3c33bde 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 1cba37ce4fa..1bf098b631b 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)