负载均衡了A,B两台服务器win2008r2,一样的路径 D:\\IIS\\proName 放着Asp MVC4开放编译好的项目,每次团队修改bug或者添加新功能,我须要把A,B服务器的项目备份好,本机从TFS(感受仍是SVN好用点)获取最新代码,以后编译,再覆盖上服务器,操做的过程当中要注意些问题,好比说服务器项目里的log4net生成的日志文件不要压缩备份,要否则压缩文件会很大,覆盖的时候,有些文件是不能替换的,好比说web.config,由于数据库链接等一些信息是不同的,除此以外,还要作升级更新记录,以备领导查询等等linux
因此萌发搞一个程序自动化升级更新,之因此用Python,只是由于正在学习,固然另外一方面是由于须要使用SSH协议来跟远程服务器交互,Python的paramiko插件比我拿手C#的ssh.net好用多web
说说个人思路
1. 只压缩A服务器项目
2. 下载到本机解压
3. 本机TFS更新项目,编译发布
4. 对比获取服务器项目和本机发布项目的差别文件,并压缩差别文件,以及记录信息到数据库
5. 上传差别压缩包到A和B服务器,并覆盖替换shell
部分核心代码
# 压缩服务器项目
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('服务器IP', 服务器ssh端口, username='服务器用户名', password='服务器密码', timeout=4)
# paramiko ssh 远程链接window,实际上是模拟成linux,因此要用linux shell命令来操做
# 下面这个就是压缩服务器项目,而且排除掉日志文件夹
comm = 'tar -zcvf 服务器备份包路径.tar.gz --exclude=服务器项目日志文件夹路径 服务器项目路径'
stdin, stdout, stderr = client.exec_command(comm)
stdout.readlines() # 要执行这句 要否则就快速关闭了
client.close()数据库
# 下载服务器备份压缩包
t = paramiko.Transport(('服务器IP',服务器ssh端口))
t.connect(username = '服务器用户名', password = '服务器密码')
sftp = paramiko.SFTPClient.from_transport(t)
remotepath = '服务器备份压缩包路径' # 这里要用linux路径写法
localpath = '本机保存路径' # 这里要用window路径写法
sftp.get(remotepath, localpath)
t.close()服务器
# 解压备份压缩包,这里用的window的cmd命令,能够用ssh链接本机,再用linux shell命令的,只是想尝试不一样的作法而已,.tar.gz是linux特有的,window只能解压不能压缩生成
# 不能直接使用字符串,要使用占位符的形式来,也就是说不能用加号链接,我也不知道为何,估计是路径斜杠的问题,可是测试过不少种了,也不得,真心求解
cmd = '"C:/Program Files/WinRAR/WinRAR" x %s * %s\\ -y' % ('压缩包路径', '解压路径')
os.system(cmd)app
# 对比差别,比较大小或者最后修改时间,要注意的就是最后修改时间会不一样,本机win7的时间和服务器win2008r2的时间是同样的,可是看下载回来的服务器压缩包里面的文件时间,有些文件,注意不是所有文件,只是有部分而已,它的时间会提早1秒,估计是由于通过linux系统产生了异常,文件大小这个倒没有发现过异常
s1 = os.path.getsize('源文件路径') # 获取大小
t1 = datetime.fromtimestamp(os.path.getmtime('源文件路径')) # 获取最后修改时间
s2 = os.path.getsize('目标文件路径')
t2 = datetime.fromtimestamp(os.path.getmtime('目标文件路径'))
timespan = (t2 - t1).total_seconds() # 最后修改时间差别值,判断3秒内的差别
if s1 != s2 or timespan >= 3:
pass # 是差别的负载均衡
# 压缩差别,由于要用ssh上传到服务器操做,因此要linux的压缩格式.tar.gz
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('本机IP', 本机ssh端口, username='本机用户名', password='本机密码', timeout=4)
comm = 'tar -zcvf 压缩路径包路径.tar.gz 要压缩的文件夹路径'
stdin, stdout, stderr = client.exec_command(comm)
stdout.readlines() # 要执行这句 要否则就快速关闭了ssh
# 上传到服务器,这个就要循环了,由于有A B两台服务器,它们的ssh端口,登陆名,密码都是同样的
arrServer = ['服务器A_IP', '服务器B_IP']
for srv in arrServer:
t = paramiko.Transport((srv, 服务器端口))
t.connect(username = '服务器用户名', password = '服务器密码')
sftp = paramiko.SFTPClient.from_transport(t)
remotepath = '服务器保存压缩包路径' # 这里要用linux路径写法
localpath = '本机压缩包路径' # 这里要用window路径写法
sftp.put(localpath, remotepath)
t.close()学习
# 最后就是服务器解压,进行替换覆盖了
arrServer = ['服务器A_IP', '服务器B_IP']
for srv in arrServer:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(srv, 服务器端口, username = '服务器用户名', password = '服务器密码', timeout=4)
arrComm = []
# 以日期新建备份差别文件夹,用来解压差别文件
arrComm.append('mkdir 差别文件存放文件夹')
# 解压差别
arrComm.append('tar -zxvf 差别压缩包路径.tar.gz -C 差别文件存放文件夹')
# 拷贝差别
arrComm.append('cp -rf 差别文件存放文件夹 项目文件夹')
# 执行使用\n分割的多行命令
stdin, stdout, stderr = client.exec_command('\n'.join(arrComm))
stdout.readlines() # 要执行这句 要否则就快速关闭了
client.close()测试
来个效果图