运维开发: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小时内删除。