前言
生产上一个模块会部署在很多台服务器上,虽然现在自动化部署可以把配置文件同步推送到多台服务器上,但还是不能保证所有机器上配置文件都一样,所以又整了一个脚本来检查。
实现思路
- 所有工作都是在堡垒机上进行的,首先要测试机器是否支持该操作,如果不支持后面就不用看了;先运行测试脚本,查看是否可以登录服务器,查看服务器上的文件内容;
- 开4个线程同步进行后面的比较工作,后续是每个线程的工作;
- 把同一个模块所有要比较的机器登录配置放在一个csv文件中,读取所有csv,然后一个个模块遍历;
- 从csv文件中读取同一个模块所有机器的配置文件;
- 在内存中建立一个Map,key是机器的ip,value是这台机器上所有配置文件的内容;
- 通过paramiko进入每台机器中,通过channel的方式,su到操作账号上,进行具体的指令;
代码如下
#登陆machine
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=machine.ip, port=22, username=machine.username, password=machine.password)
channel = ssh.invoke_shell()
# 切换用户
sshCmd = 'su - ' + machine.operateName
channel_exe_cmd(channel, sshCmd)
channel_exe_cmd(channel, machine.operatePassword)
# su后只能在channel中操作
def channel_exe_cmd(ChannelSSHOb, cmd, t=0.5):
ChannelSSHOb.send(cmd+"\n")
time.sleep(t)
resp = ChannelSSHOb.recv(99999)#.decode('utf-8')
print('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
print('Exec sshCmd: %s' % (cmd))
print('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
#print 'Exec Result: %s' % (resp)
return resp
- 通过cat指令读取所有配置文件的内容,通过du -b指令读取war包的大小;paramiko直接返回运行结果,包含了很多无效的内容,这里通过正则表达式来过滤;
- 依次读取所有机器上的单个配置文件,与上一台机器一行行地比较,如果不一致则进行记录;
后续
- 公司的堡垒机上只有py2.7,这里改造为py3.7的实现;
- sshUtil.py中包含了很多处理paramiko结果的正则表达式,需要进行修改,具体问题具体分析;
- 堡垒机一般不联外网,需要手动添加依赖包;