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 #!/usr/bin/python3
# vim: et ts=4 ai sw=4 sts=0
import sys import sys
import json import json
from optparse import OptionParser from optparse import OptionParser
import os import os
import glob import glob
from datetime import date, timedelta
import gzip import gzip
from datetime import datetime, date, timedelta
import dateutil.parser as dateparser import dateutil.parser as dateparser
import configparser import configparser
from ansible.config.manager import find_ini_config_file from ansible.config.manager import find_ini_config_file
from collections import Counter
logpath = '/var/log/ansible' logpath = '/var/log/ansible'
search_terms = ['CHANGED', 'FAILED'] search_terms = ['CHANGED', 'FAILED']
@ -17,10 +19,25 @@ date_terms = {
"yesterday": lambda: date.today() - timedelta(1), "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): def date_cheat(datestr):
dc = date_terms.get(datestr, lambda: dateparser.parse(datestr)) dc = date_terms.get(datestr, lambda: dateparser.parse(datestr))
return dc().strftime("%Y/%m/%d") return dc()
def parse_args(args): 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("-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("-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_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") parser.add_option("--profile", default=False, dest="profile", action='store_true', help="output timing input per task")
(opts, args) = parser.parse_args(args) (opts, args) = parser.parse_args(args)
@ -119,18 +137,35 @@ def main(args):
cp.read(cfg) cp.read(cfg)
logpath = cp.get('callback_logdetail', "log_path", fallback="/var/log/ansible") logpath = cp.get('callback_logdetail', "log_path", fallback="/var/log/ansible")
opts, args = parse_args(args) 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') if opts.list_pb or opts.list_all_pb:
msg = search_logs(opts, logfiles) for r,d,f in os.walk(logpath):
if msg: for file in f:
print(pb_name) if file.endswith('.info'):
print(msg) 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__": if __name__ == "__main__":