怎么用Python的Fabric脚本实现Django的多服务器一键部署?

梦雪同学_2231

梦雪同学_2231

2026-09-03

1014人浏览

原创

Fabric3是当前Django多机部署的可行选择,因其将已停止维护的Fabric 1.14.0成功移植至Python 3.7+,保留env.hosts、run()、sudo()等直觉式API,兼容旧有Django部署脚本,避免Fabric 2.x的Connection对象不兼容问题。

怎么用python的fabric脚本实现django的多服务器一键部署?

为什么 fabric3 是当前 Django 多机部署的可行选择

Fabric 2.x 彻底重写了 API,和老项目里常见的 fab 命令、env.hosts、@task 装饰器不兼容;而原始 Fabric 1.x 已停止维护,PyPI 上的 fabric 包(v2+)默认走 invoke + fabric2 模式,无法直接跑旧式 Django 部署脚本。实际能用、有维护、支持 Python 3.7+ 且保留类 Fabric 1 风格的,只有社区延续分支 fabric3——它只是把 Fabric 1.14.0 移植到 Python 3,并修复了部分 SSH 连接和 sudo 行为问题。

如果你的部署逻辑依赖 env.hosts、run()、sudo()、put() 这套直觉式写法,别强上 fabric2,直接装:

pip install fabric3

否则后续所有任务都会报 AttributeError: 'Connection' object has no attribute 'run' 或 No module named 'fabric.api'。

如何组织 fabfile.py 支持多环境(staging / production)和多角色(web / db)

Django 部署常需区分服务器角色(比如 web 节点跑 Gunicorn,db 节点只配 PostgreSQL),同时避免 staging 和 production 共用同一组 host 导致误操作。Fabric 1 / fabric3 的 env 全局对象仍是最轻量的配置载体,但必须配合 @hosts 或 @roles 显式约束执行范围。

推荐结构如下:

from fabric.api import env, task, roles, runs_once
from fabric.contrib.project import rsync_project
<h1>全局基础配置(不随环境变)</h1><p>env.user = 'deploy'
env.use_ssh_config = True  # 读 ~/.ssh/config,方便管理别名和密钥路径</p><h1>环境分组(按需调用 fab staging deploy 或 fab production deploy)</h1><p>@task
def staging():
env.roledefs = {
'web': ['web-stg.example.com'],
'db': ['db-stg.example.com'],
}
env.project_root = '/var/www/myproject-stg'
env.git_branch = 'develop'</p><p>@task<br>
def production():
env.roledefs = {
'web': ['web1.prod.example.com', 'web2.prod.example.com'],
'db': ['db-main.prod.example.com'],
}
env.project_root = '/var/www/myproject-prod'
env.git_branch = 'main'</p><h1>部署主任务,用 @roles 限定只在 web 节点执行</h1><p>@task
@roles('web')
def deploy():
run(f'cd {env.project_root} && git pull origin {env.git_branch}')
run(f'cd {env.project_root} && pip install -r requirements.txt')
run(f'cd {env.project_root} && python manage.py migrate --noinput')
run(f'cd {env.project_root} && python manage.py collectstatic --noinput')
sudo('systemctl restart gunicorn@myproject')</p>

注意:这里没写 db 相关操作(如 dump/restore),因为 @roles('web') 会自动跳过 db 主机;若需在 db 节点运行命令,单独写个 @roles('db') 任务即可。

常见失败点:sudo 权限、虚拟环境路径、Python 解释器错位

Fabric 默认用系统 Python 执行命令,但 Django 项目几乎都跑在 virtualenv 里。直接 run('python manage.py migrate') 很可能报 ModuleNotFoundError: No module named 'django'——因为 python 指向的是 /usr/bin/python,而非你 virtualenv 里的 venv/bin/python。

Biopython
Biopython

全面的分子生物学工具集。适用于序列操作、文件解析(FASTA/GenBank/PDB)、系统发育分析,以及通过 Bio.Entrez 以编程方式访问 NCBI/

下载

必须显式指定解释器路径或激活环境:

  • 用完整路径最稳:run('/var/www/myproject-prod/venv/bin/python manage.py migrate')
  • 或先 source(注意 shell 类型):run('source /var/www/myproject-prod/venv/bin/activate && python manage.py migrate'),但某些 shell(如 dash)不支持 source,得改用 .
  • sudo() 默认不继承用户环境变量,若 venv/bin/activate 依赖 $PATH,得加 shell=False 或手动设 path 参数
  • 数据库迁移若涉及 sudo -u postgres,要确认目标用户有权限访问项目目录,否则 Permission denied 会静默失败

rsync_project 替代 scp,但要注意 exclude 规则写法

rsync_project 比手写 put() 更适合整站同步(尤其是 static/media),但它底层调用 rsync,exclude 规则必须符合 rsync 语法,不是 glob 也不是正则。

例如想排除本地 venv/、logs/ 和 .git/,但保留远程已有的 media/(通常挂载为独立卷):

rsync_project(
    remote_dir=env.project_root,
    local_dir='./',
    exclude=('venv', 'logs', '.git', 'fabfile.py'),
    delete=True,
)

注意:exclude 是元组,每项是字符串,不能写成 'venv/'(末尾斜杠会被忽略),也不能用 **/venv;delete=True 会删掉远程没有但本地有的文件,上线前务必确认。

fabric3 的多机部署链条很短,真正卡住人的从来不是“怎么写”,而是“哪台机器上哪个环境变量没生效”“sudo 切用户后 PATH 断了”“rsync 把 .env 文件同步过去覆盖了生产密钥”。把这些路径、权限、作用域写死在 fabfile.py 里,比追求抽象更可靠。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python django python脚本

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1931

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5444

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1869

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

33117

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3887

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3907

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1283

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

3023

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程