Merge pull request #5843 from jimi-c/issue_4088

Adding no_log: capability for tasks
pull/5850/head
James Cammarata 11 years ago
commit fcb760c36c

@ -12,6 +12,7 @@ Major features/changes:
* localhost/127.0.0.1 is not required to be in inventory if referenced, if not in inventory, it does not implicitly appear in the 'all' group.
* git module has new parameters (accept_hostkey, key_file, ssh_opts) to ease the usage of git and ssh protocols.
* when using accelerate mode, the daemon will now be restarted when specifying a different remote_user between plays.
* added no_log: option for tasks. When used, no logging information will be sent to syslog during the module execution.
New modules:

@ -175,6 +175,7 @@ class AnsibleModule(object):
self.argument_spec = argument_spec
self.supports_check_mode = supports_check_mode
self.check_mode = False
self.no_log = no_log
self.aliases = {}
@ -186,13 +187,14 @@ class AnsibleModule(object):
os.environ['LANG'] = MODULE_LANG
(self.params, self.args) = self._load_params()
self._legal_inputs = [ 'CHECKMODE' ]
self._legal_inputs = [ 'CHECKMODE', 'NO_LOG' ]
self.aliases = self._handle_aliases()
if check_invalid_arguments:
self._check_invalid_arguments()
self._check_for_check_mode()
self._check_for_no_log()
self._set_defaults(pre=True)
@ -205,7 +207,7 @@ class AnsibleModule(object):
self._check_required_one_of(required_one_of)
self._set_defaults(pre=False)
if not no_log:
if not self.no_log:
self._log_invocation()
def load_file_common_arguments(self, params):
@ -558,9 +560,14 @@ class AnsibleModule(object):
if self.supports_check_mode:
self.check_mode = True
def _check_for_no_log(self):
for (k,v) in self.params.iteritems():
if k == 'NO_LOG':
self.no_log = self.boolean(v)
def _check_invalid_arguments(self):
for (k,v) in self.params.iteritems():
if k == 'CHECKMODE':
if k in ('CHECKMODE', 'NO_LOG'):
continue
if k not in self._legal_inputs:
self.fail_json(msg="unsupported parameter for module: %s" % k)

@ -343,7 +343,8 @@ class PlayBook(object):
su=task.su,
su_user=task.su_user,
su_pass=task.su_pass,
run_hosts=hosts
run_hosts=hosts,
no_log=task.no_log,
)
if task.async_seconds == 0:

@ -504,7 +504,7 @@ class Play(object):
elif type(x[k]) is list:
for i in x[k]:
included_additional_conditions.insert(0, i)
elif k in ("include", "vars", "default_vars", "sudo", "sudo_user", "role_name"):
elif k in ("include", "vars", "default_vars", "sudo", "sudo_user", "role_name", "no_log"):
continue
else:
include_vars[k] = x[k]

@ -31,7 +31,7 @@ class Task(object):
'local_action', 'transport', 'sudo', 'remote_user', 'sudo_user', 'sudo_pass',
'items_lookup_plugin', 'items_lookup_terms', 'environment', 'args',
'any_errors_fatal', 'changed_when', 'failed_when', 'always_run', 'delay', 'retries', 'until',
'su', 'su_user', 'su_pass'
'su', 'su_user', 'su_pass', 'no_log',
]
# to prevent typos and such
@ -41,7 +41,7 @@ class Task(object):
'delegate_to', 'local_action', 'transport', 'remote_user', 'sudo', 'sudo_user',
'sudo_pass', 'when', 'connection', 'environment', 'args',
'any_errors_fatal', 'changed_when', 'failed_when', 'always_run', 'delay', 'retries', 'until',
'su', 'su_user', 'su_pass'
'su', 'su_user', 'su_pass', 'no_log',
]
def __init__(self, play, ds, module_vars=None, default_vars=None, additional_conditions=None, role_name=None):
@ -106,7 +106,6 @@ class Task(object):
when_name = x.replace("when_","")
ds['when'] = "%s %s" % (when_name, ds[x])
ds.pop(x)
elif not x in Task.VALID_KEYS:
raise errors.AnsibleError("%s is not a legal parameter in an Ansible task or handler" % x)
@ -122,7 +121,8 @@ class Task(object):
self.su = utils.boolean(ds.get('su', play.su))
self.environment = ds.get('environment', {})
self.role_name = role_name
self.no_log = utils.boolean(ds.get('no_log', "false"))
#Code to allow do until feature in a Task
if 'until' in ds:
if not ds.get('register'):

@ -145,6 +145,7 @@ class Runner(object):
su_user=None, # User to su to when running command, ex: 'root'
su_pass=C.DEFAULT_SU_PASS,
run_hosts=None, # an optional list of pre-calculated hosts to run on
no_log=False, # option to enable/disable logging for a given task
):
# used to lock multiprocess inputs and outputs at various levels
@ -196,6 +197,7 @@ class Runner(object):
self.su_user_var = su_user
self.su_user = None
self.su_pass = su_pass
self.no_log = no_log
if self.transport == 'smart':
# if the transport is 'smart' see if SSH can support ControlPersist if not use paramiko
@ -341,6 +343,8 @@ class Runner(object):
# if module isn't using AnsibleModuleCommon infrastructure we can't be certain it knows how to
# do --check mode, so to be safe we will not run it.
return ReturnData(conn=conn, result=dict(skipped=True, msg="cannot yet run check mode against old-style modules"))
elif 'NO_LOG' in args:
return ReturnData(conn=conn, result=dict(skipped=True, msg="cannot use no_log: with old-style modules"))
args = template.template(self.basedir, args, inject)

@ -220,6 +220,8 @@ class ActionModule(object):
pipes.quote(tmp_src), pipes.quote(source_rel))
if self.runner.noop_on_check(inject):
module_args_tmp = "%s CHECKMODE=True" % module_args_tmp
if self.runner.no_log:
module_args_tmp = "%s NO_LOG=True" % module_args_tmp
module_return = self.runner._execute_module(conn, tmp, 'file', module_args_tmp, inject=inject, complex_args=complex_args)
module_result = module_return.result

@ -45,6 +45,9 @@ class ActionModule(object):
# python modules for now
module_args += " CHECKMODE=True"
if self.runner.no_log:
module_args += " NO_LOG=True"
# shell and command are the same module
if module_name == 'shell':
module_name = 'command'

@ -184,7 +184,7 @@ class CommandModule(AnsibleModule):
args = args.replace("#USE_SHELL", "")
params['shell'] = True
r = re.compile(r'(^|\s)(creates|removes|chdir|executable)=(?P<quote>[\'"])?(.*?)(?(quote)(?<!\\)(?P=quote))((?<!\\)(?=\s)|$)')
r = re.compile(r'(^|\s)(creates|removes|chdir|executable|NO_LOG)=(?P<quote>[\'"])?(.*?)(?(quote)(?<!\\)(?P=quote))((?<!\\)(?=\s)|$)')
for m in r.finditer(args):
v = m.group(4).replace("\\", "")
if m.group(2) == "creates":
@ -203,6 +203,8 @@ class CommandModule(AnsibleModule):
if not (os.path.exists(v)):
self.fail_json(rc=258, msg="cannot use executable '%s': file does not exist" % v)
params['executable'] = v
elif m.group(2) == "NO_LOG":
params['NO_LOG'] = self.boolean(v)
args = r.sub("", args)
params['args'] = args
return (params, params['args'])

Loading…
Cancel
Save