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) diff --git a/library/copy b/library/copy index b5a52647a95..f6cf6028610 100755 --- a/library/copy +++ b/library/copy @@ -43,9 +43,9 @@ for x in items: src = params['src'] dest = params['dest'] if src: - src = os.path.expanduser(src) + src = os.path.expanduser(src) if dest: - dest = os.path.expanduser(dest) + dest = os.path.expanduser(dest) # raise an error if there is no src file if not os.path.exists(src): diff --git a/library/yum b/library/yum index bb4f690281d..ee773ee15f2 100755 --- a/library/yum +++ b/library/yum @@ -57,13 +57,24 @@ def pkg_to_dict(po): 'epoch':po.epoch, 'release':po.release, 'version':po.version, - 'repo':po.ui_from_repo, - '_nevra':po.ui_nevra, } + if type(po) == yum.rpmsack.RPMInstalledPackage: d['yumstate'] = 'installed' + d['repo'] = 'installed' else: d['yumstate'] = 'available' + d['repo'] = po.repoid + + if hasattr(po, 'ui_from_repo'): + d['repo'] = po.ui_from_repo + + if hasattr(po, 'ui_nevra'): + d['_nevra'] = po.ui_nevra + else: + d['_nevra'] = '%s-%s-%s.%s' % (po.name, po.version, po.release, po.arch) + + return d @@ -215,6 +226,9 @@ def ensure(my, state, pkgspec): if state == 'latest': updates = my.doPackageLists(pkgnarrow='updates', patterns=[pkgspec]).updates + # sucks but this is for rhel5 - won't matter for rhel6 or fedora or whatnot + e,m,u = yum.parsePackages(updates, [pkgspec], casematch=True) + updates = e + m avail = my.doPackageLists(pkgnarrow='available', patterns=[pkgspec]).available if not updates and not avail: if not my.doPackageLists(pkgnarrow='installed', patterns=[pkgspec]).installed: