免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
71 [报告]
发表于 2014-11-30 11:43 |只看该作者
回复 1# yestreenstars


    急需此书,给个机会哦。  我感觉在运维中,bash可以完成90%的功能,除非涉及到API.模块等,而且极其简明清晰。python可以根据需要慢慢练手久了就熟悉了。此外python强大的地方就是有模块,各种各样的模块。

论坛徽章:
2
2015亚冠之阿尔艾因
日期:2015-05-19 15:48:12数据库技术版块每日发帖之星
日期:2016-02-28 06:20:00
72 [报告]
发表于 2014-12-01 09:06 |只看该作者
本帖最后由 honghs 于 2014-12-01 13:10 编辑

1.你是如何学习Python的?看书?看视频?还是?
看电子书,视频太花时间了

2.你工作中有用到Python吗?主要用来做什么?
工作中用到的python也不多。主要是做系统管理,小工具之类的

3.你觉得Python跟其他脚本语言比优势在哪?
linux默认安装有python,可以跨平台。

4.谈谈Python在自动化运维中的应用。
正在研究自动化运维。向天斯学习吧,原来在帝都那边,在电梯里边经常见到天斯,可惜没机会认识啊
5.给出一个你自己写的Python脚本(最好有详细注释)。
  1. #取数据库里边的网关参数,尝试连接各个网关,其实就是特定的ip和端口啦。

  2. #Check GateWay Port
  3. #-*-coding:utf-8-*-
  4. import cx_Oracle
  5. import os
  6. import sys
  7. import logging
  8. import logging.handlers
  9. import socket

  10. from configobj import ConfigObj

  11.    
  12. #get Oracle Connect
  13. def getOraConnect(user,password,serer,port,sid):
  14.     try:
  15.         oraConnect = cx_Oracle.connect(user,password,serer+':'+port+'/'+sid)        
  16.         if oraConnect!=None:
  17.             return oraConnect
  18.         else:
  19.             return None
  20.     except Exception,ex:  
  21.         print ex.message
  22.         logging.warn(ex.message)
  23.                

  24. def connectServer(ip,port,timeout=10):
  25.     #test server
  26.     sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  27.     sk.settimeout(timeout)
  28.     try:
  29.         sk.connect((ip,port))  
  30.         return True
  31.     except Exception,ex:
  32.         logging.warn(ex.message)   
  33.         return False
  34.     finally:
  35.         sk.close()
  36.    
  37. def checkGaetWay(oraConn):
  38.     #get GateWay Prameters
  39.     gwserver=[]
  40.     gwDict={}
  41.     channelid=""
  42.     gateWayIP=""
  43.     gateWayName=""
  44.     gateWayPort=0   
  45.     gateWaySql="""
  46.     SELECT b.id,
  47.   b.channelname,
  48.   CASE c.fieldname
  49.     WHEN '网关端口号'
  50.     THEN 'PORT'
  51.     WHEN '网关端口'
  52.     THEN 'PORT'
  53.     WHEN '网关地址'
  54.     THEN 'IP'
  55.     WHEN '数据库IP'
  56.     THEN 'IP'
  57.     WHEN '数据库端口号'
  58.     THEN 'PORT'
  59.     WHEN '数据库端口'
  60.     THEN 'PORT'
  61.     WHEN '网关下行端口'
  62.     THEN 'PORT'
  63.     ELSE c.fieldname
  64.   END AS fieldname ,
  65.   a.value
  66. FROM t_gateway_params A
  67. INNER JOIN v_channel B
  68. ON B.id=a.channelid
  69. INNER JOIN t_gateway_metadata c
  70. ON c.id          =a.gatewaymetadataid
  71. AND c.fieldname IN ('网关地址','网关端口号','数据库IP','数据库端口','网关端口','数据库端口号','网关下行端口')
  72. ORDER BY a.channelid
  73.                    """
  74.     oracur = oraConn.cursor()
  75.     oracur.execute(gateWaySql)   
  76.     orars = oracur.fetchall()
  77.     rowcount  = oracur.rowcount
  78.     if rowcount>0:
  79.         for rs in orars:
  80.             channelid= rs[0]
  81.             gateWayName=rs[1]
  82.             if gwDict.has_key(channelid):            
  83.                 gwServer = gwDict[channelid]
  84.                 if (str(rs[2])=="IP"):
  85.                     gwServer[1]= str(rs[3])
  86.                 if (str(rs[2])=="PORT"):
  87.                     gwServer[2]=int(rs[3])
  88.                 gwDict[channelid]= gwServer                  
  89.             else:
  90.                 gwServer = [gateWayName,"127.0.0.1",0]               
  91.                 if (str(rs[2])=="IP"):
  92.                     gwServer[1]= str(rs[3])
  93.                 if (str(rs[2])=="PORT"):
  94.                     gwServer[2]=int(rs[3])               
  95.                 gwDict[channelid]= gwServer
  96.        #   
  97.         print 'All GateWay Connect Test Begin..'     
  98.         logging.info('All GateWay Connect Tes Begin..'     )
  99.         for gw in gwDict:
  100.             gwServer=gwDict[gw]
  101.             gateWayName= gwServer[0]
  102.             gateWayIP= gwServer[1]
  103.             gateWayPort=gwServer[2]
  104.             if connectServer(gateWayIP, gateWayPort,5):
  105.                     print "connect to %s ,ip %s ,port %s success" %(gateWayName,gateWayIP,gateWayPort)
  106.                     logging.info("connect to %s ,ip %s ,port %s success" %(gateWayName,gateWayIP,gateWayPort))
  107.             else:
  108.                 print "connect to %s ,ip %s ,port %s fail" %(gateWayName,gateWayIP,gateWayPort)            
  109.                 logging.warn("connect to %s ,ip %s ,port %s fail" %(gateWayName,gateWayIP,gateWayPort) )
  110.         print 'All GateWay Connect Test End...'      
  111.         logging.info('All GateWay Connect Tes End..'     )
  112.     else:
  113.         print "Can't Get GateWay Parameters..."
  114.         logging.warn("Can't Get GateWay Parameters...")
  115.    
  116.    


  117. def main():
  118.     #get oracle config
  119.     orauser=configobj["orauser"]
  120.     orapassword=configobj["orapassword"]
  121.     oraserver=configobj["oraserver"]
  122.     oraport=configobj["oraport"]
  123.     orasid=configobj["orasid"]
  124.    
  125.     logging.info("Check GateWay Begin...")
  126.     oraConn = getOraConnect(orauser, orapassword, oraserver, oraport, orasid)
  127.     if oraConn!=None:
  128.         checkGaetWay(oraConn)
  129.         oraConn.close()
  130.     logging.info("Check GateWay End...")   

  131. if __name__=="__main__":
  132.     configobj=ConfigObj("CheckGateWay.conf")
  133.     logging.basicConfig(filename='CheckGateWay.log',level=logging.DEBUG)        
  134.     os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
  135.     main()
  136.    
