Python Fabric 模块 介绍及简单应用

来源:《Python自动化运维》

Fabric的安装
Fabric支持pip、easy_install或源码安装方式,很方便解决包依赖的问题,具体安装命令如下(
根据用户环境,自行选择pip或easy_install):
pip install fabric
easy_install fabric
Fabric依赖第三方的setuptools、Crypto、paramiko包的支持,源码
安装步骤如下:
# yum -y install python-setuptools
# wget https://pypi.python.org/packages/source/F/Fabric/Fabric-1.8.2.tar.gz --no-check-certificate
# tar -zxvf Fabric-1.8.2.tar.gz
# cd Fabric-1.8.2
# python setup.py install
fab的常用参数
fab作为Fabric程序的命令行入口,提供了丰富的参数调用,命令格式如下:
fab [options] <command>[:arg1,arg2=val2,host=foo,hosts=‘h1;h2‘,...]
...
下面列举了常用的几个参数,更多参数可使用fab-help查看。
·-l,显示定义好的任务函数名;
·-f,指定fab入口文件,默认入口文件名为fabfile.py;
·-g,指定网关(中转)设备,比如堡垒机环境,填写堡垒机IP即可;
·-H,指定目标主机,多台主机用","号分隔;
·-P,以异步并行方式运行多主机任务,默认为串行运行;
·-R,指定role(角色),以角色名区分不同业务组设备;
·-t,设置设备连接超时时间(秒);
·-T,设置远程主机命令执行超时时间(秒);
·-w,当命令执行失败,发出告警,而非默认中止任务。
·-p,指定目标主机的密码。
有时候我们甚至不需要写一行Python代码也可以完成远程操作,直接使用命令行的形式,
例如:

# fab -p Ksdh3458d(密码) -H 192.168.1.21,192.168.1.22 -- ‘uname -s‘
全局属性设定

evn对象的作用是定义fabfile的全局设定,支持多个属性,
包括目标主机、用户、密码、角色等,各属性说明如下:
·env.host,定义目标主机,可以用IP或主机名表示,
   以Python的列表形式定义,如env.hosts=[‘192.168.1.21‘,‘192.168.1.22‘]。
·env.exclude_hosts,排除指定主机,如env.exclude_hosts=[‘192.168.1.22‘]。
·env.user,定义用户名,如env.user="root"。
·env.port,定义目标主机端口,默认为22,如env.port="22"。
·env.password,定义密码,如env.password=‘KSJ3548t7d‘。
·env.passwords,与password功能一样,区别在于不同主机不同密
码的应用场景,需要注意的是,配置passwords时需配置用户、主机、
端口等信息,如:

env.passwords = {
‘[email protected]:22‘: ‘SJk348ygd‘,
‘[email protected]:22‘: ‘KSh458j4f‘,
‘[email protected]:22‘: ‘KSdu43598‘
}

·env.gateway,定义网关(中转、堡垒机)IP,如env.gateway=‘192.168.1.23‘。
·env.deploy_release_dir,自定义全局变量,格式:env.+"变量名称",如env.deploy_release_dir、env.age、env.sex等。

·env.roledefs,定义角色分组,比如web组与db组主机区分开来,
定义如下:
env.roledefs = {
    ‘webservers‘: [‘192.168.1.21‘, ‘192.168.1.22‘, ‘192.168.1.23‘,‘192.168.1.24‘],
    ‘dbservers‘: [‘192.168.1.25‘, ‘192.168.1.26‘]
}
引用时使用Python修饰符的形式进行,角色修饰符下面的任务函数为其作用域,
下面来看一个示例:

env.roledefs = {
    ‘webservers‘: [‘192.168.1.21‘, ‘192.168.1.22‘, ‘192.168.1.23‘,‘192.168.1.24‘],
    ‘dbservers‘: [‘192.168.1.25‘, ‘192.168.1.26‘]
}
@roles(‘webservers‘)
def webtask():
    run(‘/etc/init.d/nginx start‘)

@roles(‘dbservers‘)
def dbtask():
    run(‘/etc/init.d/mysql start‘)

@roles (‘webservers‘, ‘dbservers‘)
def pubclitask():
    run(‘uptime‘)

def deploy():
    execute(webtask)
    execute(dbtask)
    execute(pubclitask)
    
####################################
fab -p  [email protected]  -f fa0.py -l
fab -p  [email protected]  -f fa0.py webtask
fab -p  [email protected]  -f fa0.py deploy

常用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(‘/data/user.info‘,‘/home/root.info‘);
·prompt,获得用户输入信息,如:prompt(‘please input user password:‘);
·confirm,获得提示信息确认,如:confirm("Tests failed.Continue[Y/N]?");
·reboot,重启远程主机,如:reboot();
·@task,函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑;
·@runs_once,函数修饰符,标识的函数只会执行一次,不受多台主机影响。

##文件名是fa.py
#!/usr/bin/env python
from fabric.api import *
env.user=‘root‘
env.hosts=[‘192.168.23.140‘,‘192.168.23.141‘]
env.password=‘[email protected]‘

@runs_once #查看本地系统信息,当有多台主机时只运行一次
def local_task(): #本地任务函数
    local("uname -a")
def remote_task():
    with cd("/tmp"): #"with"的作用是让后面的表达式的语句继承当前状态,实现
        run("ls -l") # "cd /data/logs && ls -l"的效果

##用法,执行下面命令
#fab -p  [email protected]  -f fa.py local_task
#fab -p  [email protected]  -f fa.py remote_task

