设为首页 收藏本站
查看: 985|回复: 0

[经验分享] Python自动化运维

[复制链接]

尚未签到

发表于 2018-8-10 07:33:25 | 显示全部楼层 |阅读模式
psutil库
  获取系统运行的进程和系统利用率

  [root@serverc ~]# yum -y install python2
  [root@serverc ~]# yum -y install python2-psutil
  [root@serverc ~]# python

  1.cpu信息


  • user 执行用户进程的时间百分比
  • system 执行内核进程和中断的时间百分比
  • idle cpu处于idle状态的时间百分比
  •   iowait 由于IO等待而使CPU处于idle(空闲)状态的时间百分比

      >> import psutil
      >> psutil.cpu_times() #使用cpu_times()方法获取cpu的完整信息
      >> psutil.cpu_times(percpu=True) #显示所有逻辑cpu信息
      >> psutil.cpu_times().user  #用户user的cpu时间比
      >> psutil.cpu_count()       #获取cpu的逻辑个数,默认logical=True4
      >> psutil.cpu_count(logical=False)  #获取cpu的物理个数


  2.获取内存信息
  total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)
  

>>> mem = psutil.virtual_memory()  
>>> mem
  
>>> mem.total
  
>>> mem.free
  
>>> mem.used
  
>>> psutil.swap_memory()
  

  3.磁盘信息
  read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)
  

>>> psutil.disk_partitions() #获取完整信息  
>>> psutil.disk_usage('/')   #获取分区的使用情况
  
>>> psutil.disk_io_counters()  #获取硬盘总的IO个数、读写信息
  
>>> psutil.disk_io_counters(perdisk=True) #获取单个分区IO个数、读写信息
  

  4.网络信息
  bytes_sent(发送字节数)、 bytes_recv(接收字节数), packets_sent(发送数据包数), packets_recv(接收数据包数)
  

>>> psutil.net_io_counters() #获取网络总的IO信息,默认pernic=False  
>>> psutil.net_io_counters(pernic=True) #pernic=True 输出每个网络借口的IO信息
  

  5.其他系统信息
  psutil模块支持获取用户登录、开机时间等信息
  

>>> psutil.users() #返回当前登录系统的用户信息  
>>> import psutil,datetime
  
>>> psutil.boot_time() #获取开机时间,以linux时间戳格式返回
  
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") #转换成自然时间格式
  

系统进程管理方法
  

>>> import psutil  
>>> psutil.pids()  #列出所有进程PID
  
>>> p = psutil.Process(1555)  #实例化一个Process对象,参数为一进程PID
  
>>> p.name()  #进程名
  
'sshd'
  
>>> p.exe()  #进程bin路径
  
'/usr/sbin/sshd'
  
>>> p.cwd()  #进程工作目录绝对路径
  
>>> p.status()  #进程状态
  
'sleeping'
  
>>> 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_info()  #进程内存rss、vms信息
  
>>> p.memory_percent()  #进程内存利用率
  
>>> p.connections()  #返回打开进程socket的namedutples列表、包括fd、family、laddr等信息
  
>>> p.num_threads()  #进程开启的线程数
  

popen类的使用
  

>>> import psutil  
>>> from subprocess import PIPE  #通过psutil的Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息
  
>>> p = psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout=PIPE)
  
>>> p.name()
  
'python'
  
>>> p.username()
  
'root'
  
>>> p.communicate()
  
('hello\n', None)
  
>>> p.cpu_times()  #得到进程运行的CPU时间
  

IP地址处理模块IPy

  [root@serverc ~]# yum -y install python-IPy

  1.IP地址、网段的基本处理
  

>>> from IPy import IP  
>>> IP('10.0.0.0/8').version() #区分IPv4与IPv6
  
>>> IP('::1').version()
  
>>> ip = IP('192.168.0.0/16')
  
>>> print ip.len() #输出IP/16网段的IP个数
  
>>> for x in ip:   #输出IP清单
  
>>>     print(x)
  

  2.反向解析名称、IP类型、IP转换
  

>>> from IPy import IP  
>>> ip = IP('192.168.1.101')
  
>>> ip.reverseName()  #反向解析地址格式
  
>>> ip.iptype()  #为私网类型'PRIVATE'
  
>>> IP('8.8.8.8').iptype()  #为公网类型 'PUBLIC'
  
>>> IP('8.8.8.8').int() #转换成整型格式
  
>>> IP('8.8.8.8').strHex() #转换成十六进制格式
  
>>> IP('8.8.8.8').strBin()  #转换成二进制格式
  
>>> print(IP(0x8080808))  #十六进制转成IP格式
  

  3.IP与掩码产生网段格式
  

>>> print(IP('192.168.1.0').make_net('255.255.255.0'))  
>>> print (IP('192.168.1.0/255.255.255.0',make_net=True))
  