复制代码

论坛徽章:
2
2015亚冠之阿尔艾因
日期:2015-05-19 15:48:12数据库技术版块每日发帖之星
日期:2016-02-28 06:20:00
73 [报告]
发表于 2014-12-01 09:10 |只看该作者
为何我发的全部变成表情了

论坛徽章:
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
74 [报告]
发表于 2014-12-01 09:12 |只看该作者
回复 71# honghs

感谢分享,代码请放在代码框里,代码框在如下图所示的红框中:
   

论坛徽章:
2
2015亚冠之阿尔艾因
日期:2015-05-19 15:48:12数据库技术版块每日发帖之星
日期:2016-02-28 06:20:00
75 [报告]
发表于 2014-12-01 13:12 |只看该作者
谢谢,改成code了。

论坛徽章:
0
76 [报告]
发表于 2014-12-02 09:56 |只看该作者
expert1 发表于 2014-11-30 11:43
回复 1# yestreenstars


完全赞同这位兄弟的观点。说说我的观点:
1 扩展性好
1)python的强大之处在于扩展性方面,有n多的库可以调用,很多你需要的功能已经有现成的库能实现,无需重复造轮子。
2)跨平台。
3)语法固定,适合大家协作,利于后期的迭代和维护。

2 对新手来说,除非你有编程和面向对象的基础,否则也没那么容易上手。至少当年我学习的时候就这个感觉,就知道import先用起来,但不知道里面的实现原理。还有快速查找模块,函数的帮助文档这些方面不如man来的直接方便。

