Python自动化运维01

本文主要介绍Python自动化运维的常用模块,比如:psutil、Dnspython、smtplib等。

1. psutil模块

  • 安装psutil模块
1
# pip install psutil					推荐使用pip安装
  • 获取系统信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import psutil

# cpu信息
print("CPU逻辑数量: %s" % psutil.cpu_count())
print ("CPU物理核心: %s" % psutil.cpu_count(logical=False))

# 内存信息
mem = psutil.virtual_memory()
print("系统总内存: %s" % mem.total)
print("已用内存: %s" % mem.used)
print("空闲内存: %s" % mem.free)

# 磁盘信息
disk_part = psutil.disk_partitions()
for item in disk_part:
print item.device

for item in disk_part:
print item.mountpoint
print psutil.disk_usage(item.mountpoint)

#print psutil.disk_io_counters()

# 网络信息
#print psutil.net_io_counters()
net_ifaddrs = psutil.net_if_addrs()
print net_ifaddrs["lo"][0].address
print net_ifaddrs["eth0"][0].address

for item in psutil.net_connections():
print item

# 进程信息
for item in psutil.pids():
print psutil.Process(item).name() # 进程名称
print psutil.Process(item).exe() # 进程exe路径
print psutil.Process(item).cwd() # 进程工作目录
print psutil.Process(item).cmdline() # 进程启动的命令行
print psutil.Process(item).ppid() # 父进程ID
print psutil.Process(item).parent() # 父进程
print psutil.Process(item).children() # 子进程列表
print psutil.Process(item).status() # 进程状态
print psutil.Process(item).username() # 进程用户名
print psutil.Process(item).create_time() # 进程创建时间
print psutil.Process(item).terminal() # 进程终端
print psutil.Process(item).cpu_times() # 进程使用的CPU时间
print psutil.Process(item).memory_info() # 进程使用的内存
print psutil.Process(item).open_files() # 进程打开的文件
print psutil.Process(item).connections() # 进程相关网络连接
print psutil.Process(item).num_threads() # 进程的线程数量
print psutil.Process(item).threads() # 所有线程信息
print psutil.Process(item).environ() # 进程环境变量
print "======================================================"

2. dnspython模块

  • 安装IPy模块
1
# pip install dnspython
  • 使用dnspython模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python
    #-*-coding:utf8-*-

    import dns.resolver

    domain = raw_input('请输入一个域名:')

    ans = dns.resolver.query(domain, "A")
    # ans = dns.resolver.query(domain, "CNAME")
    # ans = dns.resolver.query(domain, "NS")

    for i in ans.response.answer:
    print i.to_text()

3. smtplib模块

smtplib模块发送邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
#-*-coding:utf8-*-

import smtplib
import string

HOST="smtp.126.com" # smtp主机
SUBJECT="Test email from Python"
TO="1730004882@qq.com" # 接收邮件的邮箱地址
FROM="xxx@126.com" # 发送邮件的邮箱地址
text="python rules them all!" # 邮件内容
BODY=string.join(("From: %s" % FROM,"To: %s" % TO,"Subject: %s" % SUBJECT,"",text),"\r\n")
server=smtplib.SMTP()
server.connect(HOST,"25")
server.starttls()
server.login("xxx@126.com","password") # 发送邮件的邮箱地址和密码
server.sendmail(FROM,[TO],BODY)
server.quit()

4. difflib模块

文件内容差异比对方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#### 比较2个字符串
#!/usr/bin/env python
#-*- coding:utf8 -*-

import difflib
text1 = """This module provides classes
and funcitions for comparing sequences 1"""
text1_lines = text1.splitlines()
text2 = """This module provides classes
and funcitions for comparing sequences 2"""
text2_lines = text2.splitlines()

#d = difflib.Differ()
#diff = d.compare(text1,text2)
#print '\n'.join(list(diff))
d = difflib.HtmlDiff()
print d.make_file(text1_lines,text2_lines)

### 对比配置文件差异
#!/usr/bin/env python

import difflib
import sys

try:
textfile1 = sys.argv[1]
textfile2 = sys.argv[2]
except Exception,e:
print "Error:"+str(e)
print "Usage: diffile.py filename1 filename2"
sys.exit()

def readfile(filename):
try:
fileHandle = open(filename,'rb')
text = fileHandle.read().splitlines()
fileHandle.close()
return text
except IOError as error:
print('Read file Error:'+str(error))
sys.exit()

if textfile1 == "" or textfile2 == "":
print "Usage: diffile.py filename1 filename2"
sys.exit()

text1_lines = readfile(textfile1)
text2_lines = readfile(textfile2)

d = difflib.HtmlDiff()
print d.make_file(text1_lines,text2_lines)

单个文件比较:

语法:filecmp.cmp(f1.f2[,shallow])

比较f1和f2,相同返回true,不同返回false,shallow默认为true,会根据os.stat()比较,不会比较文件内容;反之则会比较内容。

1
2
3
4
5
>>> import filecmp
>>> filecmp.cmp("/etc/passwd","/etc/passwd")
True
>>> filecmp.cmp("/etc/passwd","/etc/shadow")
False

5. pycurl模块

pycurl模块是一个用C语言编写的libcurl P python实现,功能非常强大,支持的协议有FTP、HTTP、HTTPS、TELNET等,可以理解成linux下curl命令功能的python封装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python
# -*- coding:utf8 -*-

import os,sys
import time
import sys
import pycurl

URL="http://www.baidu.com"
c = pycurl.Curl()
c.setopt(pycurl.URL,URL)
c.setopt(pycurl.CONNECTTIMEOUT,5)
c.setopt(pycurl.TIMEOUT,5)
c.setopt(pycurl.NOPROGRESS,1)
c.setopt(pycurl.FORBID_REUSE,1)
c.setopt(pycurl.MAXREDIRS,1)
c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)

indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.html","wb")
c.setopt(pycurl.WRITEHEADER,indexfile)
c.setopt(pycurl.WRITEDATA,indexfile)
try:
c.perform()
except Exception,e:
print "connection error:"+str(e)
indexfile.close()
c.close()
sys.exit()

NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME)
CONNECT_TIME = c.getinfo(c.CONNECT_TIME)
PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME)

STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME)

TOTAL_TIME = c.getinfo(c.TOTAL_TIME)
HTTP_CODE = c.getinfo(c.HTTP_CODE)
SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD)
HEADER_SIZE = c.getinfo(c.HEADER_SIZE)
SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD)

print "HTTP状态码:%s" %(HTTP_CODE)
print "DNS解析时间:%.2f ms" %(NAMELOOKUP_TIME*1000)
print "建立连接时间:%.2f ms" %(CONNECT_TIME*1000)
print "准备传输时间:%.2f ms" %(PRETRANSFER_TIME*1000)
print "传输开始时间:%.2f ms" %(STARTTRANSFER_TIME*1000)
print "传输结束总时间:%.2f ms" %(TOTAL_TIME*1000)
print "下载数据包大小:%d bytes/s" %(SIZE_DOWNLOAD)
print "HTTP头部大小:%d byte" %(HEADER_SIZE)
print "平均下载速度:%d bytes/s" %(SPEED_DOWNLOAD)

indexfile.close()
c.close()

---------------- The End ----------------