Fabric python的发布部署好帮手工具

原创
2015/06/24 00:00
阅读数 758

Fabric是一个Python库和命令行工具,旨在为应用部署和系统管理任务的SSH的流水线式操作,使之更加高效和方便。Fabric提供了一套基本的执行本地和远程shell命令、上传和下载文件的操作,包括一些辅助函数,例如驱动正在运行的用户输入或者放弃执行。

Fabric通过把大量频繁使用的SSH操作写入到一个脚本中(fabric.py),来远程执行一些应用部署或者系统维护的任务。Fabric是类似paramiko的一个库,是对paramiko的再次封装,所以比使用paramiko更简单。

Fabric的优点:

1. 角色定义

2. 代码易读

3. 封装了本地、远程操作

4. 参数灵活,能偶动态指定host/role等,还有并发执行(基于multiprocessing)

5. 完整的日志输出

安装Fabric


Fabric的安装很简单,可以直接使用pip或者easy_install安装到当前Python环境中,或者下载最新的源码使用"python setup.py xxx"的方式来安装:

#pip install fabric

使用Fabric

1 Fabric通过命令行工具fab来执行定义在fabfile.py中的任务


常用的配置和函数如下

1. 常用的fab命令选项和参数:

-l    显示可用的task

-H    指定host,多个host用逗号分开

-R    指定role,多个role用逗号分开

-P    并发数,默认是串行

-w    warn_only,默认为遇到异常直接放弃执行并退出

-f    指定入口文件,fab默认入口文件是:fabfile.py

例子1:设置默认要求的文件名

fabfile.py

def hello():

    print("Hello world!")

$cd 到fabfile.py目录

$fab hello

Hello world!

Done


例子2:指定自定义的文件名

test.py

def hello():

    print("Hello world!")

$cd 到test.py目录

$fab -f test.py hello

Hello world!

Done

2 任务函数 Fabric中的任务就是一个个Python函数


示例:

from fabric.api import run

def host_type():

   run('uname -s')


3.1 任务的参数(函数参数)

方式1

def hello(name="world"):

    print("Hello %s!" % name)

$fab hello:name=xyl

Hello xyl

Done


方式2

$fab hello:xy

Hello xy

Done


3.2 多个参数(其实就是函数的位置参数和名称参数问题)

def new_user(username, admin='no', comment="No comment provided"):
    print("New User (%s): %s" % (username, comment))
    pass

1:

$fab -f test.py new_user:xy

New User (xy): No comment provided


Done.

2:

$fab -f test.py new_user:username=xyl

New User (xy): No comment provided

Done

3:

$fab -f test.py new_user:’xy',’yes','hello world'

New User (xy): hello world

Done.

4:

$ fab -f test.py new_user:'xy',comment="hello world",'yes'

New User (xyl): hello world

yes

Done


执行本地命令:

from fabric.api import local

def prepare_deploy():

    local("./manage.py test my_app)#注意文件路径这种是相对于当前文件路径写法

    local("git add -p && git commit")
    local("git push")


组织代码

from fabric.api import local

def test():
    local("./manage.py test my_app")

def commit():
    local("git add -p && git commit")

def push():
    local("git push")

def prepare_deploy():
    test()
    commit()
    push()


出错时的处理

1:

遇到出错时,自动停止执行下面的语句

2:

处理出错的情况

from __future__ import with_statement
from fabric.api import local, settings, abort
from fabric.contrib.console import confirm

def test():
    with settings(warn_only=True):
        result = local('./manage.py test my_app', capture=True)
    if result.failed and not confirm("Tests failed. Continue anyway?"):
        abort("Aborting at user request.")

[...]


链接:

默认是本地,执行下面的命令默认在本机上

def deploy():
    code_dir = '/srv/django/myproject'
    with cd(code_dir):
        run("git pull")

        run("touch app.wsgi")



cd  命令表示执行远程的,代替lcd(这个表示本机)

run 代表远程执行的命令,用来代替local()方法


由于这个文件并未指定远程主机,所以默认是ssh 本机主机名@local :port



远程链接:

def deploy():
    code_dir = '/srv/django/myproject'
    with settings(warn_only=True):

        if run("test -d %s" % code_dir).failed:

            run("git clone user@vcshost:/path/to/repo/.git %s" % code_dir)#执行这个时候是可以进行输入密码的,在下面的输出地方

    with cd(code_dir):
        run("git pull")
        run("touch app.wsgi")


这是输出:


$ fab deploy
No hosts found. Please specify (single) host string for connection: my_server
[my_server] run: test -d /srv/django/myproject

Warning: run() encountered an error (return code 1) while executing 'test -d /srv/django/myproject'

[my_server] run: git clone user@vcshost:/path/to/repo/.git /srv/django/myproject

[my_server] out: Cloning into /srv/django/myproject...

[my_server] out: Password: <enter password>这地方可以输入我们的密码

[my_server] out: remote: Counting objects: 6698, done.
[my_server] out: remote: Compressing objects: 100% (2237/2237), done.
[my_server] out: remote: Total 6698 (delta 4633), reused 6414 (delta 4412)
[my_server] out: Receiving objects: 100% (6698/6698), 1.28 MiB, done.
[my_server] out: Resolving deltas: 100% (4633/4633), done.
[my_server] out:
[my_server] run: git pull
[my_server] out: Already up-to-date.
[my_server] out:
[my_server] run: touch app.wsgi

Done.


链接之前,预先定义参数:


from __future__ import with_statement
from fabric.api import *
from fabric.contrib.console import confirm

env.hosts = ['my_server]  #这是全局的,表示下面的命令都是在my_server主机上执行 my_server可是localhost,或ip地址

#这是一个列表,如果是[localhost,192.168.2.3]那就会执行test两遍


def test():

    do_test_stuff()


展开阅读全文
打赏
0
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部