3 语言的重要之处是要常用,如果光看文档,写的少,那还是不能灵活掌握的。如这位兄弟所言,日常的运维工作用shell就够了。有时候闲下来自己去用python来实现shell脚本的功能,不是用python简单封装shell,而是重构,找找有没有python的函数或者模块能实现类似的功能。有没有效率上的提升。这样做也算是一种进一步认识python的方法。

论坛徽章:
0
77 [报告]
发表于 2014-12-02 12:34 |只看该作者
1.你是如何学习Python的?看书?看视频?还是?
答: 我是通过PDF 和  英文文档 学习的Python

2.你工作中有用到Python吗?主要用来做什么?
答: 在工作中暂时用不到Python,学习Python的主要原因是为了给自己充电;  开发web新项目,主要还是对它有浓厚兴趣;

3.你觉得Python跟其他脚本语言比优势在哪?
答: 简洁,易读性好、可移植性、跨平台、效率高、可用性强、写脚本(但 对于写脚本来说,还是shell最专长)、开发,尤其是web开发(比如:Django) 等等;

4.谈谈Python在自动化运维中的应用。
答:监控,批量管理和部署平台,以及对hadoop的流程化工具;

5.给出一个你自己写的Python脚本(最好有详细注释)。
  1. #!/usr/bin/env python

  2. import time
  3. import sys

  4. if len(sys.argv) > 1:
  5.     INTERFACE = sys.argv[1]
  6. else:
  7.     INTERFACE = 'eth0'

  8. STATS = []
  9. print 'Interface:', INTERFACE

  10. def rx():
  11.     ifstat = open('/proc/net/dev').readlines()
  12.     for interface in ifstat:
  13.         if INTERFACE in interface:
  14.             stat = float(interface.split()[1])
  15.             STATS[0:] = [stat]

  16. def tx():
  17.     ifstat = open('/proc/net/dev').readlines()
  18.     for interface in ifstat:
  19.         if INTERFACE in interface:
  20.             stat = float(interface.split()[9])
  21.             STATS[1:] = [stat]

  22. print ' In              Out'
  23. rx()
  24. tx()

  25. while True:
  26.     time.sleep(1)
  27.     rxstat_o = list(STATS)
  28.     rx()
  29.     tx()
  30.     RX = float(STATS[0])
  31.     RX_0 = rxstat_o[0]
  32.     TX = float(STATS[1])
  33.     TX_0 = rxstat_o[1]
  34.     RX_RATE = round((RX - RX_0)/1024/1024,3)
  35.     TX_RATE = round((TX - TX_0)/1024/1024,3)
  36.     print RX_RATE, 'MB          ', TX_RATE, 'MB         '

  37. 注:
  38. read() :每次读取整个文件,通常用于将 文件内容 放到一个字符串变量中;
  39. .read(): 生成文件内容最直接的字符串表示,但对于连续的面向行的处理 不是必要的;
  40.           且如果文件大于可用内存,则不可能实现此处理;

  41. readline(): 与readlines()不同的是,只能每次读取一行,且速度很慢;
  42.              仅当没有足够内存可以一次读取整个文件时,才应该使用.readline() ;

  43. readlines(): 一次读取整个文件,自动将文件内容分析成一个行的列表,该列表可有Python的for...in...结构进行处理;  速度快;
复制代码

论坛徽章:
0
78 [报告]
发表于 2014-12-02 17:52 |只看该作者
赞一个~

