clean up first_found to fix a few issues:

- add a skip option so it won't raise an exception if you don't match anything
 - make it work as a drop-in replacement for first_available_file
 - document in the module comments all of the above cases
This commit is contained in:
Seth Vidal 2013-04-18 16:42:51 -04:00
parent 5f1e2afc34
commit 7b8cec3f59

View file

@ -63,9 +63,46 @@
# with_first_found: # with_first_found:
# - files: generic # - files: generic
# paths: tasks/staging tasks/production # paths: tasks/staging tasks/production
# this will include the tasks in the file generic where it is found first (staging or production) # this will include the tasks in the file generic where it is found first (staging or production)
# example simple file lists
#tasks:
#- name: first found file
# action: copy src=$item dest=/etc/file.cfg
# with_first_found:
# - files: foo.${inventory_hostname} foo
# example skipping if no matched files
# First_found also offers the ability to control whether or not failing
# to find a file returns an error or not
#
#- name: first found file - or skip
# action: copy src=$item dest=/etc/file.cfg
# with_first_found:
# - files: foo.${inventory_hostname}
# skip: true
# the above will return an empty list if the files cannot be found at all
# if skip is unspecificed or if it is set to false then it will return a list
# error which can be caught bye ignore_errors: true for that action.
# finally - if you want you can use it, in place to replace first_available_file:
# you simply cannot use the - files, path or skip options. simply replace
# first_available_file with with_first_found and leave the file listing in place
#
#
# - name: with_first_found like first_available_file
# action: copy src=$item dest=/tmp/faftest
# with_first_found:
# - ../files/foo
# - ../files/bar
# - ../files/baz
# ignore_errors: true
from ansible import utils, errors from ansible import utils, errors
import os import os
@ -79,45 +116,59 @@ class LookupModule(object):
terms = utils.listify_lookup_plugin_terms(terms, self.basedir, inject) terms = utils.listify_lookup_plugin_terms(terms, self.basedir, inject)
result = None result = None
anydict = False
skip = False
for term in terms: for term in terms:
if isinstance(term, dict): if isinstance(term, dict):
files = term.get('files', []) anydict = True
paths = term.get('paths', [])
if anydict:
filelist = files for term in terms:
if isinstance(files, basestring): if isinstance(term, dict):
files = files.replace(',', ' ') files = term.get('files', [])
files = files.replace(';', ' ') paths = term.get('paths', [])
filelist = files.split(' ') skip = utils.boolean(term.get('skip', False))
filelist = files
if isinstance(files, basestring):
files = files.replace(',', ' ')
files = files.replace(';', ' ')
filelist = files.split(' ')
pathlist = paths pathlist = paths
if paths: if paths:
if isinstance(paths, basestring): if isinstance(paths, basestring):
paths = paths.replace(',', ' ') paths = paths.replace(',', ' ')
paths = paths.replace(':', ' ') paths = paths.replace(':', ' ')
paths = paths.replace(';', ' ') paths = paths.replace(';', ' ')
pathlist = paths.split(' ') pathlist = paths.split(' ')
total_search = [] total_search = []
if not pathlist: if not pathlist:
total_search = filelist total_search = filelist
else:
for path in pathlist:
for fn in filelist:
f = path + '/' + fn
total_search.append(f)
else: else:
for path in pathlist: total_search = [term]
for fn in filelist: else:
f = path + '/' + fn total_search = terms
total_search.append(f)
else:
total_search = [term]
result = None result = None
for fn in total_search: for fn in total_search:
path = utils.path_dwim(self.basedir, fn) path = utils.path_dwim(self.basedir, fn)
if os.path.exists(path): if os.path.exists(path):
return [path] return [path]
if not result: if not result:
raise errors.AnsibleError("no match found: %s, %s" % (pathlist, filelist)) if skip:
return []
else:
return [None]