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中的__new__()方法的使用
Apr 09 Python
Python生成数字图片代码分享
Oct 31 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
python编写简单端口扫描器
Sep 04 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
新手学python应该下哪个版本
Jun 11 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
基于Python实现粒子滤波效果
Dec 01 Python
详解Python中的for循环
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
BBS(php & mysql)完整版(四)
2006/10/09 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP运行模式汇总
2016/11/06 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
python生成随机验证码(中文验证码)示例
2014/04/03 Python
python中类的属性和方法介绍
2018/11/27 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
python中tab键是什么意思
2020/06/18 Python
Python 如何查找特定类型文件
2020/08/17 Python
Python实现像awk一样分割字符串
2020/09/15 Python
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
军训自我鉴定
2014/01/22 职场文书
颁奖典礼主持词
2014/03/25 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
大学新闻系求职信
2014/06/03 职场文书
相亲大会策划方案
2014/06/05 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang