Fabric自动化部署
写好代码后最烦的就是部署了,要么是用git先在本地push,再到服务器pull,重启服务;要么用scp把本地打包扔到服务器,再重启服务。都是免不了要两边操作。
然而,用Fabric写一个脚本,这些繁琐重复的工作一键就可以搞定。简单的说,Fabric就是一个可以在本地和远程执行命令的工具,通过一些简单的接口,就可以使用SSH登录到远程服务器,并执行命令。
安装
pip install fabric
or
apt-get install fabric
主要API
- run: 执行远程服务器命令
run('whoami')
result = run('ls -al')
- sudo: 以超级用户权限在远程服务器执行命令
sudo('cat /etc/passwd')
- local: 执行本地命令
local(git push)
- cd: 切换远程目录
with cd(/etc/supervisor/app.conf):
run('.....')
- lcd: 切换本地目录
- task 定义任务的装饰器
@task
def do_something():
....
- execute 执行定义的任务
execute(do_something)
- env 配置各种环境变量的字典
env.hosts = ['root@192.168.2.15']
几个重要的环境变量:
1. hosts: 远程主机地址列表
2. user: Fabric默认使用本地主机的用户名登录远程服务器
3. password: 存放用户密码,env.password = environ['password']
,这个值还是从系统环境中获取好些
4. key_filename:存放ssh-key私钥的地址,用于以公钥方式ssh登录远程服务器
5. warn_only: Fabric默认程序出错就退出,设置warn_only可以只发出警告而不退出
def exists(path):
with settings(warn_only=True):
return run('test -e %s' % path)
- setting 临时覆盖环境变量,如上所示。
- roles 定义主机角色, 可以按角色分配任务
env.roledefs.update({
'webserver': ['192.168.2.100', '192.168.2.101'],
'dbserver': ['192.168.2.110']
})
@task
@roles('webserver')
def func():
...
- get: 从远程服务器下载
- put: 向远程服务器上传
示例
接下来用一个例子说明Fabric的使用。开始之前,先在本地生成rsa公私钥, 将公钥放置到远程服务器的authorized_keys文件和git的SSH-KEY中,这样就可以免密码连接远程服务器和git。并在远程服务器上配置好Supervisor。
# coding:utf-8
from fabric.api import *
from fabric.operations import local
env.hosts = ['root@192.168.2.110']
env.key_filename = ['~/id_rsa'] # SSH-key 路径
@task
def prepare():
local("git pull")
local("git add . && git commit") # 交互输入 commit message
local("git push")
@task
def update():
with cd('~/fabric_test'): # 服务器program路径
run('git pull')
run('supervisorctl restart fabric_test')
@task
def deploy():
execute(prepare)
execute(update)
先在本地将代码提交到git服务器,再在远程服务器拉去git代码,并重启服务。
只需要一条命令: fab -f filename deploy
就可以完成部署。如果把Fabric文件命名为fabfile.py,那么可以直接使用'fab deploy'。
Comments