Fabric是一个Python实现的命令行工具,通过它可以在本地执行远程脚本而无需手动SSH登录到服务器上。

安装

Fabric的安装很简单,

pip install fabric

使用

Fabric脚本是纯粹的Python代码,一般来讲我们需要定义一个fabfile.py文件,在这个py文件中实现脚本功能,而后在命令行下通过fab命令来执行我们预定义的脚本。

执行普通函数

在fabfile.py中定义如下函数,

def hello(name, msg):
    print '{name} say {msg}'.format(name=name, msg=msg)

在命令行下执行,

# ":"用于分隔函数名称与参数列表、","用于分隔不同参数、"\""用于处理参数值包含空格的情况
fab hello:name=foobar,msg="hello world"

执行本地脚本

Fabric除了可以执行普通的Python函数外,对执行本地shell命令也进行了封装,

def ls():
    with lcd('/'):
        local('ls -lht')

执行远程脚本

用于远程执行命令的脚本与本地脚本之间的区别在于Fabric对两种场景封装了不同的函数,如cd与lcd,local与run等。

def ls():
    with cd('/'):
        run('ls -lht')

除了使用的命令不同之外,需要在远程执行的脚本还需要指定服务器信息,

@host('remote')
def ls():
    with cd('/'):
        run('ls -lht')

通过在host里面添加多个机器信息,fabric可以在将脚本在多个机器上进行执行,

@host('remote1', 'remote2')
def ls():
    pass

更近一步可以用role来对机器进行分组,

env.roledefs = {
    'db': ['db1', 'db2'],
    'web': ['web1', 'web2', 'web3']
}

@role('db')
def migrate():
    pass

@role('web')
def update():
    pass

上述脚本可以在命令行中通过fab migrate update执行,不过Fabric提供了一个便利的execute函数,让我们可以在fabfile.py中控制不同任务的执行,


def deploy():
    execute(migrate)
    execute(update)

在fabfile.py中添加deploy函数后,在命令行中就可以直接执行fab deploy。

指定非默认fabfile.py

fab命令默认会去找fabfile.py,这个默认行为可以通过命令行或是配置文件进行修改。

在命令行下通过-f参数可以强制指定文件,

fab -f fab_task1.py
fab -f fab_task2.py

在配置文件中修改,可以修改 ~/.fabricrc,在其中添加,

fabfile = fab_task1.py

在fabfile目录中定义任务

Fabric查找具体task任务时是通过import fabfile模块实现的,所以我们也可以通过定义一个名为fabfile的package,将不同任务拆分成到该package下的不同文件中去。在fabfile/__init__.py中import需要对外暴露的task就好。

上面两种指定非默认fabfile.py的方式可以用来拆分不同的部署任务,让这些脚本更容易维护。

总结

相比其它工具,Fabric最大的优点可能就是其脚本是用Python实现的,省却了学习其它语言的烦恼。此外,Fabric提供的功能也比较强大,可以让那些不那么自动化的脚本任务自动化起来。

参考