zoukankan      html  css  js  c++  java
  • 运维常用的第三方库

    一、psutil

    系统性能信息模块
    psutil是一个跨平台库,能够轻松的实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统,支持从2.6 到 3.5的Python版本,目前最新版本为5.1.3。

    项目地址:https://github.com/giampaolo/psutil

    1、安装

    pip install psutil

    2、CPU

    复制代码
    #显示所有逻辑CPU信息。
    psutil.cpu_times(percpu=True)
    #获取CPU的逻辑个数
    psutil.cpu_count()
    #获取物理cpu个数
    psutil.cpu_count(logical=False)
    复制代码

    3、Memory

    复制代码
    #内存信息
    psutil.virtual_memory()
    #获取内存总数
    psutil.virtual_memory().total
    #获取空闲内存数
    psutil.virtual_memory().free
    #获取swap信息
    psutil.swap_memory()
    复制代码

    4、Disks

    复制代码
    #磁盘信息
    psutil.disk_partitions(all=True)
    #获取分区参数
    psutil.disk_usage('/')
    #获取磁盘IO个数
    psutil.disk_io_counters()
    复制代码

    5、Network

    #获取网络总的IO信息
    psutil.net_io_counters()
    #获取每个网络接口的io信息
    psutil.net_io_counters(pernic=True)

    6、Other system info

    复制代码
    #返回当前用户登录信息
    psutil.users()
    #获取开机时间(以时间戳的方式)
    psutil.boot_time()
    #让人能看懂
    import datetime
    datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
    复制代码

    7、Process management

    复制代码
    # 进程信息
    psutil.pids() #获取所有进程的PID
    p = psutil.Process(2128) #实例化一个Process对象,参数为一个进程PID
    p.name() #进程名
    p.exe() #经常bin路径
    p.cwd() #进程工作目录路径
    p.status() #进程状态
    p.create_time() #进程创建时间,时间戳格式
    p.uids() #进程uid信息
    p.gids() #进程gid信息
    p.cpu_times() #进程cpu时间信息,包括use,system两个时间
    p.cpu_affinity() #get进程CPU亲合度,如果设置了进程cpu的亲和度,降CPU号作为参数即可
    p.memory_percent() #进程内存利用率
    p.memory_info() #进程内存rss.vms信息
    p.io_counters() #进程IO信息,包括读写IO数及字节数
    p.connections() #返回打开进程socket的namedutples列表,包括fs、family、laddr等信息
    p.num_threads() #进程开启的线程数
    
    #popen类的使用
    from subprocess import PIPE
    #通过psutil的popen方法启动的应用程序,可以跟踪程序运行的所有相关信息
    p = psutil.Popen(['/usr/bin/python','-c','print ("hello")'],stdout=PIPE)
    p.name()
    p.username()
    p.communicate()
    p.cpu_times()
    复制代码

    二、Ipy

    IP地址处理模块
    IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等。

    官方地址: https://github.com/autocracy/python-ipy

    1、安装

    版本号 0.83

    pip install IPy

    IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IPv4的网络和地址。比如通过version方法就可以区分出IPv4与IPv6,如:

    复制代码
    from IPy import IP
    IP('192.168.1.0/24').version()
    IP('::1').version()
    
    ip = IP('192.168.0.0/16')
    ip.len() #输出192.168.0.0网段的ip个数
    for x in ip:
        print(x)
    
    test_ip = IP('192.168.17.8')
    test_ip.reverseName() #反向解析地址格式
    test_ip.iptype() #192.168.17.8为私网类型'PRIVATE'
    IP('8.8.8.8').iptype() #8.8.8.8 为公网类型
    IP('8.8.8.8').int() #转换为整形格式
    IP('8.8.8.8').strHex() #转换为16进制
    IP('8.8.8.8').strBin() #转换为2进制
    IP(0x8080808) #16进制转换成IP格式
    复制代码

    IP方法也支持网络地址的转换,例如根据IP与掩码生产网段格式,如下:

    复制代码
    >>> from IPy import IP
    >>> IP('192.168.1.0').make_net('255.255.255.0')
    IP('192.168.1.0/24')
    >>> IP('192.168.1.0/255.255.255.0', make_net=True)
    IP('192.168.1.0/24')
    >>> IP('192.168.1.0-192.168.1.255', make_net=True)
    IP('192.168.1.0/24')
    复制代码

    也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段。输出类型为字符串,如下:

    复制代码
    >>>IP('192.168.1.0/24').strNormal(0)
    '192.168.1.0'
    >>>IP('192.168.1.0/24').strNormal(1)
    '192.168.1.0/24'
    >>>IP('192.168.1.0/24').strNormal(2)
    '192.168.1.0/255.255.255.0'
    >>>IP('192.168.1.0/24').strNormal(3)
    '192.168.1.0-192.168.1.255'
    复制代码

    示例 根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数、IP类型等信息。

    复制代码
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    from IPy import IP
    
    ip_s = input('请输入一个ip或 网段地址:')
    ips = IP(ip_s)
    if len(ips) > 1:
        print('net: %s' % ips.net()) #输出网络地址
        print('netmask: %s' % ips.netmask()) #输出网络地址掩码
        print('broadcast: %s' % ips.broadcast()) #输出网络广播地址
        print('reverse adress: %s' % ips.reverseName()[0]) #输出地址反向解析
        print('subnet: %s' %len(ips)) #输出网络子网数
    else: #为单个ip地址
        print('reverse adress: %s' % ips.reverseName()[0])
    print('十六进制地址:%s' % ips.strHex())
    print('二进制地址:%s' % ips.strBin())
    print('IP地址类型:%s' % ips.iptype())
    复制代码

    三、dnspython

    DNS处理模块
    dnspython(http://www.dnspython.org/) 是Python实现的一个DNS工具包,它支持几乎所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)。在系统管理方面,我们可以利用其查询功能来实现DNS服务监控以及解析结果的校验,可以代替nslookup及dig等工具,轻松做到与现有平台的整合。

    项目地址:https://github.com/rthalley/dnspython

    1、安装

    pip install dnspython

    最新版本 dnspython-1.15.0

    dnspython模块提供了大量的DNS处理方法,最常用的方法是域名查询。dnspython提供了一个DNS解析器类—resolver,使用它的query方法来实现域名的查询功能。query方法的定义如下:

    query(self, qname, rdtype=1, rdclass=1, tcp=False, source=None, raise_on_no_answer=True, source_port=0)
    • qname参数为查询的域名。
    • rdtype参数用来指定RR资源的类型,常用的有以下几种:
      • A记录,将主机名转换成IP地址;
      • MX记录,邮件交换记录,定义邮件服务器的域名;
      • CNAME记录,指别名记录,实现域名间的映射;
      • NS记录,标记区域的域名服务器及授权子域;
      • PTR记录,反向解析,与A记录相反,将IP转换成主机名;
      • SOA记录,SOA标记,一个起始授权区的定义。
    • rdclass参数用于指定网络类型,可选的值有IN、CH与HS,其中IN为默认,使用最广泛。tcp参数用于指定查询是否启用TCP协议,默认为False(不启用)。
    • source与source_port参数作为指定查询源地址与端口,默认值为查询设备IP地址和0。
    • raise_on_no_answer参数用于指定当查询无应答时是否触发异常,默认为True。

    2、A记录查询

    复制代码
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import dns.resolver
    domain = raw_input('Please input an domain: ')    #输入域名地址
    A = dns.resolver.query(domain, 'A')    #指定查询类型为A记录
    for i in A.response.answer:   #通过response.answer方法获取查询回应信息
            print(i)
    复制代码

    3、mx记录查询

    复制代码
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import dns.resolver
    domain = raw_input("Please input an domain:")
    MX = dns.resolver.query(domain,'MX')#指定查询记录类型为mx
    for i in MX:
        print('MX preference=', i.preference, ' mail exchanger=', i.exchange)
    复制代码

    4、NS记录查询

    只限输入一级域名,baidu.com。

    复制代码
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import dns.resolver
    domain = raw_input("Please input an domain:")
    ns = dns.resolver.query(domain,'NS') #指定查询类型为NS记录
    for i in ns.response.answer:
        for j in i.items:
            print j.to_text()
    复制代码

    CNAME记录查询

    复制代码
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import dns.resolver
    domain = raw_input("Please input an domain:")
    cname = dns.resolver.query(domain,'CNAME') #指定查询类型为CNAME记录
    for i in cname.response.answer:
        for j in i.items:
            print j.to_text()
    复制代码

    结果返回cname后的目标域名。

    5、DNS域名轮询业务监控

    复制代码
    #!/usr/bin/env python
    # coding=utf-8
    
    import dns.resolver
    # import httplib
    import http.client
    
    iplist = []  # 定义域名IP列表变量
    appdomain = "jingfengjiaoyu.com"  # 定义业务域名
    
    def get_iplist(domain=""):  # 域名解析函数,解析成功IP将被追加到iplist
        try:
            A = dns.resolver.query(domain, 'A')  # 解析A记录类型
        except Exception as e:
            print("dns resolver error:" + str(e))
            return
        for i in A.response.answer:
            for j in i.items:
                iplist.append(j.address)  # 追加到iplist
        return True
    
    
    def checkip(ip):
        checkurl = ip + ":80"
        getcontent = ""
        http.client.socket.setdefaulttimeout(5)  # 定义http连接超时时间(5秒)
        conn = http.client.HTTPConnection(checkurl)  # 创建http连接对象
    
        try:
            conn.request("GET", "/", headers={"Host": appdomain})  # 发起URL请求,添
            # 加host主机头
            r = conn.getresponse()
            getcontent = r.read(7)  # 获取URL页面前15个字符,以便做可用性校验
            print(getcontent)
        finally:
            if getcontent == "<html>":  # 监控URL页的内容一般是事先定义好的,比如 “HTTP200”等
                print(ip + " [OK]")
            else:
                print(ip + " [Error]")  # 此处可放告警程序,可以是邮件、短信通知
    
    
    if __name__ == "__main__":
        if get_iplist(appdomain) and len(iplist) > 0:  # 条件:域名解析正确且至少返回一个IP
            for ip in iplist:
                checkip(ip)
        else:
            print("dns resolver error.")
    复制代码

    四、paramiko

    模仿ssh登录执行命

    官方网站:http://www.paramiko.org/
    项目网站:https://github.com/paramiko/paramiko

    1、安装

    pip install paramiko

    paramiko-2.1.2

    2、连接服务器

    2.1 用户名和密码连接

    复制代码
    import paramiko
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #作用是允许连接不在know_hosts文件中的主机
    ssh.connect('139.199.228.59', 22, 'root', '!@#)(*WGK')
    stdin,stdout,stderr = ssh.exec_command('df -h
    ls')
    stdout.read()
    ssh.close()
    复制代码

    2.2 上传和下载文件

    复制代码
    import paramiko
    import os,sys
    t = paramiko.Transport(('192.168.17.248',22))
    t.connect(username='root',password='123456')
    sftp = paramiko.SFTPClient.from_transport(t)
    #上传
    sftp.put('D:log.conf','/tmp/log.conf')
    #下载
    sftp.get('/tmp/ks-script-mZm5Oi','D:ks-script-mZm5Oi')
    t.close()
    复制代码

    3、通过公私钥免密码SSH连接服务器

    3.1 公私钥生成

    复制代码
    ssh-keygen -t rsa  # 生成密钥
    ssh-copy-id -i ~/ssh/id_rsa.pub root@192.168.17.258  # 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利
    
    import paramiko
    
    private_key_path = '/home/auto/.ssh/id_rsa'
    key = paramiko.RSAKey.from_private_key_file(private_key_path)
    
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('192.168.17.258 ', 22, 'root', key)
    
    stdin, stdout, stderr = ssh.exec_command('df')
    print stdout.read()
    ssh.close();
    复制代码

    3.2 paramiko sftp —— SSH上传和下载文件

    复制代码
    import paramiko
    #建立一个加密的管道
    scp=paramiko.Transport(('192.168.0.102', 22))
    #建立连接
    scp.connect(username='root',password='361way')
    #建立一个sftp客户端对象,通过ssh transport操作远程文件
    sftp=paramiko.SFTPClient.from_transport(scp)
    #Copy a remote file (remotepath) from the SFTP server to the local host
    sftp.get('/root/testfile','/tmp/361way')
    #Copy a local file (localpath) to the SFTP server as remotepath
    sftp.put('/root/crash-6.1.6.tar.gz','/tmp/crash-6.1.6.tar.gz')
    scp.close()
    复制代码

    一个目录下多个文件上传下载的示例:bx

    复制代码
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import paramiko,datetime,os
    hostname='139.199.228.59'
    username='root'
    password='!@#)(*WGK1'
    port=22
    local_dir='/tmp/getfile'
    remote_dir='/tmp/abc'
    try:
        t=paramiko.Transport((hostname,port))
        t.connect(username=username,password=password)
        sftp=paramiko.SFTPClient.from_transport(t)
        files=sftp.listdir(remote_dir)
        for f in files:
            print ''
            print '#########################################'
            print 'Beginning to download file  from %s  %s ' % (hostname,datetime.datetime.now())
            print 'Downloading file:',os.path.join(remote_dir,f)
            sftp.get(os.path.join(remote_dir, f),os.path.join(local_dir, f))#下载
            #sftp.put(os.path.join(local_dir, f),os.path.join(remote_dir, f))#上传
            print 'Download file success %s ' % datetime.datetime.now()
            print ''
            print '##########################################'
        t.close()
    except Exception:
           print "connect error!"
    复制代码

    注:本处的目录下所有文件进行下载或上传的示例中,在遇到目录下还有嵌套的目录存在时,会将目录也当做文件进行处理,所以如果想要更加的完美的话,可以通过引入stat模块下的S_ISDIR方法进行处理

    五、pexpect

    pexpect 是linux下expect的python封装,通过pexpect我们可以实现对ssh、ftp、password、telnet等命令进行自动交互,无需人工达到自动化需求。

    项目地址:https://github.com/pexpect/pexpect

    1、安装

    pip install pexpect

    2、登陆脚本

    复制代码
    #!/usr/bin/env python
    # coding=utf-8
    
    
    import pexpect 
    
    username = 'root'
    ip = '139.199.228.59'
    child.interact()mypassword = '!@#)(*WGK1'
    
    child = pexpect.spawn('ssh {0}@{1}'.format(username, ip))
    child.expect ('password:')
    child.sendline (mypassword)
    child.expect('$')
    child.sendline('sudo -s')
    child.expect (':')
    child.sendline (mypassword)
    child.expect('#')
    child.sendline('ls -la')
    child.expect('#')
    print child.before   # Print the result of the ls command.
    child.interact()     # Give control of the child to the user.
    child.close()
    复制代码

    六、fabric

    Fabric是基于python2.5及以上版本实现的SSH命令行工具,简化了SSH应用程序部署及系统管理任务,他提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行、文件上传、下载及完整执行日志输出等功能。Fabric在paramiko的基础上做更高一层的封装,操作起来更加简单。
    官网地址:http://www.fabfile.org/
    项目地址:https://github.com/fabric/fabric/

    2.0 支持 python3

    fab的常用参数

    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,当命令执行失败,发出告警,而非默认终止任务。

    有时候我们可已不需要写一行python代码也可以完成远程操作,直接使用命令的形式,例如

    fab -p 123456(密码) -H 192.168.1.21,192.168.1.22 -- 'uname -s'

    1、fabric的环境变量

    fabric的环境变量有很多,存放在一个字典中, fabric.state.env,而它包含在fabric.api中。 为了方便,我们一般使用env来指代环境变量。 env环境变量可以控制很多fabric的行为,一般通过env.xxx可以进行设置。

    fabric默认使用本地用户通过ssh进行连接远程机器,不过你可以通过env.user变量进行覆盖。 当你进行ssh连接时,fabric会让你交互的让你输入远程机器密码,如果你设置了env.password变量,则就不需要交互的输入密码。 下面介绍一些常用的环境变量:

    • abort_on_prompts 设置是否运行在交互模式下,例如会提示输入密码之类,默认是false
    • connection_attempts fabric尝试连接到新服务器的次数,默认1次
    • cwd 目前的工作目录,一般用来确定cd命令的上下文环境
    • disable_known_hosts 默认是false,如果是true,则会跳过用户知道的hosts文件
    • exclude_hosts 指定一个主机列表,在fab执行时,忽略列表中的机器
    • fabfile 默认值是fabfile.py在fab命令执行时,会自动搜索这个文件执行。
    • host_string 当fabric连接远程机器执行run、put时,设置的user/host/port等
    • hosts 一个全局的host列表
    • keepalive 默认0 设置ssh的keepalive
    • loacl_user 一个只读的变量,包含了本地的系统用户,同user变量一样,但是user可以修改
    • parallel 默认false,如果是true则会并行的执行所有的task
    • pool_size 默认0 在使用parallel执行任务时设置的进程数
    • password ssh远程连接时使用的密码,也可以是在使用sudo时使用的密码
    • passwords 一个字典,可以为每一台机器设置一个密码,key是ip,value是密码
    • path 在使用run/sudo/local执行命令时设置的$PATH环境变量
    • port 设置主机的端口
    • roledefs 一个字典,设置主机名到规则组的映射
    • roles 一个全局的role列表
    • shell 默认是/bin/bash -1 -c 在执行run命令时,默认的shell环境
    • skip_bad_hosts 默认false,为ture时,会导致fab跳过无法连接的主机
    • sudo_prefix 默认值”sudo -S -p ‘%(sudo_prompt)s’ “ % env 执行sudo命令时调用的sudo环境
    • sudo_prompt 默认值”sudo password:”
    • timeout 默认10 网络连接的超时时间
    • user ssh使用哪个用户登录远程主机
    • 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:’)
    • confirm 获得提示信息确认, 如: confirm(‘Tests failed. Continue[Y/N]?’)
    • reboot 重启远程主机,如: reboot();
    • @task 函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑。
    • @runs_once, 函数修饰符,标识的函数只会执行一次,不会受多台主机的影响。
  • 相关阅读:
    Generate Parentheses
    Length of Last Word
    Maximum Subarray
    Count and Say
    二分搜索算法
    Search Insert Position
    Implement strStr()
    Remove Element
    Remove Duplicates from Sorted Array
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/deny/p/12286897.html
Copyright © 2011-2022 走看看