Python自动化运维和部署项目工具Fabric使用实例


Posted in Python onSeptember 18, 2016

Fabric 是使用 Python 开发的一个自动化运维和部署项目的一个好工具,可以通过 SSH 的方式与远程服务器进行自动化交互,例如将本地文件传到服务器,在服务器上执行shell 命令。

下面给出一个自动化部署 Django 项目的例子

# -*- coding: utf-8 -*-
# 文件名要保存为 fabfile.py

from __future__ import unicode_literals
from fabric.api import *

# 登录用户和主机名:
env.user = 'root'
# 如果没有设置,在需要登录的时候,fabric 会提示输入
env.password = 'youpassword'
# 如果有多个主机,fabric会自动依次部署
env.hosts = ['www.example.com']

TAR_FILE_NAME = 'deploy.tar.gz'

def pack():
  """
  定义一个pack任务, 打一个tar包
  :return:
  """
  tar_files = ['*.py', 'static/*', 'templates/*', 'vue_app/', '*/*.py', 'requirements.txt']
  exclude_files = ['fabfile.py', 'deploy/*', '*.tar.gz', '.DS_Store', '*/.DS_Store',
           '*/.*.py', '__pycache__/*']
  exclude_files = ['--exclude=\'%s\'' % t for t in exclude_files]
  local('rm -f %s' % TAR_FILE_NAME)
 
  local('tar -czvf %s %s %s' % (TAR_FILE_NAME, ' '.join(exclude_files), ' '.join(tar_files)))
  print('在当前目录创建一个打包文件: %s' % TAR_FILE_NAME)


def deploy():
  """
  定义一个部署任务
  :return:
  """
  # 先进行打包
  pack()

  # 远程服务器的临时文件
  remote_tmp_tar = '/tmp/%s' % TAR_FILE_NAME
  run('rm -f %s' % remote_tmp_tar)
  # 上传tar文件至远程服务器, local_path, remote_path
  put(TAR_FILE_NAME, remote_tmp_tar)
  # 解压
  remote_dist_base_dir = '/home/python/django_app'
  # 如果不存在, 则创建文件夹
  run('mkdir -p %s' % remote_dist_dir)

 # cd 命令将远程主机的工作目录切换到指定目录 
  with cd(remote_dist_dir):
    print('解压文件到到目录: %s' % remote_dist_dir)
    run('tar -xzvf %s' % remote_tmp_tar)
    print('安装 requirements.txt 中的依赖包')
    # 我使用的是 python3 来开发
    run('pip3 install -r requirements.txt')
    remote_settings_file = '%s/django_app/settings.py' % remote_dist_dir
    settings_file = 'deploy/settings.py' % name
    print('上传 settings.py 文件 %s' % settings_file)
    put(settings_file, remote_settings_file)

    nginx_file = 'deploy/django_app.conf'
    remote_nginx_file = '/etc/nginx/conf.d/django_app.conf'
    print('上传 nginx 配置文件 %s' % nginx_file)
    put(nginx_file, remote_nginx_file)
 
 # 在当前目录的子目录 deploy 中的 supervisor 配置文件上传至服务器
  supervisor_file = 'deploy/django_app.ini'
  remote_supervisor_file = '/etc/supervisord.d/django_app.ini'
  print('上传 supervisor 配置文件 %s' % supervisor_file)
  put(supervisor_file, remote_supervisor_file)
 
 # 重新加载 nginx 的配置文件
  run('nginx -s reload')
  run('nginx -t')
  # 删除本地的打包文件
  local('rm -f %s' % TAR_FILE_NAME)
  # 载入最新的配置文件,停止原有进程并按新的配置启动所有进程
  run('supervisorctl reload')
  # 执行 restart all,start 或者 stop fabric 都会提示错误,然后中止运行
  # 但是服务器上查看日志,supervisor 有重启
  # run('supervisorctl restart all')

执行 pack 任务

fab pack

执行 deploy 任务

fab deploy

再给大家分享一个使用Fabric进行代码的自动化部署

#coding=utf-8
from fabric.api import local, abort, settings, env, cd, run
from fabric.colors import *
from fabric.contrib.console import confirm

env.hosts = ["root@115.28.×××××"]
env.password = "×××××"


def get_git_status():
  git_status_result = local("git status", capture=True)
  if "无文件要提交,干净的工作区" not in git_status_result:
    print red("****当前分支还有文件没有提交")
    print git_status_result
    abort("****已经终止")


def local_unit_test():
  with settings(warn_only=True):
    test_result = local("python manage.py test")
    if test_result.failed:
      print test_result
      if not confirm(red("****单元测试失败,是否继续?")):
        abort("****已经终止")


def server_unit_test():
  with settings(warn_only=True):
    test_result = run("python manage.py test")
    if test_result.failed:
      print test_result
      if not confirm(red("****单元测试失败,是否继续?")):
        abort("****已经终止")


def upload_code():
  local("git push origin dev")
  print green("****代码上传成功")


def deploy_at_server():
  print green("****ssh到服务器进行下列操作")
  with cd("/var/www/××××××"):
    #print run("pwd")
    print green("****将在远程仓库下载代码")
    run("git checkout dev")
    get_git_status()
    run("git pull origin dev")
    print green("****将在服务器上运行单元测试")
    server_unit_test()
    run("service apache2 restart", pty=False)
    print green("****重启apache2成功")
    print green("********代码部署成功********")


def deploy():
  get_git_status()
  local("git checkout dev", capture=False)
  print green("****切换到dev分支")
  get_git_status()
  print green("****将开始运行单元测试")
  local_unit_test()
  print green("****单元测试完成,开始上传代码")
  upload_code()
  deploy_at_server()

fabric可以将自动化部署或者多机操作的命令固化到一个脚本里,从而减少手动的操作。上面是今天第一次接触这东西后写的,确实很实用。运行fab deploy就行了。

主要逻辑就是将本地的dev分支跑单元测试,然后提交到服务器,ssh登陆到服务器,然后pull下来,再跑单元测试,然后重启apache2。第一次写,可能比较简单,将持续改进。

Python 相关文章推荐
Python 流程控制实例代码
Sep 25 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
django使用html模板减少代码代码解析
Dec 12 Python
Python使用gRPC传输协议教程
Oct 16 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
python如何实现视频转代码视频
Jun 17 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
django将数组传递给前台模板的方法
Aug 06 Python
pytorch自定义二值化网络层方式
Jan 07 Python
django修改models重建数据库的操作
Mar 31 Python
如何在python中执行另一个py文件
Apr 30 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 #Python
打包发布Python模块的方法详解
Sep 18 #Python
在python的类中动态添加属性与生成对象
Sep 17 #Python
Python中字符串的处理技巧分享
Sep 17 #Python
Python中对象迭代与反迭代的技巧总结
Sep 17 #Python
发布你的Python模块详解
Sep 15 #Python
Python selenium 三种等待方式解读
Sep 15 #Python
You might like
用PHP连mysql和oracle数据库性能比较
2006/10/09 PHP
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
总结python中pass的作用
2019/02/27 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
对python中list的五种查找方法说明
2020/07/13 Python
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
过滤器的用法
2013/10/08 面试题
销售总经理岗位职责
2014/03/15 职场文书
企业文化理念标语
2014/06/10 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书
js 实现验证码输入框示例详解
2022/09/23 Javascript