python fabric详解

Posted by xue on May 6, 2017

简介

Fabirc是基于python实现的SSH命令行工具,非常适合应用的自动化部署,或者执行系统管理任务。

简单的例子:

root@openstack:~# cat fabfile.py
def hello():
    print 'hello world!'
 
root@openstack:~# fab hello
hello world!

Done.

这个fab简单地导入了fabfile,并执行定义的hello函数。

fab作为Fabric程序的命令行入口,提供了丰富的参数调用,命令格式如下:

root@openstack:~# fab --help
Usage: fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...

各参数含义如下:

参数项 含义
-l 显示可用任务函数名
-f 指定fab入口文件,默认为fabfile.py
-g 指定网关(中转设备),比如堡垒机环境,填写堡垒机IP即可
-H 指定目标主机,多台主机用“,”分隔
-P 以异步并行方式运行多台主机任务,默认为串行运行
-R 指定角色(Role)
-t 设置设备连接超时时间
-T 设置远程主机命令执行超时时间
-w 当命令执行失败,发出告警,而非默认终止任务

实例分析

#自定义fabfile文件如下
#/root/fab.py
from fabric.api import *

#local_node和remote_node都可以为多个
local_node = ['127.0.0.1']
remote_node = ['10.116.97.30']
#定义local和remote角色
env.roledefs['local'] = local_node
env.roledefs['remote'] = remote_node
#定义用户名
env.user = 'root'
#定义密码
env.password = 'xxx'

#不同的角色执行不同的命令
@roles('local')
def test_local():
    #run命令在roles为local的主机上执行命令"hostname"
    run("hostname")

@roles('remote')
def test_remote():
    run("hostname")

在python中调用:

root@openstack:~# python
Python 2.7.6 (default, Oct 26 2016, 20:30:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from fabric.api import execute
>>> import sys
>>> sys.path.append('/root')
>>> import fab
>>> execute(fab.test_local)
[127.0.0.1] Executing task 'test_local'
[127.0.0.1] run: hostname
[127.0.0.1] out: openstack
[127.0.0.1] out:

{'127.0.0.1': None}

>>> execute(fab.test_remote)
[10.116.97.30] Executing task 'test_remote'
[10.116.97.30] run: hostname
[10.116.97.30] out: openstack
[10.116.97.30] out:

{'10.116.97.30': None}

fabfile全局属性设定

env对象的作用是定义fabfile的全局设定,各属性说明如下:

属性 含义
env.host 定义目标主机,以python的列表表示,如env.host=[‘xx.xx.xx.xx’,’xx.xx.xx.xx’]
env.exclude_hosts 排除指定主机,以python的列表表示
env.port 定义目标主机端口,默认为22
env.user 定义用户名
env.password 定义密码
env.passwords 与password功能一样,区别在于不同主机配置不同密码的应用情景,配置此项的时候需要配置用户、主机、端口等信息,如:env.passwords = {‘root@xx.xx.xx.xx:22’: ‘123’, ‘root@xx.xx.xx.xx’:’234’}
env.getway 定义网关
env.deploy_release_dir 自定义全局变量
env.roledefs 定义角色分组

常用的API

Fabric支持常用的方法及说明如下:

方法 说明  
local 执行本地命令,如:local(‘hostname’)  
lcd 切换本地目录,lcd(‘/root’)  
cd 切换远程目录,cd(‘cd’)  
run 执行远程命令,如:run(‘hostname’)  
sudo sudo执行远程命令,如:sudo(‘echo “123456″ passwd –stdin root’)
put 上传本地文件到远程主机,如:put(src,des)  
get 从远程主机下载文件到本地,如:get(des,src)  
prompt 获取用户输入信息,如:prompt(‘please enter a new password:’)  
confirm 获取提示信息确认,如:confirm(‘failed.Continue[Y/n]?’)  
reboot 重启远程主机,reboot()  
@task 函数修饰符,标识的函数为fab可调用的  
@runs_once 函数修饰符,表示的函数只会执行一次