免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yestreenstars
打印 上一主题 下一主题

[其他] 学习与分享——Python自动化运维 [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
41 [报告]
发表于 2014-11-25 09:43 |只看该作者
回复 35# niao5929

想要书得好好参与讨论哦~
   

论坛徽章:
0
42 [报告]
发表于 2014-11-25 11:16 |只看该作者
本帖最后由 dc222222222 于 2014-11-25 11:18 编辑

回复 41# yestreenstars

其实刚开始的时候基本上都是用system或者popen这样的函数去调用shell命令,说白了就是在shell的外面包了一层python的壳而已,后来发现python有自己的方法可以实现shell的大部分功能,比如抓性能数据的psutil, 处理网络请求的socket模块, shell中的awk也可用用python中更灵活的语法以及函数替代实现:

如下是一个检测服务器端口是否存活的zabbix监控脚本。
  1. #!/bin/env python
  2. #Author: sixther
  3. #comment: check port status on linux server.usage:   ./check_port_status.py 80:httpd  3306:mysql 22:sshd
  4. import socket,sys,os

  5. del sys.argv[0]
  6. down_process=[]
  7. ip_list=[]
  8. #这块应该是纯包装,呵呵。
  9. get_iplist_cmd="/sbin/ifconfig | grep 'inet addr' | awk '{print $2}' | awk -F: '{print $2}'"
  10. for i in os.popen(get_iplist_cmd):
  11.                 ip_list.append(i.strip())

  12. #采用socket的方式代替之前过滤netstat -lntp的输出。
  13. def check_port(addr,port):
  14.         sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  15.         result=sock.connect_ex((addr,port))
  16.         sock.close()
  17.         if result == 0:
  18.                 return 0
  19.         else:
  20.                 return 1
  21. if __name__ ==  '__main__':
  22.         for i in sys.argv:
  23.                 for j in ip_list:
  24.                         return_num=check_port(j,int(i.split(":")[0]))
  25.                         if return_num == 0:
  26.                                 code=''
  27.                                 break
  28.                         else:
  29.                                 code='down'
  30.                 if code == 'down':
  31.                         down_process.append(i.split(":")[1])
  32.                 code=''
  33.         if len(down_process):
  34.                 print str(down_process) + " down!"
  35.         else:
  36.                 print 0
复制代码

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
43 [报告]
发表于 2014-11-25 11:27 |只看该作者
yestreenstars 发表于 2014-11-24 14:50
回复 30# shenyue_sam

还有一点就是用python来做文本处理时似乎没有发现可以用来记录行号的变量


fileinput 模块有提供记录行号, 文件名等函数哦

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
44 [报告]
发表于 2014-11-25 11:33 |只看该作者
回复 43# dc222222222

学习了,我以为你是将一个shell脚本改成了python脚本呢~
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
45 [报告]
发表于 2014-11-25 11:33 |只看该作者
回复 44# reyleon

噢,谢谢,我研究研究~
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
46 [报告]
发表于 2014-11-25 11:56 |只看该作者
回复 44# reyleon

不错!这个模块很好用~
   

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
47 [报告]
发表于 2014-11-25 12:02 |只看该作者
回复 47# yestreenstars


    我从发神那儿学来的 @李满满

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
48 [报告]
发表于 2014-11-25 12:07 |只看该作者
回复 48# reyleon

牛掰的发神~
   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
49 [报告]
发表于 2014-11-25 13:17 |只看该作者
回复 1# yestreenstars


    顶! 支持 yestreenstars!

论坛徽章:
4
狮子座
日期:2014-04-17 10:45:47双鱼座
日期:2014-08-21 17:16:41处女座
日期:2014-08-26 13:46:46水瓶座
日期:2014-10-28 14:08:50
50 [报告]
发表于 2014-11-25 13:38 |只看该作者
1.你是如何学习Python的?看书?看视频?还是?
买了一本python学习手册第4版,看了俩月,略有入门。其他就是根据自己的需求在网上搜相关的资源了。

2.你工作中有用到Python吗?主要用来做什么?
python主要是抓取cacti的监控图,因为每周要把监控图汇总成文档。

3.你觉得Python跟其他脚本语言比优势在哪?
python相对于shell来讲,可用的库更多,更加的灵活

4.谈谈Python在自动化运维中的应用。
可以利用python进行批处理,对大数据也有帮助

5.给出一个你自己写的Python脚本(最好有详细注释)
当时为朋友写的一个抓菜谱的程序,url可以改成批量,写的不好,见谅,求星辰大神赐书!
  1. #encoding=utf-8
  2. import urllib2
  3. import re
  4. import smtplib
  5. from email.mime.text import MIMEText
  6. from email.mime.multipart import MIMEMultipart
  7. ''''A=[]
  8. B=[]
  9. page='您访问的页面不存在'''
  10. '''url='http://home.meishichina.com/recipe-192222.html'''

  11. def menu(url):
  12.     A=[]
  13.     B=[]
  14.     page='您访问的页面不存在'
  15.     try:
  16.         headers={'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
  17.         res=urllib2.Request(url,headers=headers)
  18.         response=urllib2.urlopen(res).read()
  19.         #print response
  20.         #Python正则匹配中文
  21.         ############################
  22.         context=re.search(ur"[\u4e00-\u9fa5]+",response.decode('utf-8'))#Python正则匹配中文
  23.    
  24.         #print context.group(0)
  25.         #############################
  26.         if context.group(0)==page:
  27.             print 'Page not found!'
  28.             #<h2 class="recipe_De_title"><a href="#" id="recipe_title">烤孜然排骨</a></h2>  
  29.         else :
  30.             resultname=re.findall(ur'<h2 class="recipe_De_title"><a href="#" id="recipe_title">([\u4e00-\u9fa5]+)</a></h2>',response.decode('utf-8'))
  31.             for i in resultname:
  32.                 name=i.encode('utf-8')
  33.                 name=name.encode('cp936')
  34.         
  35.         
  36.                 resultcontent=re.findall(ur'<li><span class="category_s1">([\u4e00-\u9fa5]+)</span><span class="category_s2">\(.*\)</span></li>',response.decode('utf-8'))
  37.                 for m in resultcontent:
  38.                     content=m.encode('utf-8')
  39.                     A.append(m.encode('utf-8'))
  40.       
  41.         
  42.                 resultcook=re.findall(ur'<li><span class="category_s1">([\u4e00-\u9fa5]+)</span></li>',response.decode('utf-8'))
  43.                 for v in resultcook:
  44.                     cook=v.encode('utf-8')
  45.             
  46.                 resultstep=re.findall(ur'<div class="recipeStep_word">(.*)</div>',response)
  47.                 for x in resultstep:
  48.                     B.append(x.encode('utf-8'))
  49.             
  50.         
  51.         
  52.                 file=open('D:\\Program\\menu\\'+name+'.txt','w')
  53.                 n=0
  54.                 file.write('食材\n'+'-'*10+'\n')
  55.                 while n<len(A):
  56.             
  57.                     file.write(A[n]+'\n')
  58.                     n+=1
  59.                 else:
  60.                     file.write("-"*10+"\n厨具\n")
  61.                     file.write(cook)
  62.                     file.write('\n'+'-'*10+'\n')
  63.                     #file.write("-"*10+"\n制作步骤\n")
  64.             
  65.         
  66.             
  67.             
  68.         
  69.                 m=0
  70.                 while m<len(resultstep):
  71.                     file.write(B[m]+'\n')
  72.                     m+=1
  73.                 else:
  74.                     file.close()
  75.     except urllib2.HTTPError as e:
  76.         print e.code
  77.         

  78. def sendmail(to_list,sub,result):
  79.     headers={'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
  80.     res=urllib2.Request(url,headers=headers)
  81.     response=urllib2.urlopen(res).read()      
  82.     resultname1=re.findall(ur'<h2 class="recipe_De_title"><a href="#" id="recipe_title">([\u4e00-\u9fa5]+)</a></h2>',response.decode('utf-8'))
  83.     for i in resultname1:
  84.         name=i.encode('utf-8')
  85.         name=name.encode('cp936')
  86.    

  87.     me=mail_user+"<"+mail_user+"@"+mail_postfix+">"

  88.     '''msg = MIMEText(result)'''
  89.     #创建一个带附件的实例
  90.     msg = MIMEMultipart()

  91.     #构造附件1
  92.     att1 = MIMEText(open('D:\\Program\\menu\\'+name+'.txt', 'rb').read(), 'base64', 'gb2312')
  93.     att1["Content-Type"] = 'application/octet-stream'
  94.     #att1["Content-Disposition"] = 'attachment; filename="stock.txt"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
  95.     att1["Content-Disposition"] = 'attachment; filename="menu.txt"'
  96.     msg.attach(att1)

  97.     msg['Subject'] = sub
  98.     msg['From'] = me
  99.     msg['To'] = ";".join(to_list)
  100.     try:
  101.         s = smtplib.SMTP()
  102.         s.connect(mail_host)
  103.         s.login(mail_user,mail_pass)
  104.         s.sendmail(me, to_list, msg.as_string())

  105.         s.close()
  106.         return True
  107.     except Exception, e:
  108.         print str(e)
  109.         return False

  110. if __name__=='__main__':
  111.     url='http://home.meishichina.com/recipe-192222.html'
  112.     result=menu(url)
  113.    
  114.     mailto_list=["。。。。@qq.com",'。。。。@qq.com']
  115.     #####################

  116.     mail_host="smtp.126.com"
  117.     mail_user="。。。"
  118.     mail_pass="。。。"
  119.     mail_postfix="126.com"
  120.     sendmail( mailto_list,"menu",result)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP