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:
parent
5f1e2afc34
commit
7b8cec3f59
1 changed files with 84 additions and 33 deletions
|
@ -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]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue