用fabric实现自动化部署(二)(自动化部署详细介绍)

前情提要

  • 上一节讲解了如何配置fabric环境,以及写了一个简单的demo
  • 这一节主要讲解用fabric实现django项目自动化部署的实现,其它项目只需要加上自己的理解修改一下就可以了

django项目部署流程

  • 自动化部署实际上就是模拟一遍人工部署的流程而已,所以我们需要先了解一个django项目部署的流程
  • 项目在经过测试后觉得没有问题,需要将代码中的develop环境改成product环境,此时django服务器自带的图片渲染功能失效,需要安装nginx服务以达成负载均衡和图片服务的作用
  • 服务器安装好nginx,但是很明显服务器上什么都没有,因此需要首先确保服务器的环境(python版本、pip、数据库等)和本地环境保持一致
  • 环境配置好了,但是代码不在服务器上,此时需要使用git将远程仓库的代码clone到服务器上
  • 代码有了,但是运行程序所需的依赖没有,此时使用命令pip install -r requirements.txt来安装依赖
  • 依赖弄好了,数据库里面表还没有创建,输入命令python manage.py migrate来创建表
  • 表有了,但是静态文件没有收集,需要使用命令python manage.py collectstatic来收集静态文件,收集后的静态文件目录需要在nginx中进行配置,否则访问不到
  • 以上步骤弄好了,基本就准备完毕了,将项目后台运行即可

将思路映射为代码

  • 有了思路以后,将思路写成python程序,请自行阅读注释理解
import os

from fabric.api import (
    env, run, prefix, local, settings,
    roles, cd
)
from fabric.contrib.files import exists, upload_template
from fabric.decorators import task
from fabric.utils import abort

'''
对env进行配置,fabric运行时会自动调用env中的配置
env.roledefs是一种方便的写法,其实和键值对是等效的
'''

# 设置远程服务器,注意服务器的格式是 主机名@公网ip:22 的形式,键的名字随意
env.roledefs = {
    'myserver': ['ubuntu@49.234.220.132:22']
}

# 设置远程服务器登录密码
env.passwords = {
    'ubuntu@49.234.220.132:22': '123456'
}

# 设置远程主机名
env.HOST_NAME = 'ubuntu'

# 设置django项目工程的名字,即使用django-admin startproject命名的名字
env.PROJECT_NAME = 'project'

# 设置虚拟环境的名字,建议项目创建虚拟环境,在隔离性,可维护性上都有很大优势
env.VENV_NAME = 'project-env'

# 设置远程服务器虚拟环境所在目录,下面组成起来就是 /home/ubuntu/Django/venvs,os模块可以有效地解决跨平台的问题
env.VENVS_PATH = os.path.join('/home', env.HOST_NAME, 'Django', 'venvs')

# 设置远程服务器虚拟环境目录
env.VENV_PATH = os.path.join(env.VENVS_PATH, env.VENV_NAME)

# 设置激活虚拟环境的命令(linux版本)
env.VENV_ACTIVATE = os.path.join(env.VENV_PATH, 'bin', 'activate')

# 设置项目仓库所在路径(一般项目仓库都在虚拟环境目录下)
env.GIT_PATH = os.path.join(env.VENV_PATH, env.PROJECT_NAME)

# 设置github代码的地址,最好用ssh的地址
env.GIT_REMOTE = 'git@gitee.com:kimu/studio.git'

# 设置项目所在路径(项目在项目仓库目录下)
env.PROJECT_PATH = os.path.join(env.GIT_PATH, env.PROJECT_NAME)

def _ensure_python3():
    """
    确保python环境在服务器上已存在
    """
    with settings(warn_only=True):
        local('echo 开始确认远程服务器是否存在python3...')
        # run命令用于在远程主机上执行命令
        result = run('python3 --version')
        if result.failed:
            local('echo 远程服务器没有python3,开始在远程服务器上安装python3...')
            run('sudo apt-get install python3')

def _ensure_python3_pip():
    """
    确保python的第三方包管理库pip
    """
    with settings(warn_only=True):
        local('echo 开始确认远程服务器是否存在pip...')
        result = run('pip3 --version')
        if result.failed:
            local('echo 远程服务器不存在python3-pip,开始安装python3-pip...')
            run('sudo apt-get install python3-pip')

def _ensure_virtualenv():
    """
    确保服务器内有相对应的虚拟环境
    """
    with settings(warn_only=True):
        local('echo 开始确认远程服务器是否存在项目所需虚拟环境...')
        if not exists(env.VENV_PATH):
            local('echo 开始在远程服务器上创建虚拟环境...')
            # 先创建虚拟环境外部的文件夹
            if not exists(env.VENVS_PATH):
                run('mkdir -p %s' % env.VENVS_PATH)
            # 安装python创建虚拟环境需要的依赖
            run('pip3 install python3-venv')
            # 用虚拟环境库创建虚拟环境
            run('python3 -m venv %s' % env.VENV_PATH)