论坛徽章:
0
79 [报告]
发表于 2014-12-03 16:23 |只看该作者
绝世好文,不得不顶

论坛徽章:
3
季节之章:冬
日期:2015-01-15 10:36:57IT运维版块每日发帖之星
日期:2015-09-24 06:20:00IT运维版块每日发帖之星
日期:2015-10-24 06:20:00
80 [报告]
发表于 2014-12-08 11:43 |只看该作者
大学时经常浏览天涯、海南居然有个一个强大的社区。后来进入IT行业后,才了解到这么一个超高PV的网站的后台运维风云人物刘,那时候就在自行开发运维系统,后来跳到腾讯。人生经历值得我们学习,期待佳作。
  你是如何学习Python的?看书?看视频?还是?
   没有经常直接借助PYTHON,一般都是通过基于PYTHON开发的现有开源工具引入实际的工作中。帮助巨大,后面会挑一个例子来说明。 实质接触PYTHON语言开发时间不长,目前在学习阶段(已到函数部分),对比之前学习的php,感觉最明显的时候python的格式化编程风格,会把你的程序看起来层次分明,一下子高大上了许多,从根本上解决了编程习惯不太好的开发者。视频方面也有看不过效果一般,还是习惯看纸张的书,效率高。
     下面来说说工作中接触到的基于python开发的工具。 saltstack,有两点比较看重配置管理+远程执行,目前业界讨论较多的puppet没实战经验,不好比较太多。 用saltstack+git管理了大概15台设备git 作为前端版本控制,saltstack作为状态检查和命令执行来使用,非常好,也有可能我习惯了吧。通过这个实际的应用来说明给我带来的价值吧。
       最希望了解的:工作思路慢慢开始换位思考,开始从自己知道转到让你的主管部门或者其他监督部门知道了解运行状况和带来的价值。希望通过python开发一个图文并茂的报告系统,主要反映系统运行状态。如硬盘的io情况、带宽利用率、会话情况、cpu和内存的具体情况、数据库进程甚至具体到一条数据库语句的运行时占用的时间和资源情况。说的比较笼统,挑几个具体说明下价值。
       例子1,公司有个协同平台,里面有个电子公文管理模块,最近经常有人反映打开公文反映慢,那怎么样直观生动的体现电子公文模块的运行情况呢?定位到慢的具体原因?如是硬盘读写不行了?数据库需要优化了?还是网络带宽不够了?还是图片附件太大加载花了太多时间等等,需要找到实际的监控数据来佐证可能性,根据这些佐证来为以后的优化提供方向。大家都知道采购设备升级现有的系统,是要有为什么要采购的。
       例子2:通过专业互联的公司网络突然中断,老大需要定位此次事故原因,积累运维经验。假如本次事故是人为误操作引起,那怎么确定是人为误操作呢?网络设备稍大的公司交换机n多台,如果有交换机的操作日志的话,这个问题就好办了。利用python开发一个日志收集系统,不需要登录到n台设备上进行查询(另,大部分交换机重启后日志是不保留在交换机中的),可以定位到哪个用户登录,分别执行了什么操作。如果你查询刚好发现a用户登录,刚好他在上联端口上执行了一个shutdown。那就比胡乱猜测是否高效并有说服力的多呢?
   在本书中,希望了解Python的内容:
  第14章 打造Linux系统安全审计功能
     公司有上市打算,想在这个方面学习下。
  第16章 构建桌面版C/S自动化运维平台
     刚好跟我的想法有碰撞,想深入的系统的学习了解下。
  第10章 集中化管理平台Saltstack详解
    刚好有过简单的使用,向大牛门学习他们的经验,估计会很有收获。
第3章 定制业务质量报表详解
    我们目前使用的ntop+cacti做的。感觉离理想的差太多了。

平时也在测试国内一个企业版的卫士(主要是免费嘛)。不过心理没普,跟想要的还是有很大的差距,毕竟这个是侧重终端的情况管理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP