产生背景:
在当前环境下,信创大行其道,很多小伙伴们遇到批量更换接入设备,录入CMDB;而更换设备的实施工程师往往又是五湖四海难免因沟通问题出现配置错误,核对基线配置发现难免是东一榔头西一棒槌,这些不合格的接入配置一但录入CMDB系统后,又要提变更,走流程熬夜加班才能进行配置,不仅伤肾更是占用宝贵的休息时间;那么怎么避免这种情况发生呢?人工复核?当接入设备几十上百后人工复核怕是杯水车薪,那么我们尝试使用Python来进行解决,仅仅只需要三四十行代码而已;
实现思路:
1 基线配置文件读取:
基线配置读取是最简单的一环,我们可以利用open函数打开,使用readlins函数进行逐行读取得到list类型对象;那么此时要注意列表元素的首尾空格的处理,以免在和设备配置对比时因空格问题导致误报,所以使用strip函数对每行的首尾进行处理,获取基线配置文件列表b;总结:open打开文件,readlins读取文件,strip处理文件,得到基线配置文件列表b;
2设备配置读取:
有了上面对基线配置文件的处理,那么我们对于设备配置文件的处理按照相同思路进行,唯一区别是我们需要检查的配置文件非常多,不能一个个指定文件名称,那么我们就需要使用os模块中listdir函数来帮我获取一个文件夹下所有的文件名,然后在按照步骤1的思路进行处理,获取设备配置文件列表d;
3 配置对比:
有了以上两个步骤后,我们可以得到基线配置文件的list对象b,和设备配置文件的list对象d;那么我们只需要对两个list对象使用set函数取出相同的部分赋予一个变量e,在拿相同的部分与基线list对象b进行取出不同的部分得到一个配置文件与基线文件的差值f并转换为list对象g;此时我们就可以针对获取到的差值g进行处理判断,使用len函数获取差值的元素数量,等于0则代表基线已刷入,大于0则代表基线缺失,我们对这部分进行输出即可完成基线配置的检查
代码:
import os,sys,time
#日期函数,获取当前年月日分秒作为文件名称,防重复文件名
def GetNowTime():
return time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))
x = GetNowTime()
#获取基线配置
with open('5310.txt','r',encoding='utf-8') as check_file:
#5310.txt为基线配置文件,使用时替换为自己的基线配置文件名称,需要和python脚本在同一个文件夹下
a = check_file.readlines()
b = []
for item in a:
item = item.strip()
b.append(item)
#配置对比函数
def check_config(Device_Configuration,baseline_configuration,config_file_name):
with open(Device_Configuration,'r',encoding='utf-8') as check_file:
c = check_file.readlines()
d = []
for item in c:
item = item.strip()
d.append(item)
e = set(d) & set(baseline_configuration)
#取出配置文件和基线相同的配置
f = set(baseline_configuration) ^ set(e)
#比对除未配置在设备的基线配置
g = list(f)
if len(g) == 0:
with open('基线配置检查正常设备' + x + '.txt','a') as report_file:
report_file.write('=========' + config_file_name + '基线检查正常=========\n')
else:
with open('基线配置检查缺失设备' + x + '.txt','a') as report_file:
report_file.write('=========' + config_file_name + '基线缺失,缺失内容如下=========\n')
for item in f:
report_file.write(item + '\n')
print(item)
file_path = 'D:\\PY工具\\配置对比\\test'
#需要检查配置的文件夹,假设你的配置文件放在 E盘 XX配置收集 文件内,路径举例:E:\\XX配置收集
for file in os.listdir(file_path):
file1 = file_path + '\\' + file
check_config(file1,b,file)