andshorin

Ansible callback_plugins/log_changes.py

Dec 14th, 2015
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.46 KB | None | 0 0
  1. # vim: ts=4 expandtab shiftwidth=4 softtabstop=4
  2.  
  3. import sys
  4. import os
  5. import urllib2
  6. import getpass
  7. import logging
  8. import logging.handlers
  9. import ansible
  10.  
  11. vars = {}
  12. vars['user'] = getpass.getuser()
  13. vars['pid'] = str(os.getpid())
  14. vars['diff'] = {}
  15.  
  16. logger = None
  17. log_path = ansible.constants.get_config(ansible.constants.p, 'log-changes', 'log', None, '')
  18.  
  19. if log_path != '':
  20.  
  21.     if (os.path.exists(log_path) and not os.access(log_path, os.W_OK)):
  22.         sys.stderr.write('log file at {0} is not writeable, aborting\n'.format(log_path))
  23.         sys.exit(1)
  24.  
  25.     logging.basicConfig(filename='/dev/null', level=logging.DEBUG, format='%(asctime)s %(name)s %(message)s')
  26.  
  27.     log_file = logging.handlers.WatchedFileHandler(log_path)
  28.     log_file.setLevel(logging.INFO)
  29.  
  30.     log_file.setFormatter(logging.Formatter('%(asctime)s [{0}] {1} %(message)s'.format(vars['pid'], vars['user'])))
  31.  
  32.     logger = logging.getLogger('log-changes')
  33.     logger.propagate = False
  34.     logger.addHandler(log_file)
  35.  
  36.  
  37. def log(message):
  38.     if logger:
  39.         logger.info(message)
  40.  
  41. class CallbackModule(object):
  42.  
  43.     def runner_on_file_diff(self, host, diff):
  44.         vars['diff'][host] = repr(ansible.utils.get_diff(diff))
  45.  
  46.     def runner_on_ok(self, host, res):
  47.         if 'changed' in res and res['changed']:
  48.           if not vars['check_mode']:
  49.  
  50.             if self.task.module_name == 'command' and res['invocation']['module_args'].strip() == '/bin/true':
  51.                 return
  52.  
  53.             if self.task.module_name in ['copy', 'template'] and host in vars['diff'] and vars['diff'][host]:
  54.                 #import pdb; pdb.set_trace()
  55.                 try:
  56.                     filename = ''.join([pair.partition('=')[2] for pair in res['invocation']['module_args'].split() if pair.partition('=')[0] == 'dest'])
  57.                 except:
  58.                     filename = ''
  59.                 log(' '.join(['diff', host, filename, vars['diff'][host]]))
  60.                 vars['diff'][host] = None
  61.                 return
  62.  
  63.             stdout = ''
  64.             if self.task.module_name in ['apt', 'lineinfile']:
  65.                 if 'item' in res and 'stdout' in res['item']:
  66.                     stdout = ' old:' + res['item']['stdout']
  67.                 elif self.task.when and host in self.task.play.playbook.SETUP_CACHE:
  68.                     for k, v in self.task.play.playbook.SETUP_CACHE[host].iteritems():
  69.                         if k + ".stdout" in self.task.when and 'stdout' in v:
  70.                             stdout = ' old:'.join([stdout, v['stdout']])
  71.  
  72.             try:
  73.                 log('changed {0} {{{1}}} {2} {{{3}}}{4}'.format(host, self.task.templated_name, res['invocation']['module_name'], res['invocation']['module_args'], stdout))
  74.             except:
  75.                 log('changed {0} {{{1}}} {2} {{{3}}}{4}'.format(host, self.task.name, res['invocation']['module_name'], res['invocation']['module_args'], stdout))
  76.  
  77.     def runner_on_failed(self, host, res, ignore_errors=False):
  78.         if ignore_errors:
  79.             return
  80.  
  81.         try:
  82.             msg = res['msg']
  83.         except:
  84.             msg = ''
  85.         try:
  86.             log(u'failed {0} {{{1}}} {{{2}}} {3} {{{4}}}'.format(host, self.task.templated_name, msg, res['invocation']['module_name'], res['invocation']['module_args']))
  87.         except:
  88.             log(u'failed {0} {{{1}}} {{{2}}} {3} {{{4}}}'.format(host, self.task.name, msg, res['invocation']['module_name'], res['invocation']['module_args']))
  89.  
  90.     def runner_on_error(self, host, msg):
  91.         pass
  92.  
  93.     def runner_on_unreachable(self, host, res):
  94.         pass
  95.  
  96.     def playbook_on_play_start(self, pattern):
  97.         if not 'playbook' in vars:
  98.             #import pdb; pdb.set_trace()
  99.             self.play.playbook.diff = True
  100.             vars['playbook'] = self.play.playbook.filename
  101.             vars['check_mode'] = self.play.playbook.check
  102.             vars['arguments'] =  ' '.join('{0}={1}'.format(k, v) for k, v in self.play.playbook.extra_vars.iteritems())
  103.             vars['limit'] = ''
  104.             if self.play.playbook.inventory._subset:
  105.                 vars['limit'] = '--limit ' + ':'.join(self.play.playbook.inventory._subset)
  106.  
  107.             if not vars['check_mode']:
  108.                 log(' '.join(['started', vars['playbook'], vars['arguments'], vars['limit']]))
  109.  
  110.     def playbook_on_stats(self, stats):
  111.         if not vars['check_mode']:
  112.             log(' '.join(['finished', vars['playbook'], vars['arguments'], vars['limit']]))
Advertisement
Add Comment
Please, Sign In to add comment