业务监控是运维体系中最重要的环节,是保证业务服务质量的关键手段,python在监控方面提供了大量的第三方工具,可以帮助我们快速、有效的开发企业级服务监控平台
一、文件内容差异对比方法
difflib作为python的标准库模块,无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的HTML文档,与linux下的diff命令相似。我们可以使用difflib对比代码、配置文件的差别,在版本控制方面是非常有用。Python2.3或更高版本默认自带difflib模块,无需额外安装
两个字符串的差异对比
import difflib
# 定义字符串1
text1 = """text1:
This module provide classes and functions for comparing sequences.
including HTML and context and unifed diffs.
difflib document v1.0
add string
"""
text1_lines = text1.splitlines() # 以行进行分割,以便进行对比
# 定义字符串2
text2 = """text2:
This module provide classes and functions for comparing sequences.
including HTML and context and unifed diffs.
difflib document v2.0
add string
"""
text2_lines = text2.splitlines()
d = difflib.Differ() # 创建Differ()对象
diff = d.compare(text1_lines,text2_lines) # 采用compare方法对字符串进行比较
print('\n'.join(list(diff)))
采用Differ()类对两个字符进行比较,另外difflib
的SequenceMacher()类支持任意类型序列的比较,HtmlDiff()类支持将比较输出为HTML格式
生成美观的对比HTML格式文档
采用HtmlDiff()类的make_file()方法就可以生成美观的HTML文档,对上米昂代码进行修改
d = dofflib.Differ()
diff = d.compare(test1_lines,text2_lines)
替换成
d = difflib.HtmlDiff()
print(d.make_file(text1_lines),text2_lines)
对比nginx配置文件差异
当我们维护多个Nginx配置时,时常会对比不同版本配置文件的差异,使运维人员更加清晰的了解不同版本迭代后的更新项,实现的思路是读取两个需对比的配置文件,再以换行作为分隔符,调用difflib.HtmlDiff()生成HTML格式的差异文档。
#! /usr/bin/bash
import difflib
import sys
try:
textfile1 = sys.argv[1] # 第一个配置文件参数路径
textfile2 = sys.argv[2] # 第二个配置文件参数路径
except Exception as e:
print("Error:"+str(e))
print("Usage:simle3.py filename1 filename2")
sys.exit()
def readfile(filename): # 文件读取分隔函数
try:
fileHandle = open (filename,'rb')
text=fileHandle.read().splitlines() #读取后以进行分隔
fileHandle.close()
return text
except IOError as error:
print("Read file Error:"+str(error))
sys.exit()
if textfile1==""or textfile2=="":
print("Usage:simple3.py filename1 filename2")
text1_lines = readfile(textfile1) # 调用readfile函数,获取分隔后的字符串
text2_lines = readfile(textfile2)
d = difflib.HtmlDiff() # 创建HtmlDiff()类对象
print("d.make_file(text1_line,text2_lines)") #通过make_file方法输出HTML格式的对比结果
文件与目录差异对比方法
当我们进行代码审计或效验备份结果时,往往需要检查原始与目标目录的文件一致性,Python的标准库已经自带了满足此需求的模块filecmp。filecmp可以实现文件,目录、遍历子目录的差异对比功能。比如报告中输出目标目录比原始多出的文件或子目录,及时文件同名也会判断是否为同一个文件(内容级对比)模块自带 无需安装
filecmp提供了三个操作方法,分别为cmp(单文件对比)、cmpfiles(多文件对比)、dircmp(目录对比),
单文件对比,采用filecmp.cmp(f1,f2[,shallow])方法,比较文件名为f1和f2的文件,相同返回True,不相同返回False,shallow默认为True,意思是只根据os.stat()方法 返回的文件基本信息进行对比,比如最后访问时间、修改时间、状态改变时间等,会忽略文件内容的对比。当shallow为False时,则os.stat()与文件内容同时进行效验
dircmp提供了三个输出报告的方法:
- report(),比较当前指定目录中的内容
- report_partial_closure(),比较当前指定目录及第一级子目录中的内容
- report_full_closure(),递归比较所有指定目录的内容
import filecmp
a = ""
b = ""
dirobj = filecmp.dircmp(a,b,['test.py'])