动态获取远程目录列表
本示例使用“@task”修饰符标志入口函数go()对外部可见,
配合“@runs_once”修饰符接收用户输入,最后调用worktask()任务函数
实现远程命令执行,详细源码如下:
【/home/test/fabric/simple2.py】

#!/usr/bin/env python
from fabric.api import *
env.user=‘root‘
env.hosts=[‘192.168.23.140‘,‘192.168.23.141‘]
env.password=‘LKs934jh3‘
@runs_once #主机遍历过程中,只有第一台触发此函数
def input_raw():
    return prompt("please input directory name:",default="/home")
def worktask(dirname):
    run("ls -l "+dirname)
@task #限定只有go函数对fab命令可见
def go():
    getdirname = input_raw()
    worktask(getdirname)

[[email protected] fabric]# fab -p  [email protected] -f fa2.py -l
Available commands:

    go

[[email protected] fabric]# fab -p  [email protected] -f fa2.py go
。。。
。。。
。。。

网关模式文件上传与执行
本示例通过Fabric的env对象定义网关模式,即俗称的中转、堡垒机环境。
定义格式为“env.gateway=‘192.168.1.23‘”,其中IP“192.168.1.23”为堡垒机IP,
再结合任务函数实现目标主机文件上传与
执行的操作,详细源码如下:

【/home/test/fabric/simple3.py】
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm

env.user = ‘root‘
env.gateway = ‘192.168.10.11‘  # 定义堡垒机IP,作为文件上传、执行的中转设备
env.hosts = [‘192.168.23.140‘, ‘192.168.23.141‘]
# 假如所有主机密码都不一样,可以通过env.passwords字典变量一一指定
env.passwords = {
    ‘[email protected]:22‘: ‘LKs934jh3‘,
    ‘[email protected]:22‘: ‘LKs934jh3‘,
    ‘[email protected]:22‘: ‘UI7384hg6‘  # 堡垒机账号信息
}
lpackpath = "/home/install/lnmp0.9.tar.gz"  # 本地安装包路径
rpackpath = "/tmp/install"  # 远程安装包路径

@task
def put_task():
    run("mkdir -p /tmp/install")
    with settings(warn_only=True):
        result = put(lpackpath, rpackpath)  # 上传安装包
    if result.failed and not confirm("put file failed,Continue[Y/N]?"):
        abort("Aborting file put task!")

@task
def run_task():  # 执行远程命令,安装lnmp环境
    with cd("/tmp/install"):
        run("tar -zxvf lnmp0.9.tar.gz")
    with cd("lnmp0.9/"):  # 使用with继续继承/tmp/install目录位置状态
        run("./centos.sh")

@task
def go():  # 上传、安装组合
    put_task()
    run_task()

示例通过简单的配置env.gateway=‘192.168.1.23‘就可以轻松实现堡垒机环境的文件上传及执行,
相比paramiko的实现方法简洁了很多,编写的任务函数完全不用考虑堡垒机环境,
配置env.gateway即可。
时间: 2024-11-05 08:17:12

Python Fabric 模块 介绍及简单应用的相关文章

python multiprocessing模块 介绍

一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进程. Python提供了multiprocessing. multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,

Python log 模块介绍

刚用Python log模块写了一个例子,记录一下. import logging import logging.handlers import os from datetime import datetime basedir=r'D:\log' LOG_LEVEL = 0 resultPath = os.path.join(basedir,'result') if not os.path.exists(resultPath): os.mkdir(resultPath) LOG_PATH = o

Python常用模块介绍

python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的libraries(modules)如下: 1)python运行时服务 * copy: copy模块提供了对复合(compound)对象(list,tuple,dict,custom class)进行浅拷贝和深拷贝的功能. * pickle: pickle模块被用来序列化python的对象到bytes流,从而适合存储到文件,网络传输,或数据库存

Python—time模块介绍

time 模块 在平常的代码中,我们常常需要与时间打交道.在Python中,常用的与时间处理有关的模块就包括:time,datetime,下面来介绍time模块. 在开始之前,首先要说明几点: 一.在Python中,通常有这几种方式来表示时间: 时间戳 格式化的时间字符串 元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所不同. 二.几个定义 UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间

Python os模块介绍

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdir 返回当前目录: ('.') ? 1 os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类

python fabric模块 生产环境dubbo代码包发布管理完整实例

#!/usr/bin/env python import os import time import fabric from fabric.api import * from fabric.context_managers import * from fabric.colors import * from fabric.contrib.console import confirm env.hosts=['XXXX.XXXX.XXXX.XXXX'] env.user='user' env.pass

python fabric模块入门

Fabric 是一个 Python (2.5-2.7) 库和命令行工具,用来流水线化执行 SSH 以部署应用或系统管理任务. 安装: pip install fabric 首先来一个入门通用demo,hello world. 文件:hello_world.py # coding: utf-8 def hello(): print 'Hello world!' 运行结果: 默认查找当前目录下fabfile.py文件,若文件名非fabfile.py,则需要使用-f指定文件. $ fab -f hel

python时间模块介绍

时间戳是以秒为单位的浮点小数,时间戳以自1970年1月1日午夜到现在经过了的时间来表示 时间模块使用方法:import time 常见函数如下: 1.time.time() 返回时间戳 2.time.localtime([secs]) 返回时间元组 3.time.mktime(tupletime) 返回时间戳 4.time.asctime([tupletime]) 返回形式为"Sat Jul 25 20:08:32 2015" 相当于ctime(time.mktime([tupleti

【python】Redis介绍及简单使用

一.redis redis是一个key-value存储系统.和 Memcached类似,它支持存储的value类型相对更多,包括string(字符串). list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是 原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redi