def _ensure_git_project():
    """
    确保服务器内有对应的代码,并且是最新的状态,且依赖已更新
    """
    # 在执行这段代码的时候,必须是虚拟环境已存在的情况
    with prefix('source %s' % env.VENV_ACTIVATE):
        with settings(warn_only=True):
            local('echo 开始确认远程服务器是否有最新的项目代码...')
            # 判断项目仓库是否存在
            if not exists(env.GIT_PATH):
                local('echo 项目仓库不存在,开始在远程服务器上clone项目...')
                # -C 指定clone的位置
                run('git -C %s clone %s' % (env.VENV_PATH, env.GIT_REMOTE))
            else:
                # 仓库存在,但是代码不是最新,更新即可
                local('echo 项目仓库存在,开始更新代码...')
                run('git -C %s pull' % env.GIT_PATH)
            # 项目代码确保后,更新依赖
            local('echo 开始更新项目依赖...')
            run('pip3 install -r %s' % os.path.join(env.GIT_PATH, 'requirements.txt'))

def _ensure_mysql():
    """
    确保能够完成django的数据库迁移,即在数据库中创建更新表
    """
    with prefix('source %s' % env.VENV_ACTIVATE):
        with settings(warn_only=True):
            local('echo 开始对数据库进行迁移...')
            result = run('python3 % migrate' % os.path.join(env.PROJECT_PATH, 'manage.py'))
            if result.failed:
                abort('远程服务器数据库不存在,请先创建数据库!')

def _ensure_static():
    """
    确保静态文件成功被收集,nginx需要用到它们
    """
    with prefix('source %s' % env.VENV_ACTIVATE):
        with settings(warn_only=True):
            local('echo 开始收集静态文件...')
            result = run('python3 %s collectstatic' % os.path.join(env.PROJECT_PATH, 'manage.py'))
            if result.failed:
                abort('django的静态文件路径配置有问题,请检查!')
@task
@roles('myserver')
def deploy():
    """
    自动化部署任务,task将其指定为一个远程执行的任务,roles指定在哪些服务器上执行
    """
    # 确保python3
    _ensure_python3()
    # 确保pip
    _ensure_python3_pip()
    # 确保虚拟环境已存在
    _ensure_virtualenv()
    # 以下操作都需要在激活虚拟环境的前提下执行
    # 确保代码和依赖
    _ensure_git_project()
    # 确保数据库迁移
    _ensure_mysql()
    # 确保静态文件成功被收集
    _ensure_static()
    # 所有条件都已经满足,如果nginx的配置正确,就可以正常运行项目了,这里推荐使用supervisord管理gunicorn运行
    with cd(settings.GIT_PATH):
        run('supervisorctl -c conf/supervisord.conf')
        run('restrat all')

在服务器上还需要配置什么?

  • ssh服务,为了不用输入密码就可以拉取自己github代码
  • nginx,当然也可以用fabric进行自动化配置

至此,django的自动化部署已讲解完毕,有兴趣的读者可以自己写一个简单的项目并且进行部署

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python自动化部署是使用Python编写脚本来实现应用程序的自动部署过程。通过编写脚本,可以简化和加快部署过程,提高开发效率。 Python自动化部署的具体步骤包括以下几个方面: 1. 环境准备:在部署服务器上安装必要的软件和依赖,例如Python解释器、虚拟环境管理工具、版本控制工具等。 2. 代码管理:使用版本控制工具(如Git)管理代码,并确保代码与部署服务器上的代码保持同步。 3. 配置管理:将应用程序的配置信息(例如数据库连接、环境变量等)存储在配置文件中,并在部署过程中自动加载。 4. 虚拟环境管理:使用虚拟环境管理工具(如venv、virtualenv)创建独立的Python环境,以隔离不同应用程序之间的依赖关系。 5. 依赖管理:通过使用依赖管理工具(如pip、conda)安装和管理应用程序所需的第三方库和模块。 6. 构建和打包:根据需求,将应用程序打包成可执行文件、Docker镜像或其他形式的发布包。 7. 部署脚本编写:编写Python脚本,实现自动化部署的各个步骤,包括下载代码、安装依赖、配置环境等。 8. 自动化部署工具:使用自动化部署工具(如Fabric、Ansible、SaltStack)执行部署脚本,并提供一些额外功能,如批量部署部署回滚等。 通过Python自动化部署,可以简化部署过程,减少人工操作和错误,提高部署效率和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值