logview: add an option to list all playbook ever run

Signed-off-by: Francois Andrieu <darknao@fedoraproject.org>
This commit is contained in:
Francois Andrieu 2020-08-16 22:36:09 +02:00
parent 84f9b4aed3
commit 71c8cedc00

View file

@ -1,14 +1,16 @@
#!/usr/bin/python3
# vim: et ts=4 ai sw=4 sts=0
import sys
import json
from optparse import OptionParser
import os
import glob
from datetime import date, timedelta
import gzip
from datetime import datetime, date, timedelta
import dateutil.parser as dateparser
import configparser
from ansible.config.manager import find_ini_config_file
from collections import Counter
logpath = '/var/log/ansible'
search_terms = ['CHANGED', 'FAILED']
@ -17,10 +19,25 @@ date_terms = {
"yesterday": lambda: date.today() - timedelta(1),
}
def parse_info(infofile):
data = {}
with open(infofile) as f:
content = f.read()
obj_list = [x+'}' for x in content.split('\n}')]
plays = []
for obj in obj_list[:-1]:
js = json.loads(obj)
if 'play' in js:
plays.append(js)
else:
data.update(json.loads(obj))
data['plays'] = plays
return data
def date_cheat(datestr):
dc = date_terms.get(datestr, lambda: dateparser.parse(datestr))
return dc().strftime("%Y/%m/%d")
return dc()
def parse_args(args):
@ -45,6 +62,7 @@ def parse_args(args):
parser.add_option("-v", default=False, dest='verbose', action='store_true', help='Verbose')
parser.add_option("-s", default=[], dest='search_terms', action='append', help="status to search for")
parser.add_option("-l", default=False, dest="list_pb", action='store_true', help="list playbooks for a specific date")
parser.add_option("-L", default=False, dest="list_all_pb", action='store_true', help="list all playbooks ever ran")
parser.add_option("--profile", default=False, dest="profile", action='store_true', help="output timing input per task")
(opts, args) = parser.parse_args(args)
@ -119,18 +137,35 @@ def main(args):
cp.read(cfg)
logpath = cp.get('callback_logdetail', "log_path", fallback="/var/log/ansible")
opts, args = parse_args(args)
for pb in glob.glob(os.path.join(logpath, opts.playbook)):
pb_name = os.path.basename(pb)
for pb_logdir in glob.glob(os.path.join(pb, opts.datestr)):
if opts.list_pb:
print(pb_name)
continue
logfiles = glob.glob(pb_logdir + '/*/*.log')
msg = search_logs(opts, logfiles)
if msg:
print(pb_name)
print(msg)
if opts.list_pb or opts.list_all_pb:
for r,d,f in os.walk(logpath):
for file in f:
if file.endswith('.info'):
pb = parse_info(os.path.join(r,file))
pb_name = os.path.splitext(os.path.basename(pb['playbook']))[0]
pb_date = datetime.fromtimestamp(pb['playbook_start'])
if opts.list_all_pb or opts.datestr == pb_date.date():
stats = Counter()
for stat in pb['stats'].values():
del stat['task_userid']
stats += Counter(stat)
print("%s\tplaybook:%s\tran by:%s\tsummary: ok:%s chd:%s unr:%s faild:%s"
% (pb_date, pb_name, pb['userid'],
stats['ok'], stats['changed'], stats['unreachable'],
stats['failures']))
else:
for pb in glob.glob(os.path.join(logpath, opts.playbook)):
pb_name = os.path.basename(pb)
for pb_logdir in glob.glob(os.path.join(pb, opts.datestr.strftime("%Y/%m/%d"))):
logfiles = glob.glob(pb_logdir + '/*/*.log*')
msg = search_logs(opts, logfiles)
if msg:
print(pb_name)
print(msg)
if __name__ == "__main__":