Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added an 'ignore_errors' option to tasks #751

Merged
merged 2 commits into from
Aug 1, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 5 additions & 3 deletions lib/ansible/callbacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class DefaultRunnerCallbacks(object):
def __init__(self):
pass

def on_failed(self, host, res):
def on_failed(self, host, res, ignore_errors=False):
pass

def on_ok(self, host, res):
Expand Down Expand Up @@ -185,7 +185,7 @@ def __init__(self):
self.options = None
self._async_notified = {}

def on_failed(self, host, res):
def on_failed(self, host, res, ignore_errors=False):

self._on_any(host,res)

Expand Down Expand Up @@ -259,7 +259,7 @@ def on_unreachable(self, host, msg):
else:
print "fatal: [%s] => %s" % (host, msg)

def on_failed(self, host, results):
def on_failed(self, host, results, ignore_errors=False):

item = results.get('item', None)

Expand All @@ -269,6 +269,8 @@ def on_failed(self, host, results):
msg = "failed: [%s] => %s" % (host, utils.jsonify(results))

print stringc(msg, 'red')
if ignore_errors:
print stringc("...ignoring", 'yellow')

def on_ok(self, host, host_result):

Expand Down
10 changes: 7 additions & 3 deletions lib/ansible/playbook/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ class Task(object):
__slots__ = [
'name', 'action', 'only_if', 'async_seconds', 'async_poll_interval',
'notify', 'module_name', 'module_args', 'module_vars',
'play', 'notified_by', 'tags', 'with_items', 'first_available_file'
'play', 'notified_by', 'tags', 'with_items', 'first_available_file', 'ignore_errors'
]

# to prevent typos and such
VALID_KEYS = [
'name', 'action', 'only_if', 'async', 'poll', 'notify', 'with_items', 'first_available_file',
'include', 'tags'
'include', 'tags', 'ignore_errors'
]

def __init__(self, play, ds, module_vars=None):
Expand Down Expand Up @@ -62,7 +62,8 @@ def __init__(self, play, ds, module_vars=None):
self.notify = ds.get('notify', [])
self.first_available_file = ds.get('first_available_file', None)
self.with_items = ds.get('with_items', None)

self.ignore_errors = ds.get('ignore_errors', False)

# notify can be a string or a list, store as a list
if isinstance(self.notify, basestring):
self.notify = [ self.notify ]
Expand Down Expand Up @@ -97,6 +98,9 @@ def __init__(self, play, ds, module_vars=None):
self.with_items = [ ]
self.module_vars['items'] = self.with_items

# make ignore_errors accessable to Runner code
self.module_vars['ignore_errors'] = self.ignore_errors

# tags allow certain parts of a playbook to be run without running the whole playbook
apply_tags = ds.get('tags', None)
if apply_tags is not None:
Expand Down
8 changes: 7 additions & 1 deletion lib/ansible/runner/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -602,7 +602,13 @@ def _executor_internal_inner(self, host, inject, port, is_chained=False):
if 'skipped' in data:
self.callbacks.on_skipped(result.host)
elif not result.is_successful():
self.callbacks.on_failed(result.host, data)
ignore_errors = self.module_vars.get('ignore_errors', False)
self.callbacks.on_failed(result.host, data, ignore_errors)
if ignore_errors:
if 'failed' in result.result:
result.result['failed'] = False
if 'rc' in result.result:
result.result['rc'] = 0
else:
self.callbacks.on_ok(result.host, data)
return result
Expand Down
4 changes: 2 additions & 2 deletions test/TestPlayBook.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ def on_task_start(self, name, is_conditional):
def on_unreachable(self, host, msg):
EVENTS.append([ 'unreachable', [ host, msg ]])

def on_failed(self, host, results):
EVENTS.append([ 'failed', [ host, results ]])
def on_failed(self, host, results, ignore_errors):
EVENTS.append([ 'failed', [ host, results, ignore_errors ]])

def on_ok(self, host, result):
# delete certain info from host_result to make test comparisons easier
Expand Down