python自动化运维5--系统批量运维管理器Fabric使用

在讲Fabric之前我们先说下另外两个跟Fabric有相似功能的模块:
1.pexpect
pexpect可以理解成Linux下的expect的Python封装,通过pexpect我们可以实现对ssh、ftp、passwd、telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的。比如我们可以模拟一个FTP登录时的所有交互,包括输入主机地址、用户名、密码、上传文件等,待出现异常我们还可以进行尝试自动处理。
2.paramiko:
paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功能。
3.Fabric:
Fabric是基于Python(2.5及以上版本)实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行、文件上传、下载及完整执行日志输出等功能。Fabric在paramiko的基础上做了更高一层的封装,操作起来会更加简单。

前两个模块基本可以实现Fabric的功能,但是使用起来会比较复杂,所以基本上我们更多使用的是Fabric模块。

关于fabric的中文文档可以看下这个链接

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

案例1查看本地与远程主机信息

注意:我使用的数python3,所以下载此模块使用的是:

pip install fabric3

本示例调用local()方法执行本地(主控端)命令,调用run()方法执行远程命令,

from fabric.api import *

#此文件命名为test.py

env.user='root'
env.hosts=['192.168.1.103]
env.password='123df'

@runs_once #查看本地系统信息,当有多台主机时只运行一次
def local_task(): #本地任务函数
    local("ipconfig")

def remote_task():
    with cd("/home"): #“with”的作用是让后面的表达式的语句继承当前状态,现
        run("ls -l") # “cd /home && ls -l”的效果

然后在命令行输入下面命令,:

#执行local_task函数
fab -f test.py local_task

#执行remote_task函数
fab -f test.py remote_task

fab是fabric内置的命令,它作为Fabric程序的命令行入口,提供了丰富的参数调用。test.py则是我们上面程序的文件名,然后后面就是我们定义的要执行的函数名。因为我用的是windows系统,所以我先在本机执行local_task函数,并执行ipconfig命令来查看当前的网络状态。接着我调用remote_task函数,并使用命令查看远程主机的信息。你们可能会疑惑,它怎么跟远程主机建立连接呢,那些fabric模块底层都帮我们封装好了,我们只要在程序一开始指定好环境变量env,设置好我们要登录的远程主机的用户名,IP,密码就可以了,默认使用的是ssh连接,也就是使用22端口,我们也可以指定指定为其他端口:env.port=23。

案例2动态获取远程目录列表

from fabric.api import *

#此文件命名为test.py

env.user='root'
env.hosts=['192.168.1.103]
env.password='123df'

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)                                                	

然后在命令行输入下面命令:

#执行go函数
fab -f test.py go

该示例实现了一个动态输入远程目录名称,再获取目录列表的功能,由于我们只要求输入一次,再显示所有主机上该目录的列表信息,调用了一个子函数input_raw()同时配置@runs_once修饰符来达到此目的。

案例3文件打包、上传与校验

我们时常做一些文件包分发的工作,实施步骤一般是先压缩打包,再批量上传至目标服务器,最后做一致性校验。本案例通过put()方法实现文件的上传,通过对比本地与远程主机文件的md5,最终实现文件一致性校验。

from fabric.api import *
from fabric.context_managers import *         
from fabric.contrib.console import confirm   
 
#此文件命名为test.py

env.user='root'
env.hosts=['192.168.1.103]
env.password='123df'

@task                                                                           
@runs_once                                                                      
def tar_task(): #本地打包任务函数,只限执行一次                                                
    with lcd("/data/logs"):                                                     
        local("tar -czf access.tar.gz access.log")                              
                                                                                
@task                                                                           
def put_task(): #上传文件任务函数                                                       
    run("mkdir -p /data/logs")                                                  
    with cd("/data/logs"):                                                      
        with settings(warn_only=True): #put(上传)出现异常时继续执行,非终止                    
            result = put("/data/logs/access.tar.gz","/data/logs/access.tar.gz") 
            if result.failed and not confirm("put file failed,Continue[Y/N]?"): 
                abort("Aborting file put task!") #出现异常时,确认用户是否继续,(Y继续)          
                                                                                
@task                                                                           
def check_task(): #校验文件任务函数                                                     
    with settings(warn_only=True):                                              
        #本地local命令需要配置capture=True才能捕获返回值                                       
        lmd5=local("md5sum /data/logs/access.tar.gz",                           
        capture=True).split(' ')[0]                                             
        rmd5=run("md5sum /data/logs/access.tar.gz").split(' ')[0]               
        if lmd5==rmd5: #对比本地及远程文件md5信息                                          
            print("OK")                                                         
        else:                                                                   
            print("ERROR")                                                      
                                                                                
@task                                                                           
def go():                                                                       
    tar_task()                                                                  
    put_task()                                                                  
    check_task()                                                                

然后在命令行输入下面命令,就可以实现文件打包、上传、校验全程自动化:

#执行go函数
fab -f test.py go
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值