文档章节

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

山下狮子
 山下狮子
发布于 2015/06/24 00:00
字数 1156
阅读 313
收藏 5

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()


© 著作权归作者所有

山下狮子
粉丝 24
博文 115
码字总数 58167
作品 0
东城
程序员
私信 提问
Python 3 的环境下如何正确地使用 Fabric

注:标题中「Fabric」指的是 Fabric( http://www.fabfile.org ),一个 Python 社区常用的远程/本地自动化执行工具。 讲 Fabric 之前,先讲讲我的 Python 开发环境。 很久以前,那会还在用 ...

I'm TualatriX
2018/05/21
0
0
轻量级项目部署神器:Fabric

如果你搜一圈 "Fabric "关键字,你会发现 90% 的资料都是过时的,因为现在 Fabric 支持 Python3,但是它又不兼容旧版 Fabric。所以,如果你按照那些教程去操作的话根本跑不通。而这篇文章是给...

刘志军
2018/12/27
0
0
python web 部署:nginx + gunicorn + supervisor + flask

python web 部署 web开发中,各种语言争奇斗艳,web的部署方面,却没有太多的方式。简单而已,大概都是 nginx 做前端代理,中间 webservice 调用程序脚本。大概方式: nginx 不用多说,一个高...

劲风online
2015/11/06
369
0
python Fabric使用详解及示例

abric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:命令执行、文件上传、下载及完整执行日志...

super李导
2018/05/25
0
0
Jenkins 持续化部署实例

开始本篇章之前介绍一个写笔记的方法:康奈尔笔记法(新学的,很实用) 在此之前老大让它们弄一个web端更新的界面系统,本来我也打算用django+bootstrap+python实现,但是此时python和boots...

滕先生
2018/06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ThreaLocal实现原理

ThreadLocal的实现很简单 Thread内部维护一个ThreadLocalMap对象,key就是Thread对象。 set的时候会将value放入当前线程的ThreadLocalMap对象里面。 get的时候会通过当前线程ThreadLocalMap对...

Lubby
12分钟前
4
0
字符流中第一个不重复的字符

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go" 时,第一个只出现一次的字符是 "g"。当从该字符流中读出前六个字符“google" 时,第一个只...

Garphy
17分钟前
3
0
如何实现Java后端数据校验?看这篇就足够!

前言 每次我们在搭建一个开源项目的首要任务包括:项目的统一异常处理、统一结果封装以及做项目的数据校验,在前后端分离的情况下,不仅前端需要做数据校验,后端更加需要,前端主要使用一些...

code-ortaerc
21分钟前
2
0
thinkphp5.1学习过程六——连接数据库

<?phpnamespace app\index\controller;use think\Db;/** * Class Demo4 * @package app\index\controller * 连接数据库 * 1.全局配置:config/databass.php * 2.动态配...

大海yht
21分钟前
5
0
波点钱包系统开发细节

  波点钱包系统开发细节找杨生Te/V:I37-5OI6电33-I7、波点钱包系统组合开发、波点钱包系统开发时间、波点钱包软件开发、波点钱包软件组合开发   波点钱包是基于区块链技术开发的一款钱包...

ykd123
22分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部