http://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html

Fabric 是一个 Python (2.5-2.7) 的库和命令行工具,用来提高基于 SSH 的应用部署和系统管理效率。

更具体地说,Fabric 是:

一个让你通过 命令行 执行 无参数 Python 函数 的工具;

一个让通过 SSH 执行 Shell 命令更加 容易 、 更符合 Python 风格 的命令库(建立于一个更低层次的库)。

自然而然地,大部分用户把这两件事结合着用,使用 Fabric 来写和执行 Python 函数或 task ,以实现与远程服务器的自动化交互。

参考廖雪峰老师的文章:https://www.liaoxuefeng.com/article/001373892650475818672edc83c4c978a45195eab8dc753000

简单实现部署脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime
from fabric.api import *


# 登录用户和主机名:
env.user = 'root'
env.hosts = ['xx.xx.xxx.xx'] # 如果有多个主机,fabric会自动依次部署
env.remote_output = '/www/demo'

def deploy():
    print("---准备上传")
    tar_files = ['public/*']
    #run('pwd') #是远程服务器质性的命令
    local('rm -f example.tar.gz')
    #打包
    local('tar -czvf example.tar.gz --exclude=\'*.tar.gz\' --exclude=\'fabfile.py\' %s' % ' '.join(tar_files))
    #部署到远程
    #删除远程的临时文件
    remote_tmp_tar = '/www/demo/example.tar.gz'
    remote_tmp_doc = '/www/demo'
    run('rm -f %s' % remote_tmp_tar)
    put('example.tar.gz',remote_tmp_tar)
    #解压
    with cd(remote_tmp_doc):
        run('tar -xzvf %s -C ./' % remote_tmp_tar)

比较有意思的是fabric也提供了一些工具,如rsync实现web目录的同步,本质是rsync命令的封装。

使用举例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from fabric.api import env, local, task, settings
from fabric.contrib.project import rsync_project
from fabric.colors import *

# 登录用户和主机名:
env.user = 'root'
env.hosts = ['xx.xx.xx.xxx'] # 如果有多个主机,fabric会自动依次部署

#(mv不能实现目录覆盖 https://unix.stackexchange.com/questions/127712/merging-folders-with-mv )
def prepare():
    print green('提交到github.....')
    local("git pull") 
    local("git add .") 
    local("git add -p && git commit -m 'fabric commit'")
    local("git push")
    local('rm -rf public')
    local('hugo')

def rsync():
    print green('同步到远程服务器....')
    #https://fabric-chs.readthedocs.io/zh_CN/chs/api/contrib/project.html
    rsync_project(local_dir="public/*", remote_dir='/www/wwwroot/blog_tyrad_cc', delete='true')

def deploy():
    prepare()
    rsync