Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # vim: ts=4 expandtab shiftwidth=4 softtabstop=4
- import sys
- import os
- import urllib2
- import getpass
- import logging
- import logging.handlers
- import ansible
- vars = {}
- vars['user'] = getpass.getuser()
- vars['pid'] = str(os.getpid())
- vars['diff'] = {}
- logger = None
- log_path = ansible.constants.get_config(ansible.constants.p, 'log-changes', 'log', None, '')
- if log_path != '':
- if (os.path.exists(log_path) and not os.access(log_path, os.W_OK)):
- sys.stderr.write('log file at {0} is not writeable, aborting\n'.format(log_path))
- sys.exit(1)
- logging.basicConfig(filename='/dev/null', level=logging.DEBUG, format='%(asctime)s %(name)s %(message)s')
- log_file = logging.handlers.WatchedFileHandler(log_path)
- log_file.setLevel(logging.INFO)
- log_file.setFormatter(logging.Formatter('%(asctime)s [{0}] {1} %(message)s'.format(vars['pid'], vars['user'])))
- logger = logging.getLogger('log-changes')
- logger.propagate = False
- logger.addHandler(log_file)
- def log(message):
- if logger:
- logger.info(message)
- class CallbackModule(object):
- def runner_on_file_diff(self, host, diff):
- vars['diff'][host] = repr(ansible.utils.get_diff(diff))
- def runner_on_ok(self, host, res):
- if 'changed' in res and res['changed']:
- if not vars['check_mode']:
- if self.task.module_name == 'command' and res['invocation']['module_args'].strip() == '/bin/true':
- return
- if self.task.module_name in ['copy', 'template'] and host in vars['diff'] and vars['diff'][host]:
- #import pdb; pdb.set_trace()
- try:
- filename = ''.join([pair.partition('=')[2] for pair in res['invocation']['module_args'].split() if pair.partition('=')[0] == 'dest'])
- except:
- filename = ''
- log(' '.join(['diff', host, filename, vars['diff'][host]]))
- vars['diff'][host] = None
- return
- stdout = ''
- if self.task.module_name in ['apt', 'lineinfile']:
- if 'item' in res and 'stdout' in res['item']:
- stdout = ' old:' + res['item']['stdout']
- elif self.task.when and host in self.task.play.playbook.SETUP_CACHE:
- for k, v in self.task.play.playbook.SETUP_CACHE[host].iteritems():
- if k + ".stdout" in self.task.when and 'stdout' in v:
- stdout = ' old:'.join([stdout, v['stdout']])
- try:
- log('changed {0} {{{1}}} {2} {{{3}}}{4}'.format(host, self.task.templated_name, res['invocation']['module_name'], res['invocation']['module_args'], stdout))
- except:
- log('changed {0} {{{1}}} {2} {{{3}}}{4}'.format(host, self.task.name, res['invocation']['module_name'], res['invocation']['module_args'], stdout))
- def runner_on_failed(self, host, res, ignore_errors=False):
- if ignore_errors:
- return
- try:
- msg = res['msg']
- except:
- msg = ''
- try:
- log(u'failed {0} {{{1}}} {{{2}}} {3} {{{4}}}'.format(host, self.task.templated_name, msg, res['invocation']['module_name'], res['invocation']['module_args']))
- except:
- log(u'failed {0} {{{1}}} {{{2}}} {3} {{{4}}}'.format(host, self.task.name, msg, res['invocation']['module_name'], res['invocation']['module_args']))
- def runner_on_error(self, host, msg):
- pass
- def runner_on_unreachable(self, host, res):
- pass
- def playbook_on_play_start(self, pattern):
- if not 'playbook' in vars:
- #import pdb; pdb.set_trace()
- self.play.playbook.diff = True
- vars['playbook'] = self.play.playbook.filename
- vars['check_mode'] = self.play.playbook.check
- vars['arguments'] = ' '.join('{0}={1}'.format(k, v) for k, v in self.play.playbook.extra_vars.iteritems())
- vars['limit'] = ''
- if self.play.playbook.inventory._subset:
- vars['limit'] = '--limit ' + ':'.join(self.play.playbook.inventory._subset)
- if not vars['check_mode']:
- log(' '.join(['started', vars['playbook'], vars['arguments'], vars['limit']]))
- def playbook_on_stats(self, stats):
- if not vars['check_mode']:
- log(' '.join(['finished', vars['playbook'], vars['arguments'], vars['limit']]))
Advertisement
Add Comment
Please, Sign In to add comment