>>> print (IP('192.168.1.0-192.168.1.255',make_net=True))
  

  结果都是:192.168.1.0/24
  4.也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段。
  wantprefixlen的取值及含义:


  • wantprefixlen = 0  无返回值
  • wantprefixlen = 1  prefix格式
  • wantprefixlen = 2  decimalnetmask格式
  • wantprefixlen = 3  lastIP格式
  操作如下:
  

>>> 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'
  

  5.判断IP地址和网段是否包含于于另一个网段中
  

>>> '192.168.1.100' in IP('192.168.1.0/24')  
>>> IP('192.168.1.0/24') in IP('192.168.0.0/16')
  

  判断两个网段是否存在重叠,采用IPy提供的overlaps方法
  

>>> IP('192.168.0.0/23').overlaps('192.168.1.0/24') #返回1代表存在重叠  
>>> IP('192.168.0.0/24').overlaps('192.168.2.0') #返回0代表不存在重叠
  

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

#!/usr/bin/env python  
from IPy import IP
  

  
ip_s = raw_input('Please input an IP or net-range: ') #输入IP地址或网段地址
  
ips = IP(ip_s)
  
if len(ips) > 1: #为一个网络地址
  print ('net: %s' %ips.netmask()) #输出网络地址
  print ('netmask: %s' %ips.netmask()) #输出网络掩码地址
  print ('broadcast: %s' %ips.broadcast()) #输出网络广播地址
  print ('reverse address: %s' %ips.reverseNames()[0]) #输出地址反向解析
  print ('subnet: %s' %len(ips))  #输出网络子网数
  
else:
  print ('reverse address: %s' %ips.reverseNames()[0]) #输出IP反向解析
  

  
print ('hexadecimal: %s' %ips.strHex()) #输出十六进制地址
  
print ('binary ip: %s' %ips.strBin()) #输出二进制地址
  
print ('iptype: %s' %ips.iptype()) #输出地址类型
  

  [root@serverc ~]# vi ip_mask.py


DNS处理模块dnspython
  A记录:将主机名转换成IP地址
  MX记录:邮件交换记录,定义邮件服务器的域名
  CNAME记录:指别名记录,实现域名间的映射
  NS记录:标记区域的域名服务器及授权子域
  PTR记录:反向解析,于A记录相反,将IP转换成主机名
  SOA记录:SOA标记,一个起始授权区的定义

  [root@serverc ~]# wget http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz
  [root@serverc ~]# tar -zxvf dnspython-1.9.4.tar.gz
  [root@serverc ~]# python setup.py install

  实现A记录查询方法
  

#! /usr/bin/env python  
import dns.resolver
  

  
domain = raw_input('Please input an domain: ') #输入域名地址 如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.address
  

  [root@serverc ~]# python dns_simple.py
  Please input an domain: www.baidu.com

  实现MX记录查询方法
  

#! /usr/bin/env python  
import dns.resolver
  

  
domain = raw_input('Please input an domain: ') #如 163.com
  
MX = dns.resolver.query(domain,'MX')
  
for i in MX:
  print 'MX preference = ', i.preference,'mail exchanger = ',i.exchange
  

  实现NS记录查询方法
  

#!/usr/bin/env python  
import dns.resolver
  

  
domain = raw_input('Please input an domain: ') #输入一级域名  如baidu.com
  
ns = dns.resolver.query(domain, 'NS')
  
for i in ns.response.answer:
  for j in i.items:
  print j.to_text()
  

  实现CNAME记录查询方法
  

#!/usr/bin/env python  
import dns.resolver
  

  
domain = raw_input('Please input an domain: ')
  
cname = dns.resolver.query(domain, 'CNAME') #指定查询类型为CNAME记录
  
for i in cname.response.answer: #结果将回应cname后的目标域名
  for j in i.items:
  print j.to_text()
  

  监控所有服务的IP是否正常
  

#!/usr/bin/python  
import dns.resolver
  
import os
  
import httplib
  

  
iplist=[]  #定义域名IP列表变量
  
appdomain="www.taobao.com"  #定义业务域名
  

  
def get_iplist(domain=""): #域名解析函数,解析成功IP将被追加到iplist
  try:
  A = dns.resolver.query(domain,'A') #解析A记录类型
  except Exception,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=""
  httplib.socket.setdefaulttimeout(5) #定义http连接超时时间(5秒)
  conn=httplib.HTTPConnection(checkurl) #创建http连接对象
  

  try:
  conn.request("GET","/",headers = {"Host": appdomain}) #发起URL请求,添加host主机头
  r=conn.getresponse()
  getcontent = r.read(15) #获取URL页面前15个字符,以便做可用性校验
  finally:
  if getcontent == "<!doctype html>": #监控URL页的内容一般是事先定义好的,比如"HTTP200"等
  print ip+" [OK]"
  else:
  print ip+" [Error]"
  

  
if __name__=="__main__":
  if get_iplist(appdomain) and len(iplist)>0:
  for ip in iplist:
  checkip(ip)
  else:
  print "DNS resolver error."

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549367-1-1.html 上篇帖子: Python基础知识两部曲:二 下篇帖子: Python老司机也会翻车!10个最容易犯的Python开发错误
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表