美文网首页
使用Fabric实现部署流程自动化

使用Fabric实现部署流程自动化

作者: 码途有道 | 来源:发表于2021-03-26 19:45 被阅读0次

    一、前言

    在之前的文章中,讲述了如何使用Docker来部署Django项目,极大的减少了我们的部署难度与工作量,没有看过的同学可以通过下方链接点击查看。现在我们新部署一个项目,大致需要以下几步:

    1. 登录SSH工具或者FTP工具连接远程服务器,将项目代码上传至远程服务器
    2. 在远程服务器上通过命令安装并启动docker
    3. 使用命令构建并运行项目容器

    看起来工作量已经很少了,但是是否还能在方便一点呢?答案是能。这时我们就需要使用Fabric库了。Fabric是Python的一个远程执行Shell的库,其主要用于在本地或者远程服务器上自动化的执行Shell命令。以上部署步骤动我们完全可以通过Fabric库实现自动化。

    前面的章节:

    此处推荐下作者公众号「Code满满」和个人博客「李益的小站

    二、开发环境

    • CentOs==7
    • Docker==20.10.3
    • Docker-compose==1.25.5
    • Python==3.8
    • Fabric3==1.14.post1

    三、Fabric的使用

    Fabric1、Fabric2、Fabric3的区别

    目前Fabric库分为Fabric1Fabric2Fabric3三种。其中Fabric1Fabric2都出自一家,可以理解为都出自官网。Fabric2Fabric1的完全重写,接口和功能都有很大改动,官方推荐使用Fabric2

    Fabric3是非官网的,是之前Fabric1不支持Python3时,有人fork出来的一个分支,添加了对Python3的支持,目前已经不维护了。因为网上对于Fabric2的使用介绍较少且不是很详细,加上我们只是简单使用并非大规模深入使用Fabric,所以此处我们使用Fabric3

    安装依赖

    pip install fabric3
    

    注意:pip install fabricpip install fabric2都是安装的Fabric2

    开始使用

    在项目中创建一个名为fabfile.py的文件,内容如下:

    # -*- coding: utf-8 -*-
    
    from fabric.api import env, run, local, task, cd
    
    # ============================================================
    # 远程主机执行函数
    # ============================================================
    
    env.host = "xxx.xxx.xxx.xxx"  # 远程主机
    env.port = "22"  # 端口
    env.user = "xxxx"  # 用户名
    env.password = "xxxxxx"  # 密码
    
    
    @task
    def install_docker():
        """安装docker"""
        # docker安装官方文档 https://docs.docker.com/engine/install/centos/
        # 删除旧版本和相关依赖
        run("sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine")
        # 安装依赖
        run("sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2")
        # 配置稳定的repositories
        run("sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo")
        # 安装docker,安装完成后,可以通过 docker version 命令查看docker信息
        run("sudo yum install docker-ce docker-ce-cli containerd.io")
    
    
    @task
    def install_docker_compose():
        """安装docker-compose"""
        cd("/")
        # docker-compose官方文档 https://docs.docker.com/compose/install/
        run(
            "sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose")
        # 给docker-compose执行权限,可以通过 docker-compose --version 命令查看docker-compose信息
        run("sudo chmod +x /usr/local/bin/docker-compose")
    
    
    @task
    def start_docker():
        """启动docker"""
        # 启动docker
        # run("systemctl start docker")
        # 开机启动docker
        run("sudo systemctl enable docker")
    
    
    APP_PARENT_DIR = "/www"
    
    
    @task
    def upload_to_remote():
        """上传项目压缩包至远程主机"""
        # 删除已经存在的项目压缩包
        run("rm -f /demo.tar.gz")
        # 将项目文件夹在本地打成压缩包
        local("tar -zcvf demo.tar.gz ./demo ")
        try:
            # 切换工作目录
            cd("/")
            # 创建文件夹
            run("mkdir %s" % APP_PARENT_DIR)
        except:
            pass
        cd("/")
        # 删除旧项目代码
        run("rm -rf %s/demo" % APP_PARENT_DIR)
        # 将本地文件上传至远程主机
        put("./demo.tar.gz", "%s/demo.tar.gz" % APP_PARENT_DIR)
        # 项目压缩包解压到指定目录,此处是www目录中
        run("tar -zxvf %s/demo.tar.gz -C %s" % (APP_PARENT_DIR, APP_PARENT_DIR))
        # 删除项目压缩包
        run("rm -f %s/demo.tar.gz" % APP_PARENT_DIR)
    
    
    @task
    def run_remote():
        """远程使用docker部署正式环境的服务器"""
        # 切换工作目录
        cd("/")
        # 命令行末尾加 -d,表示在后台启动
        run("docker-compose -f %s/demo/deployment/prod/docker-compose.yml up" % APP_PARENT_DIR)
    

    上述代码有些长,我们在下面逐一介绍一下:

    • env:远程主机信息的配置对象,提供丰富的远程主机信息配置,支持同时连接多个远程主机,此处我们是连接单个远程主机

      • env.host:指向远程主机的ip
      • env.port:指向远程主机的端口,一般使用SSH连接远程主机的端口都是22
      • env.user:远程主机的SSH登录用户名
      • env.password:远程主机的SSH登录密码
    • task:可以将一个函数指定为一个任务,只有被指定为任务的函数,才能被Fabric的指令执行,可以使用fab -l来查看可执行的指令,执行指令只需要输入fab <指令名>即可,例如输入fab upload_to_remote即会执行上传项目代码至远程主机的操作

    (demo) user@B01116RQ201908004-50 demo % fab -l  
    Available commands:
    
        install_docker          安装docker
        install_docker_compose  安装docker-compose
        run_remote              远程使用docker部署正式环境的服务器
        start_docker            启动docker
        upload_to_remote        上传项目压缩包至远程主机
    (demo) user@B01116RQ201908004-50 demo % 
    
    • run:在远程主机上执行命令
    • local:与run相反,是在本地执行命令
    • cd:在远程主机上切换当前目录,cd("/")的意思是切换到远程主机的根目录

    在了解了Fabric相关模块的作用后,我们再看下我们的整个流程是怎么走的:

    1. 执行fab install_docker,会先去卸载远程主机上可能存在的旧版本docker,再安装新的docker
    2. 执行fab install_docker_compose,在远程主机上安装docker-compose
    3. 执行fab start_docker,启动docker
    4. 执行fab update_to_remote,将本地项目代码打成压缩包,上传到远程主机的指定目录,并解压
    5. 执行fab run_remote,构建项目容器并运行

    至此,我们的项目就部署完了,而我们只需要执行五个命令,比起没有使用Fabric是不是方便很多呢?这边为了方便大家理解,所以我们拆分成五步,其实完全可以合并成两步,install_dockerinstall_docker_composestart_docker可以合并为一步,一起安装dockerdocker-compose并启动dockerupdate_to_remoterun_remote可以合并为一步,上传项目代码后执行构建项目容器并运行。合并后的新的两个task如下:

    @task
    def install_docker_dcompose():
        """安装docker与docker-compose并启动docker"""
        install_docker()
        install_docker_compose()
        start_docker()
    
    
    @task
    def upload_and_run():
        """上传代码并运行"""
        upload_to_remote()
        run_remote()
    

    有的同学可能会问,既然可以合并为两步,那为什么不合并为一步呢?把所有的部署工作放在一个命令中执行也是可行的,但是我们项目后期可能会不断的迭代更新,每次迭代更新后,我们只需要更新远程主机的项目代码重新构建容器即可,不必每次都安装docker,所以合并成两步是最合适的。

    几个注意点

    关于使用Fabric,以下几点需要注意:

    1. 只有在fabfile.py的所在路径上,才能有效执行fab指令
    2. fabfile.py名称并非固定,可以修改为其他名称,但是Fabric默认只会寻找名为fabfile.py的文件来解析,如果改为其他名称,例如改为test.py,使用时需指定文件路径,如下:
    fab -f test.py upload_to_remote
    

    四、总结

    本章内容主要介绍了如何使用Fabric来实现自动化部署。使用Fabric后,我们再也不用每次部署或者项目迭代更新时,都去使用SSH工具或者FTP工具来连接远程服务器,上传项目代码,并输入冗长难记的命令来重新运行项目了。我们只需在本地的终端,例如Pycharm的终端Terminal执行我们已经写好的Fabric指令即可,非常的简洁高效!

    相关文章

      网友评论

          本文标题:使用Fabric实现部署流程自动化

          本文链接:https://www.haomeiwen.com/subject/sfmlhltx.html