运维开发:pythonwebsocket⽹页实时显⽰远程服务器⽇志信息功能:⽤websocket技术,在运维⼯具的浏览器上实时显⽰远程服务器上的⽇志信息
⼀般我们在运维⼯具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显⽰程序⽇志给开发⼈员看。你还在⽤ajax每隔段时间去获取服务器⽇志?out了,试试⽤websocket⽅式吧
我⽤bottle框架,写了个websocket服务端,浏览器连接到websocket server,再⽤python subprocess获取远程服务器的⽇志信
息,subprocess,就是⽤Popen调⽤shell的shell命令⽽已,这样可以获取到实时的⽇志了,然后再send到websocket server中,那连接到websocket server的浏览器,就会实时展现出来了websocket和socket
⽤⼆台服务器来实现这个场景,A服务器是websocket服务端,B服务器是⽇志端
A服务器是我浏览器本机,websocket服务端也是这台机,IP是:192.168.1.221
B服务器是要远程查看⽇志的服务器,我这⾥⽤:192.168.1.10
以下是A服务器的websocket servet的python代码:
1. #!/usr/bin/env python
2. #coding=utf-8
3. # __author__ = '戴儒锋'
4. # www.linuxyw
5.
6. """
7. 执⾏代码前需要安装
8. pip install bottle
9. pip install websocket-client
10. pip install bottle-websocket
11. """
12. from bottle import get, run
13. websocket import GeventWebSocketServer
14. websocket import websocket
15.
16. users = set() # 连接进来的websocket客户端集合
17. @get('/websocket/', apply=[websocket])
18. def chat(ws):
19. users.add(ws)
20. while True:
21. msg = ws.receive() # 接客户端的消息
22. if msg:
23. for u in users:
24. u.send(msg) # 发送信息给所有的客户端
25. else:
26. break
27. # 如果有客户端断开连接,则踢出users集合
28. ve(ws)
29. run(host='0.0.0.0', port=8000, server=GeventWebSocketServer)
记得安ottle、websocket-client 、bottle-websocket 模块,服务端允许所有的IP访问其8000端⼝
websocket服务端除了⽤以上的⽅法外,还可以⽤这下⾯的⽅法实现:
⾸页 亲,你迷路了!
亲,你迷路了!
亲,该⽹页可能搬家了!
输⼊搜索内容
在电脑桌⾯,写⼀个简单的HTML5 javascripts页⾯,随便命名了,如web_socket.html,这个页⾯使⽤了websocket连接到websocket服务端:
1. <!DOCTYPE html>
2. <html>
3. <head>
4. </head>
5. <style>
6. #msg{
7. width:400px; height:400px; overflow:auto; border:2px solid #000000;color:#ffffff;
8. }
9. </style>
10. </head>
11.
12. <body>
13. <p>实时⽇志</p>
14. <div id="msg"></div>
15. <script src="libs.baidu/jquery/1.9.1/jquery.min.js"></script>
16. <script>
17. $(document).ready(function() {
18. /* !window.WebSocket、window.MozWebSocket检测浏览器对websocket的⽀持*/
19. if (!window.WebSocket) {
20. if (window.MozWebSocket) {
21. window.WebSocket = window.MozWebSocket;
22. } else {
23. $('#msg').prepend("<p>你的浏览器不⽀持websocket</p>");
24. }
25. }
26.
27. /* ws = new WebSocket 创建WebSocket的实例注意设置对以下的websocket的地址哦*/
28. ws = new WebSocket('ws://192.168.1.221:8000/websocket/');
29.
30. /*
31. ws.onopen 握⼿完成并创建TCP/IP通道,当浏览器和WebSocketServer连接成功后,会触发onopen消息
32. ws.onmessage 接收到WebSocketServer发送过来的数据时,就会触发onmessage消息,参数evt中包含server传输过来的数据;
33. */
34. ws.onopen = function(evt) {
35. $('#msg').append('<li>websocket连接成功</li>');
36. }
37. ws.onmessage = function(evt) {
38. $('#msg').prepend('<li>' + evt.data + '</li>');
39. }
40. });
41. </script>
42. </body>
43. </html>
注意:WebSocket('ws://192.168.1.221:8000/websocket/'); 这⾥的192.168.1.221⼀定要改成你的websocket服务端IP,切记
到这⾥,就搞定浏览器连接到websocket服务端的场景了,现在要A服务器⾥写⼀段代码,去采集B服务器的实时信息了,其实采集原理很简单,就是使⽤shell中的tailf命令,实时显⽰最新的信息⽽已,我们在这段脚本中,使⽤subprocess.Popen()来远程查看⽇志信息:
python代码如下:
1. #!/usr/bin/python
2. # encoding=utf-8
3.
4. import subprocess
5. import time
6. from websocket import create_connection
7.
8. # 配置远程服务器的IP,帐号,密码,端⼝等,因我做了双机密钥信任,所以不需要密码
9. r_user = "root"
10. r_ip = "192.168.1.10"
11. r_port = 22
12. r_log = "/tmp/web_socket.log" # 远程服务器要被采集的⽇志路径
13.
14. # websocket服务端地址
15. ws_server = "ws://192.168.1.221:8000/websocket/"
16.
17. # 执⾏的shell命令(使⽤ssh远程执⾏)
18. cmd = "/usr/bin/ssh -p {port} {user}@{ip} /usr/bin/tailf {log_path}".format(user=r_user,ip=r_ip,port=r_port,log_path=r_log)
19.
20. def tailfLog():
21. """获取远程服务器实时⽇志,并发送到websocket服务端"""
22. popen = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
23. print('连接成功')
24. ws = create_connection(ws_server) # 创建websocket连接
25. while True:
26. line = adline().strip() #获取内容
27. if line:
28. ws.send(line) #把内容发送到websocket服务端
29. print time.time()
30.
31. if __name__ == '__main__':
32. tailfLog()
⽂章最后再解析subprocess.Popen的原理和功能
执⾏websocket服务端脚本和上⾯这个websocket客户端采集脚本,再打开⽤浏览器打开上⾯的html5页⾯后,环境就基本部署好了,双websocket客户端连接到websocket服务端中
上⾯脚本指定的r_log = "/tmp/web_socket.log"⽇志路径,我们需要⽣成这个⽇志⽂件,并不停地往⾥⾯写⼊⽇志,这样才能在浏览器中实时显⽰效果(真实场景中,可以指定服务器某⽇志,如apache,nginx⽇志等)
我们在B服务器写⼀段python代码,然后每隔⼀秒就往r_log = "/tmp/web_socket.log"⽇志中写⼊内容:
python代码如下:
1. #!/usr/bin/env python
2. #coding=utf-8
3.
4. import time
5. import random
6. log_path = '/tmp/web_socket.log'
7. while 1:
8. with open(log_path,'a') as f:
9. f.write('[%s] %s \n' % (ime(),random.random()))
10. time.sleep(1)
脚本写⼊的内容⼤概是:
[Tue Jul 26 18:30:41 2016] 0.527242649654
[Tue Jul 26 18:30:42 2016] 0.21080845298
[Tue Jul 26 18:30:43 2016] 0.23128691356
[Tue Jul 26 18:30:44 2016] 0.689547600796
执⾏这段脚本,然后看浏览器效果:
这只是我临时写的,如果要在真实的运维⼯具中使⽤,还需要根据具体情况,修改不少内容,但原理就是这样,⼤家可根据⾃⼰的情况修改,完善使⽤。
刚才提到subprocess.Popen的原理和功能,请看以下资料:
bottle websocket参考资料:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论