mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Merge pull request #2232 from dhozac/module-args-dict
Allow specifying args directly to actions using module: syntax
This commit is contained in:
commit
fb26f059c5
11 changed files with 54 additions and 14 deletions
|
@ -379,7 +379,8 @@ class AnsibleModule(object):
|
||||||
return changed
|
return changed
|
||||||
try:
|
try:
|
||||||
# FIXME: support English modes
|
# FIXME: support English modes
|
||||||
mode = int(mode, 8)
|
if not isinstance(mode, int):
|
||||||
|
mode = int(mode, 8)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.fail_json(path=path, msg='mode needs to be something octalish', details=str(e))
|
self.fail_json(path=path, msg='mode needs to be something octalish', details=str(e))
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,13 @@ class Task(object):
|
||||||
if x in utils.plugins.module_finder:
|
if x in utils.plugins.module_finder:
|
||||||
if 'action' in ds:
|
if 'action' in ds:
|
||||||
raise errors.AnsibleError("multiple actions specified in task %s" % (ds.get('name', ds['action'])))
|
raise errors.AnsibleError("multiple actions specified in task %s" % (ds.get('name', ds['action'])))
|
||||||
|
if isinstance(ds[x], dict):
|
||||||
|
if 'args' in ds:
|
||||||
|
raise errors.AnsibleError("can't combine args: and a dict for %s: in task %s" % (x, ds.get('name', "%s: %s" % (x, ds[x]))))
|
||||||
|
ds['args'] = ds[x]
|
||||||
|
ds[x] = ''
|
||||||
|
elif ds[x] is None:
|
||||||
|
ds[x] = ''
|
||||||
if not isinstance(ds[x], basestring):
|
if not isinstance(ds[x], basestring):
|
||||||
raise errors.AnsibleError("action specified for task %s has invalid type %s" % (ds.get('name', "%s: %s" % (x, ds[x])), type(ds[x])))
|
raise errors.AnsibleError("action specified for task %s has invalid type %s" % (ds.get('name', "%s: %s" % (x, ds[x])), type(ds[x])))
|
||||||
ds['action'] = x + " " + ds[x]
|
ds['action'] = x + " " + ds[x]
|
||||||
|
@ -108,6 +115,14 @@ class Task(object):
|
||||||
self.delegate_to = ds.get('delegate_to', None)
|
self.delegate_to = ds.get('delegate_to', None)
|
||||||
self.transport = ds.get('connection', ds.get('transport', play.transport))
|
self.transport = ds.get('connection', ds.get('transport', play.transport))
|
||||||
|
|
||||||
|
if isinstance(self.action, dict):
|
||||||
|
if 'module' not in self.action:
|
||||||
|
raise errors.AnsibleError("'module' attribute missing from action in task \"%s\"" % ds.get('name', '%s' % self.action))
|
||||||
|
if self.args:
|
||||||
|
raise errors.AnsibleError("'args' cannot be combined with dict 'action' in task \"%s\"" % ds.get('name', '%s' % self.action))
|
||||||
|
self.args = self.action
|
||||||
|
self.action = self.args.pop('module')
|
||||||
|
|
||||||
# delegate_to can use variables
|
# delegate_to can use variables
|
||||||
if not (self.delegate_to is None):
|
if not (self.delegate_to is None):
|
||||||
# delegate_to: localhost should use local transport
|
# delegate_to: localhost should use local transport
|
||||||
|
|
|
@ -39,7 +39,10 @@ class ActionModule(object):
|
||||||
if self.runner.check:
|
if self.runner.check:
|
||||||
return ReturnData(conn=conn, comm_ok=True, result=dict(skipped=True, msg='check mode not supported for this module'))
|
return ReturnData(conn=conn, comm_ok=True, result=dict(skipped=True, msg='check mode not supported for this module'))
|
||||||
|
|
||||||
args = parse_kv(module_args)
|
args = {}
|
||||||
|
if complex_args:
|
||||||
|
args.update(complex_args)
|
||||||
|
args.update(parse_kv(module_args))
|
||||||
if not 'hostname' in args and not 'name' in args:
|
if not 'hostname' in args and not 'name' in args:
|
||||||
raise ae("'name' is a required argument.")
|
raise ae("'name' is a required argument.")
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ class ActionModule(object):
|
||||||
module_name = 'command'
|
module_name = 'command'
|
||||||
module_args += " #USE_SHELL"
|
module_args += " #USE_SHELL"
|
||||||
|
|
||||||
(module_path, is_new_style, shebang) = self.runner._copy_module(conn, tmp, module_name, module_args, inject)
|
(module_path, is_new_style, shebang) = self.runner._copy_module(conn, tmp, module_name, module_args, inject, complex_args=complex_args)
|
||||||
self.runner._low_level_exec_command(conn, "chmod a+rx %s" % module_path, tmp)
|
self.runner._low_level_exec_command(conn, "chmod a+rx %s" % module_path, tmp)
|
||||||
|
|
||||||
return self.runner._execute_module(conn, tmp, 'async_wrapper', module_args,
|
return self.runner._execute_module(conn, tmp, 'async_wrapper', module_args,
|
||||||
|
|
|
@ -32,7 +32,10 @@ class ActionModule(object):
|
||||||
''' handler for file transfer operations '''
|
''' handler for file transfer operations '''
|
||||||
|
|
||||||
# load up options
|
# load up options
|
||||||
options = utils.parse_kv(module_args)
|
options = {}
|
||||||
|
if complex_args:
|
||||||
|
options.update(complex_args)
|
||||||
|
options.update(utils.parse_kv(module_args))
|
||||||
source = options.get('src', None)
|
source = options.get('src', None)
|
||||||
dest = options.get('dest', None)
|
dest = options.get('dest', None)
|
||||||
|
|
||||||
|
@ -93,7 +96,7 @@ class ActionModule(object):
|
||||||
|
|
||||||
# run the copy module
|
# run the copy module
|
||||||
module_args = "%s src=%s" % (module_args, tmp_src)
|
module_args = "%s src=%s" % (module_args, tmp_src)
|
||||||
return self.runner._execute_module(conn, tmp, 'copy', module_args, inject=inject)
|
return self.runner._execute_module(conn, tmp, 'copy', module_args, inject=inject, complex_args=complex_args)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# no need to transfer the file, already correct md5, but still need to call
|
# no need to transfer the file, already correct md5, but still need to call
|
||||||
|
@ -103,7 +106,7 @@ class ActionModule(object):
|
||||||
module_args = "%s src=%s" % (module_args, tmp_src)
|
module_args = "%s src=%s" % (module_args, tmp_src)
|
||||||
if self.runner.check:
|
if self.runner.check:
|
||||||
module_args = "%s CHECKMODE=True" % module_args
|
module_args = "%s CHECKMODE=True" % module_args
|
||||||
return self.runner._execute_module(conn, tmp, 'file', module_args, inject=inject)
|
return self.runner._execute_module(conn, tmp, 'file', module_args, inject=inject, complex_args=complex_args)
|
||||||
|
|
||||||
def _get_diff_data(self, conn, tmp, inject, destination, source):
|
def _get_diff_data(self, conn, tmp, inject, destination, source):
|
||||||
peek_result = self.runner._execute_module(conn, tmp, 'file', "path=%s diff_peek=1" % destination, inject=inject, persist_files=True)
|
peek_result = self.runner._execute_module(conn, tmp, 'file', "path=%s diff_peek=1" % destination, inject=inject, persist_files=True)
|
||||||
|
|
|
@ -29,7 +29,10 @@ class ActionModule(object):
|
||||||
self.runner = runner
|
self.runner = runner
|
||||||
|
|
||||||
def run(self, conn, tmp, module_name, module_args, inject, complex_args=None, **kwargs):
|
def run(self, conn, tmp, module_name, module_args, inject, complex_args=None, **kwargs):
|
||||||
args = utils.parse_kv(module_args)
|
args = {}
|
||||||
|
if complex_args:
|
||||||
|
args.update(complex_args)
|
||||||
|
args.update(utils.parse_kv(module_args))
|
||||||
if not 'msg' in args:
|
if not 'msg' in args:
|
||||||
args['msg'] = 'Hello world!'
|
args['msg'] = 'Hello world!'
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,10 @@ class ActionModule(object):
|
||||||
# note: the fail module does not need to pay attention to check mode
|
# note: the fail module does not need to pay attention to check mode
|
||||||
# it always runs.
|
# it always runs.
|
||||||
|
|
||||||
args = utils.parse_kv(module_args)
|
args = {}
|
||||||
|
if complex_args:
|
||||||
|
args.update(complex_args)
|
||||||
|
args.update(utils.parse_kv(module_args))
|
||||||
if not 'msg' in args:
|
if not 'msg' in args:
|
||||||
args['msg'] = 'Failed as requested from task'
|
args['msg'] = 'Failed as requested from task'
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,10 @@ class ActionModule(object):
|
||||||
return ReturnData(conn=conn, comm_ok=True, result=dict(skipped=True, msg='check mode not (yet) supported for this module'))
|
return ReturnData(conn=conn, comm_ok=True, result=dict(skipped=True, msg='check mode not (yet) supported for this module'))
|
||||||
|
|
||||||
# load up options
|
# load up options
|
||||||
options = utils.parse_kv(module_args)
|
options = {}
|
||||||
|
if complex_args:
|
||||||
|
options.update(complex_args)
|
||||||
|
options.update(utils.parse_kv(module_args))
|
||||||
source = options.get('src', None)
|
source = options.get('src', None)
|
||||||
dest = options.get('dest', None)
|
dest = options.get('dest', None)
|
||||||
if source is None or dest is None:
|
if source is None or dest is None:
|
||||||
|
|
|
@ -37,7 +37,10 @@ class ActionModule(object):
|
||||||
# the group_by module does not need to pay attention to check mode.
|
# the group_by module does not need to pay attention to check mode.
|
||||||
# it always runs.
|
# it always runs.
|
||||||
|
|
||||||
args = parse_kv(self.runner.module_args)
|
args = {}
|
||||||
|
if complex_args:
|
||||||
|
args.update(complex_args)
|
||||||
|
args.update(utils.parse_kv(module_args))
|
||||||
if not 'key' in args:
|
if not 'key' in args:
|
||||||
raise ae("'key' is a required argument.")
|
raise ae("'key' is a required argument.")
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,10 @@ class ActionModule(object):
|
||||||
# flag, it always runs
|
# flag, it always runs
|
||||||
|
|
||||||
hosts = ', '.join(self.runner.host_set)
|
hosts = ', '.join(self.runner.host_set)
|
||||||
args = parse_kv(template(self.runner.basedir, module_args, inject))
|
args = {}
|
||||||
|
if complex_args:
|
||||||
|
args.update(complex_args)
|
||||||
|
args.update(parse_kv(template(self.runner.basedir, module_args, inject)))
|
||||||
|
|
||||||
# Are 'minutes' or 'seconds' keys that exist in 'args'?
|
# Are 'minutes' or 'seconds' keys that exist in 'args'?
|
||||||
if 'minutes' in args or 'seconds' in args:
|
if 'minutes' in args or 'seconds' in args:
|
||||||
|
|
|
@ -37,7 +37,10 @@ class ActionModule(object):
|
||||||
raise errors.AnsibleError("in current versions of ansible, templates are only usable in playbooks")
|
raise errors.AnsibleError("in current versions of ansible, templates are only usable in playbooks")
|
||||||
|
|
||||||
# load up options
|
# load up options
|
||||||
options = utils.parse_kv(module_args)
|
options = {}
|
||||||
|
if complex_args:
|
||||||
|
options.update(complex_args)
|
||||||
|
options.update(utils.parse_kv(module_args))
|
||||||
source = options.get('src', None)
|
source = options.get('src', None)
|
||||||
dest = options.get('dest', None)
|
dest = options.get('dest', None)
|
||||||
|
|
||||||
|
@ -106,9 +109,9 @@ class ActionModule(object):
|
||||||
if self.runner.check:
|
if self.runner.check:
|
||||||
return ReturnData(conn=conn, comm_ok=True, result=dict(changed=True), diff=dict(before_header=dest, after_header=source, before=dest_contents, after=resultant))
|
return ReturnData(conn=conn, comm_ok=True, result=dict(changed=True), diff=dict(before_header=dest, after_header=source, before=dest_contents, after=resultant))
|
||||||
else:
|
else:
|
||||||
res = self.runner._execute_module(conn, tmp, 'copy', module_args, inject=inject)
|
res = self.runner._execute_module(conn, tmp, 'copy', module_args, inject=inject, complex_args=complex_args)
|
||||||
res.diff = dict(before=dest_contents, after=resultant)
|
res.diff = dict(before=dest_contents, after=resultant)
|
||||||
return res
|
return res
|
||||||
else:
|
else:
|
||||||
return self.runner._execute_module(conn, tmp, 'file', module_args, inject=inject)
|
return self.runner._execute_module(conn, tmp, 'file', module_args, inject=inject, complex_args=complex_args)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue