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

[经验分享] python用c/s实现服务器简单管理

[复制链接]

尚未签到

发表于 2018-8-12 09:49:46 | 显示全部楼层 |阅读模式
背景:
  由于有大量的windows虚拟机用来做一些任务。这些windows上的机器程序要经常更新。每次部署升级,需要一台台的远程桌面上去操作,进行简单升级操作。这样讲花费大量时间。并且伴随windows机器的增加,将更加难管理。

目标:
  无需远程桌面,即可完成基本操作,如:部署升级程序,远程启动及停止代理服务,重启,关机等。

解决方法:
  采用python socket 的C/S形式来实现,在管理端发送管理命令到被管理端执行,进行更新程序代码等操作。需在windows机器上安装python。实现代码如下:
  1、以下是server端,部署到被管理的windows或者linux机器
  


  • #!/usr/bin/python
  • #Script Name : pyserver.py

  • import os
  • import logging
  • import sys
  • import socket

  • host='0.0.0.0'
  • port=4567
  • maxclient=10
  • if sys.platform == 'win32':
  •     logfile='c:/server.log'
  • else:
  •     logfile='/tmp/server.log'

  • def initlog():
  •     logger=logging.getLogger()
  •     hdlr=logging.FileHandler(logfile)
  •     formatter=logging.Formatter('%(asctime)s %(levelname)s %(message)s')
  •     hdlr.setFormatter(formatter)
  •     logger.addHandler(hdlr)
  •     logger.setLevel(logging.NOTSET)
  •     return logger

  • def socketserver():
  •     s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  •     s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  •     s.bind((host,port))
  •     s.listen(maxclient)
  • #    print "Server is running on port %d; press ctrl-c to terminate." % port
  •     while True:
  •         clientsock,clientaddr=s.accept()
  • #        print "connect from %s" % str(clientaddr)
  •         message="connect from : %s" % str(clientaddr)
  •         lg.info(message)
  •         clientfile=clientsock.makefile('rw',0)
  •         data=clientsock.recv(1024)
  •         message="Execute command : %s" %data
  •         lg.info(message)
  •         command=os.popen(data).read()
  •         clientfile.write("%s" % command)
  •         clientfile.close()
  •         clientsock.close()

  • try:
  •     lg=initlog()
  •     socketserver()
  • except KeyboardInterrupt:
  •     print "User Press Ctrl+C,Exit"
  

  2、以下是管理端,用于发送命令到被管理端
  


  • #!/usr/bin/env python
  • #Script Name : pyclient.py

  • import os
  • import sys
  • import getopt
  • import socket
  • import logging
  • import time

  • port=4567
  • logfile='/tmp/client.log'
  • file=''
  • ip=''

  • def initlog():
  •     logger=logging.getLogger()
  •     hdlr=logging.FileHandler(logfile)
  •     formatter=logging.Formatter('%(asctime)s %(levelname)s %(message)s')
  •     hdlr.setFormatter(formatter)
  •     logger.addHandler(hdlr)
  •     logger.setLevel(logging.NOTSET)
  •     return logger

  • def usage():
  •     print '''
  • Usage: python client.py [options...]
  • Options:
  •     -f : read host list from file
  •     -I : read host from this command line
  •     -c : command run at remote host
  •     -h : this help info
  •     python client.py -I 10.16.134.164 -c "/sbin/ifconfig"
  •     '''

  • def socketclient(IP,port,cmd):
  •     s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  •     s.connect((IP,port))
  •     ISOTIMEFORMAT = '%Y-%m-%d %X'
  •     date = time.strftime(ISOTIMEFORMAT, time.localtime())
  •     result ="-------------------------------------------------------------------\n"
  •     result = "%sDATE    : %s\nHOST    : %sCOMMAND : %s\n" %(result,date,IP,cmd)
  •     while 1:
  •         if not cmd:
  •             break
  •         s.sendall(cmd)
  •         cmd=s.recv(1024)
  •         if not cmd:
  •             break
  •         #print cmd
  •         result = "%sRESULT  :\n\n%s" %(result,cmd)
  •         print result
  •         writeLog(logfile,result)
  •     s.close()

  • def writeLog(file,message):
  •     logger = open(file, 'a+')
  •     logger.writelines(message)
  •     logger.close()

  • try:
  •     opts,args = getopt.getopt(sys.argv[1:],'hI:f:c:')
  • except getopt.GetoptError:
  •     usage()
  •     sys.exit()

  • if len(opts) == 0:
  •     usage()
  •     sys.exit()

  • for opt,arg in opts:
  •     if opt in ('-h','--help'):
  •         usage()
  •         sys.exit()
  •     elif opt == '-f':
  •         #print 'read flie %s' %arg
  •         file = arg
  •     elif opt == '-I':
  •         #print 'server IP is %s' %arg
  •         ip = arg
  •     elif opt == '-c':
  •         #print 'command is %s' %arg
  •         command = arg


  • if file:
  •     for ip in os.popen('cat %s' %file).readlines():
  •         socketclient(ip,port,command)
  • else:
  •     if ip :
  •         socketclient(ip,port,command)
  •     else:
  •         print '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-550480-1-1.html 上篇帖子: python写个三角形的问题 下篇帖子: Python算法题----最大公约数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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