天天看點

Python自動化運維

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           
#!/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()           
#!/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()           
#!/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."