使用Python Fabric实现Django项目自动化远程部署
本文介绍如何利用Python Fabric库简化Django项目的日常部署流程。通过编写fabfile脚本,自动完成从Git服务器拉取代码、执行数据库迁移到重启Web服务的完整操作,有效减少重复性人工命令输入,提升开发效率。
使用Python Fabric实现远程部署
需求描述
在多人协同开发的项目环境中,开发者几乎每天都需要将代码提交至Git服务器,随后部署至测试环境。日复一日地敲击相同的几行命令显得枯燥且低效。为解决这一问题,引入运维自动化工具显得尤为必要。本文将介绍Fabric这一工具,它能够帮助我们自动化处理繁琐重复的任务,相信你会像作者一样发现其价值。
本文项目背景
本项目基于Django框架开发。每次向Git服务器提交代码后,团队需手动将代码上传至测试服务器,并依次执行一系列Django相关的配置与运行命令。这一过程每天耗时约10多分钟,属于重复性劳动,并非程序员核心工作范畴,因此亟需优化。
解决方案
利用Python的Fabric模块,可以将自动化部署或多机操作的指令固化到脚本中,通过执行该脚本即可自动完成相关任务。
安装Fabric
注意:本地主机和目标服务器均需安装该模块。 sudo easy_install fabric
或者使用pip进行安装:
pip install fabric
编写脚本
在脚本中,local用于在本机执行命令,run用于在远程机器上执行命令。
from fabric.api import hosts, run, env, local, cd, get, lcd
from fabric.tasks import execute
env.hosts = ["fab@192.168.1.101:22", "root@192.168.1.101:22"]
env.passwords = {"fab@192.168.1.101:22": "fab", "root@192.168.1.101:22": "tofabor"}
@hosts("ktv@192.168.1.101:22")
def update():
"""更新测试服务器代码"""
with cd("/opt/project/project"): # 进入测试服务器的项目目录
run("git pull origin master") # 从git服务器的master分支下拉最新代码
run("/usr/local/bin/python2.7 /opt/project/project/manage.py makemigrations") # 这是django框架检测数据库变动的命令
run("/usr/local/bin/python2.7 /opt/project/project/manage.py migrate") # 这是django框架执行数据库变更的命令
@hosts("ktv@192.168.1.101:22")
def restart():
"""重启服务"""
execute('stop')
execute('start')
@hosts("root@192.168.1.101:22")
def start():
"""开始服务"""
with cd("/opt/project/project"):
run("supervisorctl start dev")
@hosts("ktv@192.168.1.101:22")
def stop():
"""停止服务"""
pids = run("ps -ef |grep '9001'| awk '{print $2}'")
pid_list = pids.split('\r\n')
for i in pid_list[:-2]:
run('kill -9 %s' % i) # 杀掉运行服务进程
将上述脚本保存为fabfile.py(也可命名为其他名称,但执行命令会有所不同,下文将详细说明)。
执行脚本
若脚本名称为fabfile.py,可在终端中进入该文件所在目录,输入以下命令并回车:
fab update
随后,终端会提示输入Git账号及密码。输入正确后,系统将自动从Git服务器拉取代码至测试服务器。 接着,运行以下命令以重启服务:
fab restart
若文件名为其他名称(例如ab.py),直接执行fab update或restart将会报错。此时应如何运行?
fab -f ab update fab -f ab restart
注:Fabric功能强大,本文仅列举部分基础功能。如需深入学习,请参考官方文档http://docs.fabfile.org/en/1.6/。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









