python 自动上传发布上线

HH python328,52348字数 4196阅读13分59秒阅读模式

 

前言

在公司不是每个开发人员对linux操作都相对熟练。特别是在一些公司也没有专门的运维人员。因此,在每次上线的时候基本上都是相关的程序员发布项目(如:开发组长等等)。就算是这样还是避免不了在上线时的一些误操作,或者是有时候会忘记备份等等。为了让公司的上线流程规范起来,进而开发了这小程序来满足公司的项目发布。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

程序介绍

本程序能满足你日常的项目上线更加的流程化、自动化文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

本程序是由python所编写。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

需要安装的模块如下表:文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

软件/模块 版本 备注
python 2.7.10
paramiko 1.16.0 用于ssh链接服务器
progressbar 2.3-py2.7 google的一个进度条python模块

由于考虑到有些人不愿意安装python、这边也提供了使用exe执行实现自动化上线。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

本人的计算机是win7 64bit 运行没问题。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

程序结构

本程序由4-5个目录构成(bin、conf、log、script、dist、build):文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

  • bin存放了主程序文件。
  • conf存放了配置文件。
  • log存放了运行过程中的日志文件。有两种日志文件一个是自己记录的log,还有一个是paramiko模块记录的exec_cmd_xx.log)。
  • script存放了执行远程服务器shell的命令文件(有两个一个是为了停止服务cmd,另一个是启动服务stop_server.cmd)。
  • dist如果是使用exe版就存在此目录 -> 存放执行主程序。
  • build如果是使用exe版就存在此目录 -> 存放python编译后的文件。

程序流程图

distribute_project

python上传流程图

如何使用

  • python
  1. 进入conf文件夹,打开配置文件,配置相关的设置如(主机名、端口、用户名、密码等等)
  2. 进入script文件夹,分别打开停止和开启服务的命令文件,填写你需要执行的shell命令。一个命令需要写在一行里面,可以使用“#”注释。当然如果你不需要执行命令也可以不写。
  3. 进入bin文件夹,双击py。

注意:如果你是在dos窗口下执行需要 cd 到bin文件夹下运行 python upload_distribute.py。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

  • exe
  1. 进入conf文件夹,打开配置文件,配置相关的设置如(主机名、端口、用户名、密码等等)
  2. 进入script文件夹,分别打开停止和开启服务的命令文件,填写你需要执行的shell命令。一个命令需要写在一行里面,可以使用“#”注释。当然如果你不需要执行命令也可以不写。
  3. 进入dist文件夹,双击exe执行主程序。

执行过程展示

distribute_project

python上传执行过程图

相关文件展示

  • 配置文件

这里展示了配置两个模块:easy、bee。其中easy是完整的,而bee有一部分被注释所以在运行程序,检测的时候会报错。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

[easy]
host = 192.168.137.12
port = 22
username = root
password = oracle
# 需要上传的文件
local_file = C:\Users\Administrator\Desktop\index.html
# 你需要上传的文件名和目录
remote_file = /usr/local/apache-tomcat-8.0.30/webapps/examples/index.html
# 远程永久备份目录,文件上传后会创建一份备份
remote_backup_dir = /tmp/backup/new
# 远程临时备份目录,备份原来存在的文件。用于失败自动恢复
remote_ori_backup_dir = /tmp/backup/ori
# 启动服务命令文件
start_cmd_file = ./../script/start_server.cmd
stop_cmd_file = ./../script/stop_server.cmd
 
[bee]
#host = 192.168.137.11
#port = 22
#username = root
#password = oracle
# 需要上传的文件
local_file = C:\Users\Administrator\Desktop\a.txt
# 你需要上传的文件名和目录
remote_file = /tmp/a.txt
# 远程永久备份目录,文件上传后会创建一份备份
remote_backup_dir = /tmp/backup/
# 远程临时备份目录,备份原来存在的文件。用于失败自动恢复
remote_tmp_backup_dir = /tmp/tmp_backup/
# 启动服务命令文件
stop_cmd_file = ./../script/start_server.cmd
start_cmd_file = ./../script/stop_server.cmd
  • 命令文件

1.  stop_server.cmd文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

# ip addr del 192.168.137.22/24 dev eth0
source /root/.bash_profile && /bin/bash /usr/local/apache-tomcat-8.0.30/bin/shutdown.sh

2. start_server.cmd文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

# ip addr add 192.168.137.22/24 dev eth0
# rm -rf /www/sample
# cd /www && tar -zxf /www/sample.tar.gz
source /root/.bash_profile && /bin/bash /usr/local/apache-tomcat-8.0.30/bin/startup.sh

细心的人注意到以上的shell脚本尽然 添加了 source /root/.bash_profile &&,我这样使用的原因是。使用python ssh登陆linux执行shell的时候,感觉他不会执行用户家目录下的.bash_profile程序。因此有些程序执行的路径就会不对。例如,我的系统中自带的jdk版本是:OpenJDK 1.6.0_24,而我自己的环境变量中设置的是使用 java 1.7.0_79。所以他会只用 系统自带的jdk,这样不是我所希望的。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

动脑筋的人可能会说那我在命令文件中的最开始就执行一次 source /root/.bash_profile 在后面每行命令前就不需要添加 source /root/.bash_profile && 了?很不行的告诉你,刚开始我也是这样想的,可惜在开发试验的过程中这样是不行的。所以个人感觉,他每次执行就好像是另外开启了一个session一样。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

(有知道原因的,请告诉一下为什么谢谢 :) )文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

 文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

  • 主程序

这里只展示程序的主过程:文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

if __name__=='__main__':
  try:
    # 设置日志文件
    time_str = str(time.time())
    log_file = '../log/upload_distribution_' + time_str + '.log'
    logging.basicConfig(level=logging.INFO,
                      format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                      filename=log_file,
                      filemode='w',
                      datefmt='%Y-%m-%d %X')
 
    # 定义配置文件路径
    conf_file_name = '../conf/upload_distribute.conf'
    # 选择配置文件section
    conf, section = select_section(conf_file_name)
    # 检测配置文件正确性
    check_config(conf, section)
    # 执行停止命令
    stop_cmd_file = conf.get(section, 'stop_cmd_file')
    exec_file_cmd(conf, section, stop_cmd_file)
    # 备份原文件
    backup_ori(conf, section)
    # 上传文件
    upload(conf, section)
    # 备份新上传的文件
    backup_new(conf, section)
    # 执行启动命令
    start_cmd_file = conf.get(section, 'start_cmd_file')
    exec_file_cmd(conf, section, start_cmd_file)
     
    # 监听服务是否启动成功
     
    # 实行完毕暂停
    os.system('pause')
  except Exception as e:
    print traceback.format_exc()
    __err_exit_show_msg(str(e))

小技巧

在上面我展示的执行过程是模拟发布tomcat项目上传单文件的,应为java web项目可以打包成一个war包用户上传和部署。但是如果是使用 nginx/apache 项目的总不肯能一个个文件的上传发布吧。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

这里我们以你的 nginx/apache 项目是在 /www 目录下为例来说明一下(这里说明的是全量发布):文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

  1. 你可以将你要发布项目打包,如:tar.gz
  2. 配置好配置文件。
  3. 可以在cmd 文件中,在启动服务前执行移除之前项目和解包命令如:
rm -rf /www/sample
cd /www && tar -zxf /www/sample.tar.gz
# 执行启动服务的命令.....

当然这样在你的/www目录下应该留下一个sample.tar.gz项目文件,对于本人来说是不影响的。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

在这里多啰嗦一句,如果你的项目是做了负载,当你上项目的时候可以先 down 掉一个服务器中的虚拟IP(也有可能是不虚拟IP)不让外界访问。down 掉IP的命令可以写在 stop_server.cmd 文件中,如果发布并启动服务成功你需要UP IP,UP IP的命令可以写在start_server.cmd文件中。文章源自运维生存时间-https://www.ttlsa.com/python/python-auto-publish-project/

Python源代码

python源码:distribute_project_py.tar.bz2

EXE可执行文件:distribute_project_exe.tar.bz2

 作者信息

昵称:HH

QQ:275258836

感觉本文内容不错,读后有收获?

逛逛衣服店,鼓励作者写出更好文章。

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
HH
  • 本文由 发表于 27/01/2016 11:32:54
  • 转载请务必保留本文链接:https://www.ttlsa.com/python/python-auto-publish-project/
  • distribute_project
  • python上传
评论  3  访客  3
    • 枯藤老妖
      枯藤老妖 9

      请教:做了二次开发,应该如何打包成exe?

        • HH
          HH

          @ 枯藤老妖 我使用的是py2exe

        • 大块头
          大块头 9

          感谢HH指导。用python 2.6.6 版本,执行时会报 ImportError: cannot import name AdaptiveETA 异常。本例中没有用到 AdaptiveETA 。如果遇到该异常,可以不导入。

          progressbar 模块的详细用法可参考相关例子:
          https://github.com/niltonvolpato/python-progressbar/blob/master/examples.py

        评论已关闭!