文档章节

Python 自动化升级更新项目

 黄耀樑
发布于 2016/09/09 12:08
字数 1323
阅读 53
收藏 1

    负载均衡了A,B两台服务器win2008r2,同样的路径 D:\\IIS\\proName 放着Asp MVC4开放编译好的项目,每次团队修改bug或者添加新功能,我需要把A,B服务器的项目备份好,本机从TFS(感觉还是SVN好用点)获取最新代码,之后编译,再覆盖上服务器,操作的过程中要注意些问题,比如说服务器项目里的log4net生成的日志文件不要压缩备份,要不然压缩文件会很大,覆盖的时候,有些文件是不能替换的,比如说web.config,因为数据库连接等一些信息是不一样的,除此之外,还要做升级更新记录,以备领导查询等等

    所以萌发搞一个程序自动化升级更新,之所以用Python,只是因为正在学习,当然另一方面是因为需要使用SSH协议来跟远程服务器交互,Python的paramiko插件比我拿手C#的ssh.net好用多

    说说我的思路
1. 只压缩A服务器项目
2. 下载到本机解压
3. 本机TFS更新项目,编译发布
4. 对比获取服务器项目和本机发布项目的差异文件,并压缩差异文件,以及记录信息到数据库
5. 上传差异压缩包到A和B服务器,并覆盖替换

     部分核心代码
        # 压缩服务器项目
        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)

 

        #  对比差异,比较大小或者最后修改时间,要注意的就是最后修改时间会不同,本机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() # 要执行这句 要不然就快速关闭了

 

        # 上传到服务器,这个就要循环了,因为有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()

 

           来个效果图

 

 

© 著作权归作者所有

粉丝 0
博文 18
码字总数 3729
作品 0
南宁
私信 提问
官方倒计时:Python2的寿命还剩113天,逾期停止维护

作为目前最为流行的编程语言,Python 的出现让计算机编程不再是生僻的专业技能,而是常人都能学习和使用的万金油,它也是人工智能领域里最为常用的语言之一。不过在三个月内,Python 或许要经...

机器之心在发稿时对倒计时网站的截图。
09/10
0
0
Python 3 的环境下如何正确地使用 Fabric

注:标题中「Fabric」指的是 Fabric( http://www.fabfile.org ),一个 Python 社区常用的远程/本地自动化执行工具。 讲 Fabric 之前,先讲讲我的 Python 开发环境。 很久以前,那会还在用 ...

I'm TualatriX
2018/05/21
0
0
书籍:掌握Python脚本系统管理 Mastering Python Scripting for System Administrators - 2019.pdf

简介 主要特点 了解如何解决系统管理员的问题并自动执行日常活动 学习处理正则表达式,网络管理 构建GUI,网络抓取和数据库管理,包括数据分析 Python随着时间的推移不断发展,并扩展了与每个...

python人工智能命理
04/08
0
0
[Python] Python学习资料

更新中... Python 基础 Python 进阶 数据结构 深入理解 常用包

DexterLei
2017/12/24
0
0
月薪5千加班到凌晨,月薪5万5点下班,差别究竟在哪里?

说起程序员人们的第一印象就是工资高、加班凶、话少钱多头发少。再加上现在科技互联网公司太吃香,BAT、华为和小米等公司程序员加班情况被广泛传播,程序员用生命在敲代码的印象刻在了很多人...

技术小能手
2018/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据最核心的关键技术——32个算法,记得收藏!

奥地利符号计算研究所的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结...

大数据金罗
6分钟前
2
0
spring boot The server time zone value 'PDT' is unrecognized or represents more than one time zone.

spring boot启动项目时,发现数据库抛如下错误 Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'PDT' is unrecognized or represen......

huangkejie
26分钟前
1
0
正则表达式匹配

请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。模式中的字符 '.' 表示任意一个字符,而 '*' 表示它前面的字符可以出现任意次(包含 0 次)。 在本题中,匹配是指字符串的所有字符匹配...

Garphy
今天
7
0
Laravel 5.1的多路由文件的配置

默认的路由配置文件只有一个, \app\Http\routes.php。 在同一个文件中写路由容易起冲突,文件会越来越大,就需要定义多个路由文件。 找到加载\app\Http\routes.php的文件, 打开\app\Provid...

mdoo
今天
5
0
Hibernate 5 开始使用指南前言

同时在面向对象软件和关系型数据库进行工作,可能会非常复杂和费时。数据在对象和数据库之间可能会不一致,然后导致开发成本会非常高。 Hibernate 是一个针对 Java 环境的对象关系映射(Obj...

honeymoose
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部