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提供的功能也比较强大,可以让那些不那么自动化的脚本任务自动化起来。