标签:
Fabric是一个Python库和命令行工具,旨在为应用部署和系统管理任务的SSH的流水线式操作,使之更加高效和方便。Fabric提供了一套基本的执行本地和远程shell命令、上传和下载文件的操作,包括一些辅助函数,例如驱动正在运行的用户输入或者放弃执行。
Fabric通过把大量频繁使用的SSH操作写入到一个脚本中(fabric.py),来远程执行一些应用部署或者系统维护的任务。Fabric是类似paramiko的一个库,是对paramiko的再次封装,所以比使用paramiko更简单。
Fabric的优点:
1. 角色定义
2. 代码易读
3. 封装了本地、远程操作
4. 参数灵活,能偶动态指定host/role等,还有并发执行(基于multiprocessing)
5. 完整的日志输出
使用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()
标签:
原文地址:http://my.oschina.net/012345678/blog/469974