《Python自动化运维之路》 系统基础信息模块
Posted LyShark
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Python自动化运维之路》 系统基础信息模块相关的知识,希望对你有一定的参考价值。
系统性能收集模块Psutil
目录:
- 系统性能信息模块psutil
系统性能信息模块psutil
psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等。主要用于系统监控。对于系统维护来说是个不错的模块。
1.模块的安装
wget https://files.pythonhosted.org/packages/14/a2/8ac7dda36eac03950ec2668ab1b466314403031c83a95c5efc81d2acf163/psutil-5.4.5.tar.gz
yum install -y gcc readline-devel* zlib*
tar -xzvf psutil-5.4.5.tar.gz cd psutil-5.4.5 python setup.py install
获取系统性能信息
(1)获取CPU信息
Linux操作系统的CPU利用率有以下几个部分:
- User Time #执行用户进程的时间百分比
- System Time #执行内核进程和总段的时间百分比
- Wait IO #由于IO等待而使CPU处于idle(空闲状态的时间百分比)
- Idle #CPU处于Idle状态的时间百分比
实例:
#使用psutil.cpu_times()函数取出CPU简要信息,如需要完整信息使用psutil.cpu_times(True)即可
>>> import psutil >>> >>> psutil.cpu_times() scputimes(user=52745.65625, system=26600.859375, idle=384777.265625, interrupt=1410.8125, dpc=1468.984375) >>> psutil.cpu_times(True) [scputimes(user=12148.0, system=7542.421875, idle=96366.203125, interrupt=1105.546875, dpc=1091.84375), scputimes(user=13037.046875, system=6173.28125, idle=96845.85937499999, interrupt=137.734375, dpc=151.171875), scputimes(user=13006.953125, system=6257.390625, idle=96791.84374999999, interrupt=87.5, dpc=137.671875), scputimes(user=14555.515624999998, system=6629.703124999985, idle=94870.9375, interrupt=80.0625, dpc=88.4375)] >>>
#获取单项数据信息,如以下获取user的CPU时间比
>>> psutil.cpu_times().user
52766.546875
>>>
#获取CPU逻辑个数,默认logical=True4
>>> psutil.cpu_count()
4
>>>
#获取CPU物理个数
>>> psutil.cpu_count(logical=False)
4
>>>
(2)获取内存信息
Linux操作系统对内存的统计有以下几个部分:
- Total #内存总数
- User #已使用内存
- Free #空闲内存数
- Buffers #缓冲使用数
- Cache #缓存使用数
- Swap #交换分区
实例:
#获取内存完整信息
>>> import psutil >>> >>> mem=psutil.virtual_memory() >>> >>> mem #获取到的内存数据 svmem(total=8457035776, available=5508038656, percent=34.9, used=2948997120, free=5508038656) >>> >>> mem.total #获取内存总数 8457035776 >>> >>> mem.free #获取内存剩余 5508038656 >>> >>> psutil.swap_memory() #获取swap交换内存 sswap(total=9799213056, used=3736629248, free=6062583808, percent=38.1, sin=0, sout=0) >>> >>>
(3)获取磁盘信息
- Read_count #读IO数
- Write_count #写IO数
- Read_byte #IO读字节数
- Write_byte #IO写字节数
- Read_time #磁盘读时间
- Write_time #磁盘写时间
实例:
>>> import psutil >>> >>> psutil.disk_partitions() #获取当前磁盘完整信息 [sdiskpart(device=‘C:\\‘, mountpoint=‘C:\\‘, fstype=‘NTFS‘, opts=‘rw,fixed‘), sdiskpart(device=‘D:\\‘, mountpoint=‘D:\\‘, fstype=‘NTFS‘, opts=‘rw,fixed‘)] >>> >>> psutil.disk_usage("C:\\") #获取指定分区(参数)的使用情况 sdiskusage(total=115865546752, used=31459299328, free=84406247424, percent=27.2) >>> >>> >>> psutil.disk_io_counters() #获取硬盘总的IO个数,与读写信息 sdiskio(read_count=1577844, write_count=1529528, read_bytes=71110199808, write_bytes=103924939776, read_time=6624, write_time=8764) >>> >>> psutil.disk_io_counters(perdisk=True) #获取单个分区IO个数,与读写信息 {‘PhysicalDrive0‘: sdiskio(read_count=837428, write_count=944450, read_bytes=37869357056, write_bytes=32956311040, read_time=1928, write_time=2476), ‘PhysicalDrive1‘: sdiskio(read_count=740416, write_count=585185, read_bytes=33240842752, write_bytes=70969325056, read_time=4696, write_time=6288)} >>> >>>
(4)获取网络信息
- Bytes_sent #发送字节数
- Bytes_recv #接收字节数
- Packets_sent #发送数据包
- Packets_recv #接收数据包
实例:
>>> import psutil >>> >>> psutil.net_io_counters() #获取网络IO信息,默认pernic=False snetio(bytes_sent=1137465964, bytes_recv=1533965380, packets_sent=18466211, packets_recv=4429783, errin=0, errout=0, dropin=0, dropout=0) >>> >>> psutil.net_io_counters(pernic=True) #输出每个网络接口的IO信息 {‘eth0‘: snetio(bytes_sent=1137468550, bytes_recv=1533958095, packets_sent=18466313, packets_recv=4429706, errin=0, errout=0, dropin=0, dropout=0), ‘lo‘: snetio(bytes_sent=33796, bytes_recv=33796, packets_sent=455, packets_recv=455, errin=0, errout=0, dropin=0, dropout=0)} >>>
(5)其他系统信息
实例:
>>> import psutil >>> >>> psutil.users() #返回当前登录系统用户信息 [suser(name=‘root‘, terminal=‘pts/0‘, host=‘27.201.232.42‘, started=1528273152.0, pid=18905)] >>> >>> import psutil,datetime >>> >>> psutil.boot_time() #获取开启时间 1527585242.0 >>> >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") ‘2018-05-29 17:14:02‘ #获取开机时间,以linux时间戳显示 >>>
系统进程管理方法
常用方法:
- psutil.pids() #列出所有进程PID
- psutil.Process(2714) #实例化
- p.name() #取进程名
- p.exe() #取bin路径
- p.cwd() #进程工作目录绝对路径
- p.status() #进程状态
- p.create_time() #进程创建时间,时间戳格式
- p.uids() #取进程UID信息
- p.gids() #取进程GID信息
- p.cpu_times() #进程CPU时间信息,包括user,system两个CPU时间
- 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() #进程开启的线程数
实例:
>>> import psutil >>> >>> psutil.pids() #列出所有进程号 [0, 4, 360, 544, 636, 708, 716, 808, 880, 304, 384, 1028, 1120, 1236, 1420, 1480, 1688, 1788, 1900, 1956, 1848, 2064] >>> >>> p=psutil.Process(1956) #实例化一个Process对象,参数为一进程PID >>> >>> p.name() #取进程名字 ‘RtkAudioService64.exe‘ >>> >>> >>> p.num_threads() #取进程线程数 4 >>>
IP地址处理模块IPy
作用:计算大量的IP地址,包括网段,网络掩码,广播地址,子网个数,IP类型等。可以很好的辅助我们高效完成IP地址的规划工作。
1:IP地址与网段的基本处理
#辨别IPv4与IPv6
>>> import IPy >>> from IPy import IP >>> >>> IP("192.168.0.0/24").version() #判断类型为IPv4 4 >>> >>> IP("::1").version() #判断类型为IPv6 6 >>>
#通过指定网段输出该网段的IP个数以及所有IP地址清单
>>> import IPy >>> from IPy import IP >>> >>> ip_address=IP("192.168.1.0/24") #指定IP地址范围 >>> >>> print(ip_address.len()) #输出该网段的IP个数 256 >>> >>> for i in ip_address: #输出该网段的所有IP清单 ... print(i) ... 192.168.1.0 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5 192.168.1.6 ........
#IP地址的反向解析名称,IP类型与转换
>>> import IPy >>> from IPy import IP >>> >>> ip_address=IP("192.168.1.10") >>> >>> ip_address.reverseNames() #输出反向解析地址格式 [‘10.1.168.192.in-addr.arpa.‘] >>> >>> ip_address.iptype() #查看IP类型,此处为私网类型 ‘PRIVATE‘ >>> >>> IP("8.8.8.8").iptype() #查看IP类型,此处为公网类型 ‘PUBLIC‘ >>> >>> >>> IP("8.8.8.8").int() #转换成整形格式 134744072 >>> >>> IP("8.8.8.8").strHex() #转换成十六进制格式 ‘0x8080808‘ >>> >>> IP("8.8.8.8").strBin() #转换成二进制格式 ‘00001000000010000000100000001000‘ >>> >>> print(IP(0x8080808)) #十六进制转换成IP格式 8.8.8.8 >>>
#根据IP与子网掩码生成网段格式
>>> import IPy >>> 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参数值,定制输出不同类型的网段
>>> import IPy >>> from IPy import IP >>> >>> 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‘ >>>
wantprefixlen取值范围:
- wantprefixlen=0 #无返回值,如192.168.1.0;
- wantprefixlen=1 #perfix格式,如192.168.1.0/2;
- wantprefixlen=2 #decimalnetmask格式,如192.168.1.0/255.255.255.0;
- wantprefixlen=3 #lastIP格式,如192.168.1.0-192.168.1.255
2:多网络的计算比对方法
作用:用于比对两个网段是否存在,包含,重叠等关系
#进行数据比对,判断两个网段是否相等(或者说是否在同一个广播域)
>>> import IPy >>> from IPy import IP >>> >>> IP("10.0.0.0/24") < IP("20.0.0.0/24") True
#判断IP地址和网段是否包含于另一个网段中
>>> import IPy >>> from IPy import IP >>> >>> "192.168.1.10" in IP("192.168.1.0/24") #1.10是否在0/24这个网段中 True >>> >>> IP("192.168.1.0/24") in IP("192.168.0.0/16") #前面的与后面的是否有交叉 True >>>
#判断两个网段是否有重叠,采用IPy提供的overlaps方法
>>> import IPy >>> from IPy import IP >>> >>> IP("192.168.0.0/23").overlaps("192.168.1.0/24") #返回1代表存在重叠 1 >>> >>> IP("192.168.1.0/24").overlaps("192.168.2.0") #返回0代表不存在重叠 0 >>>
#输入IP或子网,返回网络,掩码,广播,反向解析,子网个数,IP类型等信息
import IPy from IPy import IP ip_s =input("输入IP地址或网段地址:") #例如:192.168.1.0/24 ips=IP(ip_s) if len(ips) > 1: #为一个网络地址时执行 print("网络地址:%s" %ips.net()) print("子网掩码:%s" %ips.netmask()) print("广播地址:%s" %ips.broadcast()) print("反向解析:%s" %ips.reverseNames()[0]) print("网络子网数:%s" %len(ips)) else: #为单个IP时执行 print("反向解析:%s" %ips.reverseNames()[0]) print("十六进制地址:%s" %ips.strHex()) print("二进制地址:%s" %ips.strBin()) print("地址类型:%s" %sips.iptype())
DNS处理模块dnspython
目录:
- 利用模块解析域名的方法
- 常见的解析类型实例
- 实践:DNS域名轮询业务监控
简介:
dnspython是python实现的一个DNS工具包,它支持几乎所有的记录类型,可用于查询,传输并动态更新ZONE信息,同时支持TSIG(事务签名),验证消息和EDNS0(扩展DNS)。
dnspython模块安装
利用模块解析域名的方法
#实现A记录的查询方法
import dns.resolver domain=input("输入一个域名:") #输入域名,例如:www.baidu.com A=dns.resolver.query(domain,"A") #指定查询A记录 for i in A.response.answer: #通过response.answer方法获取查询回应信息 for j in i.items: #遍历回应信息 print(j)
以上是关于《Python自动化运维之路》 系统基础信息模块的主要内容,如果未能解决你的问题,请参考以下文章