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
Write a Comment