fabric
Fabric是一个基于Python(2.5-2.7)的库和命令行工具,用来提高基于SSH的应用部署和系统管理效率。稍微了解Python的人都知道,实际上它只节省了数行 if name == “main” 这样的惯例代码而已。Fabric 的设计目的更是为了使用它自己的 API,包括执行 Shell 命令、传送文件等函数(或操作)接口。
命令使用
fab [options] [:arg1,arg2=val2,host=foo,hosts=’h1;h2’,…],常用的参数有:
-l,显示定义好的任务函数名;
-f,指定fab入口文件,默认入口文件名为fabfile.py;
-g,指定网关设备,比如堡垒机环境,填写堡垒机IP即可;
-H,指定目标主机,多台主机用’,’号分隔;
-P,以异步并行方式运行多个主机任务,默认为串行运行;
-R,指定role(角色),以角色名区分不同业务组设备;
-t,设置设备连接超时时间;
-T,设置远程主机命令执行超时时间;
-w,当命令执行失败,发出警告,而非默认终止任务
全局属性的设定
env.hosts:定义多个目标主机,用IP或者主机名的列表,env.hosts=[“192.168.0.1”,”192.168.0.2”]
env.user:定义用户名,env.user = “root”
env.port:定义端口,env.port=22
env.password:定义密码,env.password = ‘1111’
env.passwords:定义多台主机的用户名、IP地址、端口、密码。
env.passwords={
“[email protected]:22” : “1111”,
“[email protected]:22” : “1111”,
}
env.gateway:定义网关,env.gateway=”192.168.0.1”
env.roledefs:定义角色分组
env.roledefs={
“webserver”:[“192.168.0.1”],
“dbserver”:[“192.168.0.2”]
}
fabfile编写
from fabric.api import *
env.user = "root"
env.hosts=["192.168.0.1","192.168.0.2"]
env.passwords={
"[email protected]:22" : "1111",
"[email protected]:22" : "1111",
}
nv.roledefs={
"webserver":["192.168.0.1"],
"dbserver":["192.168.0.2"]
}
@task
def show():
run("hostname")
@taskbr/>@roles("webserver")
def show_web_port():
run("netstate -tnulp | grep 80")
@taskbr/>@roles("wdbserver")
def show_db_port():
run("netstate -tnulp | grep 3306")
fab -f fabfile.py -l //查看有多少个任务
fab -f fabfiel.py show // 运行show这个任务(所有主机)
fab -f fabfiel.py show_web_port // 运行show_web_port这个任务(按角色分配的主机运行)
fab -f fabfiel.py show_db_port // 运行show_db_port这个任务(按角色分配的主机运行)
常用API
Fabric提供了一组简单但功能强大的fabric.api命令集,简单地调用这样API就能完成大部分应用场景需求,Fabric支持常用的方法及说明如下:
local,执行本地命令,如local:(‘uname -s’);
lcd,切换本地目录,如lcd:(‘/home’);
cd,切换远程目录,如cd:(‘/data/logs/’);
run,执行远程命令,如:run(‘free -m’)
sudo,sudo方式执行远程命令,如:sudo(‘/etc/init.d/httpd start’);
put,上传本地文件到远程主机,如:put(‘/home/user.info’,’/data/user.info’);
get,从远程主机下载文件到本地,如:get(‘/home/user.info’,’/data/user.info’);
prompt,获得用户输入信息,如:prompt(‘please input user password:’);
confirm,获得提示信息确认,如:confirm(‘Test failed,Continue[Y/N]’);
reboot,重启远程主机,如reboot();
@task,函数修饰符,标识符的函数为fab可调用,非标记对fab不可见,纯业务逻辑;
@runs_once,函数修饰符,标识符的函数只会执行一次,不受多台主机影响;
@roles(角色)
@hosts(主机1,主机2)
@paralles 并行装饰器