python运维实例.pdf

所需积分/C币:49 2019-03-12 12:39:11 2.24MB PDF
收藏 收藏
举报

python运维实例.pdf,高清文字版本,包含日常使用的各种python运维实例
第章系统基础信息模块详解◆3 进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分 析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、 netstat、 ifconfig、who、df、kill、free、nice、 Ionic、 lestat、 loto、 uptime、 idof、tty、 taskset、pmap等。目前支持32位和64位的 Linux、 Windows、OSX、 FreeBSD和Sun Solaris等操作系统,支持从2.4到3.4的 Python版本,目前最新版本为2.0.0。通常我们获取 操作系统信息往往采用编写shel来实现,如获取当前物理内存总大小及已使用大小, shell 命令如下: 物理内存tota1值:free-m| grepMem|awk'{ print s2} 物理内存used值:free- m grepMem|awk'{ print s3} 相比较而言,使用 sutil库实现则更加简单明了。 sutil大小单位一般都采用字节,如下 s> import sutil >>mem sutil virtual memory( total, mem. used (506277888L,500367360L) sutil的源码安装步骤如下: wgethttps://pypi.pythonorg/packages/source/p/psutil/psutil-2.0.0.tar.gz -no-check-certificate t tar -xzvf psutil-2.0.0. tar. gz t python setup. py install 1.1.1获取系统性能信息 采集系统的基本性能信息包括CPU、内存、磁盘、网络等,可以完整描述当前系统的运 行状态及质量。 sutil模块已经封装了这些方法,用户可以根据自身的应用场景,调用相应 的方法来满足需求,非常简单实用。 (1)CPU信息 Linux操作系统的CPU利用率有以下几个部分: User time,执行用户进程的时间百分比 System Time,执行内核进程和中断的时间百分比; Wait Io,由于IO等待而使CPU处于idle(空闲)状态的时间百分比; 口Idle,CPU处于dle状态的时间百分比。 我们使用 Python的 sutil. cpu timeso方法可以非常简单地得到这些信息,同时也可以获 取CPU的硬件相关信息,比如CPU的物理个数与逻辑个数,具体见下面的操作例子 4 第一部分基础篇 til >>> sutil. cpu times()#使用 cpu times方法获取cPU完整信息,需要显示所有逻辑CPU信息, >>并指定方法变量 perch=True即可,如 puti1. cpu times( percpu=True) scputimes(user=38.039999999999999,nice=0.01, system=110.88,id1e=177062.59, wait=53.399999999999999,irq=2.9100000000000001, softing=79.579999999999998 steal=0.0, guest=0. 0) >> paul1.cpu_ time s().user#获取单项数据信息,如用户user的CPU时间比 38.0 count()#获取cPU的逻辑个数,默认 logica=True4 >>psutil cpu count (logical=False) #获取CPU的物理个数 (2)内存信息 Linux系统的内存利用率信息涉及 total(内存总数)、used(已使用的内存数)、fre(空 闲内存数)、 buffers(缓冲使用数)、 cache(缓存使用数)、swap(交换分区使用数)等,分别 使用 sutil. virtual memory与 sutil. swap memory(方法获取这些信息,具体见下面的操作 例子 >> import sutil >>mem= puti1. virtua1 memory()#使用 puti1. virtua1 memory方法获取内存完整信息 >>me svmem(total=506277888L, available=204951552L, percent=59.5, used=499867648L, free=6410240L, active=245858304, inactive=163733504, buffers=117035008L cacheo=81506304) >>mem.tota1#获取内存总数 506277888L >>>mem. free #获取空闲内存数 6410240L >>sutil. swap memory( 获取SWAP分区信息 sswap( total=1073733632L,used=0L, free=1073733632L, percent=0.0, sin=0, sout=0) (3)磁盘信息 在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信息,其中磁盘利用率使 用 sutil. disk usage方法获取。磁盘IO信息包括 read count(读IO数)、 write count(写 IO数)、 read bytes(IO读字节数)、 write bytes(IO写字节数)、 read time(磁盘读时间) write time(磁盘写时间)等。这些IO信息可以使用 sutil. disk- 1o counters获取,具体见 下面的操作例子 >>> puti1. disk partitions()#使用 puti1. disk partitions方法获取磁盘完整信息 Isdiskpart(device='/dev/sdal tpoint='/', fstype='e opts= rw) sdiskpart(device='/dev/sda3, mountpoint='/ data, fstype='ext4, opts='rw)] >>> puti1. disk usage('/')#使用ps k usage方法获取分区(参数)的使用情况 第章系统基础信息模块详解◆5 sdiskusage(total=15481577472 ed=4008087552,free=10687057920 percent=25.899999999999999) >>> puti1. disk io counters()#使用 puti1. disk io counters获取硬盘总的IO个数、 #读写信息 sdiskio(read count=9424, write count=35824, read bytes=128006144, write bytes=204312576, read time=72266, write time=182485 >> puti1. disk io counters( perdisk=True)#“ perdisk=True”参数获取单个分区IO个数、 #读写信息 I'sda2: sdiskio(read count=322, write count=0, read bytes=1445888, write bytes=0, read time=445, write time=0), 'sda3: sdiskio(read count=618, write count=3, read bytes=2855936, write bytes=12288, read time=871, write time=155), isdal sdiskio(read count=8484, write count=35821, read bytes=123704320, write bytes=204300288, read time=70950, write time=182330)] (4)网络信息 系统的网络信息与磁盘IO类似,涉及几个关键点,包括 bytes sent(发送字节数) bytes recv=28220119(接收字节数)、 packets sent=200978(发送数据包数)、 packets recv=212672(接收数据包数)等。这些网络信息使用 psutil. net io counters((方法获取,具体 见下面的操作例子: >>>psutil net io counters( 使用 sutil. net io counters获取网络总的Io信息,默 认 pernIC=Fa1se tio(bytes sent=27098178, byt 28220119 kets sent=200978 ecv=212672, erin=0, errout=0, dropin=0, dropout=0) >> puti1. net io counters( pernIc=True)# pernIc=True输出每个网络接口的Io信息 packets recv=198526, errin=0, errout=0, dropin=o, packets sent=198526, I'lo': snetio(bytes sent=26406824, bytes recv=26406824 dropout=0),etho snetio(bytes sent=694750, bytes recv=1816743, packets sent=2478, packets recv=14175, erin=0, errout=0, dropin=0, dropout=0)] (5)其他系统信息 除了前面介绍的几个获取系统基本信息的方法, sutil模块还支持获取用户登录、开机 时间等信息,具体见下面的操作例子 >>sutil. users( o#使用 puti1. users方法返回当前登录系统的用户信息 [suser(name=root, terminal=' pts/0 host="192.168.1.103 started=1394638720.0) suser(name=root terminal= pts/1 host=!192.168.1.103', started=1394723840.0)] >> import sutil, datetime >> sutil. boot time()#使用 puti1. boot time方法获取开机时间,以工inux时间戳格式返回 1389563460.0 >>>datetime. datetime. fromtimestamp(psutil. boot time()). strftime(oY-om-od 8H:8M:8S 6◆第一部分基础篇 2014-01-1222:51:00 #转换成自然时间格式 1.1.2系统进程管理方法 获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动 时间、査看或设置CPU亲和度、内存使用率、IO信息、 socket连接、线程数等,这些信息 可以呈现出指定进程是否存活、资源利用情况,为开发人员的代码优化、问题定位提供很好 的数据参考 (1)进程信息 sutil模块在获取进程信息方面也提供了很好的支持,包括使用 sutil. pidso方法获取所 有进程PD,使用 sutil. Processo方法获取单个进程的名称、路径、状态、系统资源利用率 等信息,具体见下面的操作例子: > import sutil >> puti1.pids()#列出所有进程PID [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 >>>p= puti1. Process(2424)#实例化一个 Process对象,参数为一进程PID >>p.name()#进程名 Java >>>p.exe()#进程bin路径 /usr/java/idk1 6.0 45/bin/java >>>p,cwa()#进程工作目录绝对路径 /usr/local/hadoop-1.2.1 >>>p. status() 进程状态 sleeping >>p create time( #进程创建时间,时间戳格式 1394852592.6900001 >>>p.uids()#进程uid信息 puids(real=0, effective=0, saved=0) >>p gids( 进程gid信息 pgids(real=0, effective=0, saved=0) >>p. cpu times()#进程CPU时间信息,包括user、 system两个CPU时间 pcputimes(user=9.0500000000000007, system=20. 25) >>p. cpu affinity()#get进程CPU亲和度,如要设置进程CPU亲和度,将CPU号作为参数即可 >>>p. memory percent()#进程内存利用率 14.147714861289776 >>p. memory info()#进程内存rss、wms信息 pmem(rss=71626752,vms=1575665664) >>>p. io counters()#进程IO信息,包括读写IO数及字节数 pio(read count=41133, write count=l681l, read bytes=37023744, write bytes=4722688) >>p connections( 返回打开进程 socket的 namedutples列表,包括fs、 family、1addr #等信息 [ conn(fd=65,fami1y=10,type=1;1addr=("::ffff:192.168.1.20',9000), 第章系统基础信息模块详解◆7 ddr=( >>>p num threads( #进程开启的线程数 (2) popen类的使用 sutil提供的 popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程 的运行状态。具体实现方法如下 sutil >>from subprocess import PIPE 通过 puti1的 Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息 >>p= sutil. Popen(["/usr/bin/pyi orin t("he11o')"] >>p username() i root >>>p communicate( 'hello\n', None) #得到进程运行的CPU时间,更多方法见上一小节 pcputimes(user=0.01, system=0.040000000000000001) 鑫考日1.11节示例参考htps:/ github. com/giampaolo/sutil 口1.1.1节模块说明参考官网htp:/ sutil. readthedocs.org/en/ atest/。 1.2实用的|P地址处理模块卩P IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的 效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包 括网段、网络掩码、广播地址、子网数、P类型等。 Python提供了一个强大的第三方模块 IPy(htts;github.com/hypo/python-ipy/),最新版本为ⅴ0.81。IPy模块可以很好地辅助我们 高效完成IP的规划工作,下面进行详细介绍。 以下是IPy模块的安装,这里采用源码的安装方式 #wgethttps://pypi.pythonorg/packages/source/i/ipy/ipy-0.81.tar.gz--no check-certificate tar -zxvf Ipy-o. 81. tar. gz t cd IPy-0 81 python setup. py install ◆第一部分基础篇 1.2.1|P地址、网段的基本处理 IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IP4的网络和地址。 比如通过 version方法就可以区分出IPv4与IPv6,如: >>IP(10.0.0.0/8'). version() 4#4代表IPv4类型 >>IP(:: 1).version( 6#6代表IPv6类型 通过指定的网段输出该网段的IP个数及所有IP地址清单,代码如下: from IPy import Ip ip=IP('192.168.0.0/16') print ip.len()#输出192.168.0.0/16网段的IP个数 for x in ip: 输出192.168.0.0/16网段的所有IP清单 print(x) 执行结果如下: 65536 192.168.0.0 92.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5 92.168.0.6 192.168.0.7 192.168.0.8 下面介绍IP类几个常见的方法,包括反向解析名称、P类型、IP转换等。 >>from IPy import IP >>>ip=IP(192.168.1.20) >>ip. reverseNames() 反向解析地址格式 20.1.168.192.in-addr.arpa >>>ip. iptype()#192.168.1.20为私网类型' PRIVATE >>IP('8.8.8.8'). iptype()#8.8.8.8为公网类型 PUBLIC >>IP("8.8.8.8").int() #转换成整型格式 134744072 >>IP('8 8'). strHex()#转换成十六进制格式 0x8080808 >>>IP('8.8.8.8). strain() #转换成二进制格式 00001000000010000000100000001000 >> print(IP(0x8080808) 十六进制转成IP格式 第章系统基础信息模块详解◆9 IP方法也支持网络地址的转换,例如根据IP与掩码生产网段格式,如下 >>from IPy import Ip >> print(IP('192.168.1.0'). make net(!255.255.255.0")) 192.168.1.0/24 >>>prin(IP(192.168.1.0/255.255.255.0', make net=True)) 192.168.1.0/24 >> print(IP('192.168.1.0-192.168.1.255, make net=True)) 192.168.1.0/24 也可以通过 strOmal方法指定不同 wantprefixlen参数值以定制不同输出类型的网段 输出类型为字符串,如下: >>IP('192.168.1.0/24'). strnorma1(0) 192.168.1.0 >>IP('192.168.1.0/24'). strnorma1(1) 192.168.1.0/24 >>IP(192.168.1.0/24'). stroma1(2) 192.168.1.0/255.255.255.0 >>IP('192.168.1.0/24'). strnorma1(3) 192.168.1.0-192.168.1.255 wantprefixlen的取值及含义 口 wantprefixlen=0,无返回,如192.168.1.0; 口 wantprefixlen=1, prefix格式,如192.168.1.0/24 wantprefixlen=2, decimalnetmask格式,如192.168.1.0/255.255.2550; 口 wantprefixlen=3, lastIN格式,如192.168.1.0-192.168.1.255。 1.2.2多网络计算方法详解 有时候我们想比较两个网段是否存在包含、重叠等关系,比如同网络但不同 prefixlen会 认为是不相等的网段,如10.0.0.0/16不等于10.0.0.024,另外即使具有相同的 prefixlen但处 于不同的网络地址,同样也视为不相等,如10.0.0.0/16不等于192.0.0.016。IPy支持类似于 数值型数据的比较,以帮助IP对象进行比较,如 >>IP('10.0.0.0/24')<IP(12.0.0.0/24 Tru 判断IP地址和网段是否包含于另一个网段中,如下 >>1192.168.1.100′inIP('192.168.1.0/24 >>>IP('192.168.1.0/24')inIP('192.168.0.0/16') 10◆第一部分基础篇 判断两个网段是否存在重叠,采用IPy提供的 overlaps方法,如 >>IP('192.168.0.0/23').over1aps('192.168.1.0/24 #返回1代表存在重叠 >>IP('192.168.1.0/241). overlaps('192.168.2.0 #返回0代表不存在重叠 示例根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数、IP类型等信息。 # /usr/bin/env python from IPy import Ip 地丝花命 raw input( Please input an Ip or net- ange:")#接收用户输入,参数为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 address: s ips. reverseNames()[O #输出地址反向解析 print (' subnet: os len(ips)) 输出网络子网数 else #为单个工P地址 print(' reverse address:s!号ips. reverseNames()[0])#输出IP反向解析 print(' hexadecimal1:号s!号ips. strHex())#输出十六进制地址 print( binary ip:s!号ips. strAin())#输出二进制地址 print(' iptype:s!号ips. iptype())#输出地址类型,如 PRIVATE、 PUBLIC、 LOOPBACK等 分别输入网段、IP地址的运行返回结果如下 python simple. py Please input an Ip or net-range: 192.168.1.0/24 net:192.168.1.0 netmask:255.255.255.0 broadcast:192.168.1.255 reverse address: 1.168.192in-addr. arpa subnet: 256 hexadecimal: 0xc0a80100 binaryip:11000000101010000000000100000000 iptype: PRIVATE python simple.py Please input an Ip or net-range: 192.168.1.20 reverse address: 20.1.168.192in-addr. arpa hexadecimal: 0xc0a80114 binaryip:11000000101010000000000100010100 iptype: PRIVATE

...展开详情
试读 59P python运维实例.pdf
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
关注 私信 TA的资源
上传资源赚积分,得勋章
最新推荐
python运维实例.pdf 49积分/C币 立即下载
1/59
python运维实例.pdf第1页
python运维实例.pdf第2页
python运维实例.pdf第3页
python运维实例.pdf第4页
python运维实例.pdf第5页
python运维实例.pdf第6页
python运维实例.pdf第7页
python运维实例.pdf第8页
python运维实例.pdf第9页
python运维实例.pdf第10页
python运维实例.pdf第11页
python运维实例.pdf第12页

试读结束, 可继续读6页

49积分/C币 立即下载 >