tripleo-common/ansible_plugins/callback/json_error.py
James Slagle 6e36336365 Ansible json error callback plugin
This callback plugin will write any task errors (that are not
ignore_error: true) to a log file in JSON format.

In later patches, we can add the cli and workflows to make these errors
visible via the Mistral API.

Change-Id: I72a91473511f335f8a0e40c7a786ff927113f26a
2018-05-31 07:46:10 -04:00

63 lines
2.0 KiB
Python

# Copyright 2018 Red Hat, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# Ansible has another callback plugin just called "json.py", which overrides
# a normal import of "import json", so use absolute imports
from __future__ import absolute_import
import json
import os
from ansible.plugins.callback import CallbackBase
from tripleo_common import constants
DOCUMENTATION = '''
callback: json_error
short_description: Write errors in JSON format to a log file
description:
- This callback writes errors in JSON format to a log file
type: aggregate
options:
output_dir:
name: json-error log file
default: ansible-error.json
description: Log file where to write errors in JSON format.
env:
- name: JSON_ERROR_LOG_FILE
'''
class CallbackModule(CallbackBase):
CALLBACK_VERSION = 2.5
CALLBACK_TYPE = 'aggregate'
CALLBACK_NAME = 'json-error'
def __init__(self, display=None):
super(CallbackModule, self).__init__(display)
self.errors = {}
self.log_file = os.getenv(
'JSON_ERROR_LOG_FILE',
constants.ANSIBLE_ERRORS_FILE)
def v2_playbook_on_stats(self, stats):
with open(self.log_file, 'w') as f:
f.write(json.dumps(self.errors))
def v2_runner_on_failed(self, result, ignore_errors=False):
if not ignore_errors:
host_errors = self.errors.setdefault(result._host.name, [])
host_errors.append((result.task_name, result._result))