saltstack event配合websocket客户端实时推送结果

简介:

前沿:

        以前都是调取一个url的接口,把结果post过去,然后接收post请求的那个函数,会把结果send到指定的websocket客户端,也可以是所有的websocket客户端。


但总是觉得频繁的调用url,然后再send,觉得有些多此一举,还不如用python websocket client直接链接ws长链接,然后直接send就可以了。



saltstack的event是什么? 

我也不长篇大论了,他是saltstack提供的一个事件机制,咱们通过saltstack做的一些实例操作,在event可以体现出现出来。比如,调用调用test.ping 、 cmd.run 。


最明显的log是,创建任务,然后找jid的结果,没有的话,再查。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@devops-ruifengyun bj_lvs2 ]$ python event.py 
{ 'tag' '20140528090741247990' 'data' : { '_stamp' '2014-05-28_09:07:41.248175' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' 'new_job' 'data' : { 'tgt_type' 'glob' 'jid' '20140528090741247990' 'tgt' '10.150.145.51' '_stamp' '2014-05-28_09:07:41.248224' 'user' 'root' 'arg' : [ 'ip a' ],  'fun' 'cmd.run' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' 'salt/job/20140528090741247990/new' 'data' : { 'tgt_type' 'glob' 'jid' '20140528090741247990' 'tgt' '10.150.145.51' '_stamp' '2014-05-28_09:07:41.248250' 'user' 'root' 'arg' : [ 'ip a' ],  'fun' 'cmd.run' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' '20140528090741247990' 'data' : { 'fun_args' : [ 'ip a' ],  'jid' '20140528090741247990' 'return' '1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN \n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n    link/ether 00:0c:29:fe:a4:a1 brd ff:ff:ff:ff:ff:ff\n    inet 10.150.145.51/16 brd 10.150.255.255 scope global eth0\n    inet 10.150.145.55/32 scope global eth0\n    inet 10.150.145.100/32 scope global eth0\n    inet6 fe80::20c:29ff:fefe:a4a1/64 scope link \n       valid_lft forever preferred_lft forever' 'retcode' 0 'success' : True,  'cmd' '_return' '_stamp' '2014-05-28_09:07:41.393589' 'fun' 'cmd.run' 'id' '10.150.145.51' }}
------
{ 'tag' 'salt/job/20140528090741247990/ret/10.150.145.51' 'data' : { 'fun_args' : [ 'ip a' ],  'jid' '20140528090741247990' 'return' '1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN \n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n    link/ether 00:0c:29:fe:a4:a1 brd ff:ff:ff:ff:ff:ff\n    inet 10.150.145.51/16 brd 10.150.255.255 scope global eth0\n    inet 10.150.145.55/32 scope global eth0\n    inet 10.150.145.100/32 scope global eth0\n    inet6 fe80::20c:29ff:fefe:a4a1/64 scope link \n       valid_lft forever preferred_lft forever' 'retcode' 0 'success' : True,  'cmd' '_return' '_stamp' '2014-05-28_09:07:41.393740' 'fun' 'cmd.run' 'id' '10.150.145.51' }}
------
{ 'tag' '20140528090742530725' 'data' : { '_stamp' '2014-05-28_09:07:42.530881' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' 'new_job' 'data' : { 'tgt_type' 'glob' 'jid' '20140528090742530725' 'tgt' '10.150.145.51' '_stamp' '2014-05-28_09:07:42.530922' 'user' 'root' 'arg' : [ 'ip a' ],  'fun' 'cmd.run' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' 'salt/job/20140528090742530725/new' 'data' : { 'tgt_type' 'glob' 'jid' '20140528090742530725' 'tgt' '10.150.145.51' '_stamp' '2014-05-28_09:07:42.530946' 'user' 'root' 'arg' : [ 'ip a' ],  'fun' 'cmd.run' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' '20140528090742530725' 'data' : { 'fun_args' : [ 'ip a' ],  'jid' '20140528090742530725' 'return' '1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN \n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n    link/ether 00:0c:29:fe:a4:a1 brd ff:ff:ff:ff:ff:ff\n    inet 10.150.145.51/16 brd 10.150.255.255 scope global eth0\n    inet 10.150.145.55/32 scope global eth0\n    inet 10.150.145.100/32 scope global eth0\n    inet6 fe80::20c:29ff:fefe:a4a1/64 scope link \n       valid_lft forever preferred_lft forever' 'retcode' 0 'success' : True,  'cmd' '_return' '_stamp' '2014-05-28_09:07:42.655764' 'fun' 'cmd.run' 'id' '10.150.145.51' }}
------
{ 'tag' 'salt/job/20140528090742530725/ret/10.150.145.51' 'data' : { 'fun_args' : [ 'ip a' ],  'jid' '20140528090742530725' 'return' '1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN \n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n    link/ether 00:0c:29:fe:a4:a1 brd ff:ff:ff:ff:ff:ff\n    inet 10.150.145.51/16 brd 10.150.255.255 scope global eth0\n    inet 10.150.145.55/32 scope global eth0\n    inet 10.150.145.100/32 scope global eth0\n    inet6 fe80::20c:29ff:fefe:a4a1/64 scope link \n       valid_lft forever preferred_lft forever' 'retcode' 0 'success' : True,  'cmd' '_return' '_stamp' '2014-05-28_09:07:42.655909' 'fun' 'cmd.run' 'id' '10.150.145.51' }}
------
{ 'tag' '20140528090829833342' 'data' : { '_stamp' '2014-05-28_09:08:29.833516' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' 'new_job' 'data' : { 'tgt_type' 'glob' 'jid' '20140528090829833342' 'tgt' '10.150.145.51' '_stamp' '2014-05-28_09:08:29.833566' 'user' 'root' 'arg' : [ 'sleep 3;ip a' ],  'fun' 'cmd.run' 'minions' : [ '10.150.145.51' ]}}
------


在这里也可以看到他获取结果的思路:

创建一个任务及jid,然后每次去看看刚才(sleep 30;ip a ) 的结果,每隔五秒轮寻一次结果。每次去saltutil.find_job的jid是相同的,不同的是saltutil.find_job他本身的任务号。


原文: http://rfyiamcool.blog.51cto.com/1030776/1418208


1
2
3
4
5
6
7
8
9
10
11
------
 
{ 'tag' 'new_job' 'data' : { 'tgt_type' 'glob' 'jid' '20140528092216402264' 'tgt' '10.150.145.51' '_stamp' '2014-05-28_09:22:16.402889' 'user' 'root' 'arg' : [ '20140528092151158538' , { '__kwarg__' : True}],  'fun' 'saltutil.find_job' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' 'salt/job/20140528092216402264/new' 'data' : { 'tgt_type' 'glob' 'jid' '20140528092216402264' 'tgt' '10.150.145.51' '_stamp' '2014-05-28_09:22:16.402975' 'user' 'root' 'arg' : [ '20140528092151158538' , { '__kwarg__' : True}],  'fun' 'saltutil.find_job' 'minions' : [ '10.150.145.51' ]}}
------
{ 'tag' '20140528092216402264' 'data' : { 'fun_args' : [ '20140528092151158538' , { '__kwarg__' : True}],  'jid' '20140528092216402264' 'return' : { 'tgt_type' 'glob' 'jid' '20140528092151158538' 'tgt' '10.150.145.51' 'pid' 30325 'ret' '' 'user' 'root' 'arg' : [ 'sleep 30;ip a' ],  'fun' 'cmd.run' },  'retcode' 0 'success' : True,  'cmd' '_return' '_stamp' '2014-05-28_09:22:16.470647' 'fun' 'saltutil.find_job' 'id' '10.150.145.51' }}
------
{ 'tag' 'salt/job/20140528092216402264/ret/10.150.145.51' 'data' : { 'fun_args' : [ '20140528092151158538' , { '__kwarg__' : True}],  'jid' '20140528092216402264' 'return' : { 'tgt_type' 'glob' 'jid' '20140528092151158538' 'tgt' '10.150.145.51' 'pid' 30325 'ret' '' 'user' 'root' 'arg' : [ 'sleep 30;ip a' ],  'fun' 'cmd.run' },  'retcode' 0 'success' : True,  'cmd' '_return' '_stamp' '2014-05-28_09:22:16.470789' 'fun' 'saltutil.find_job' 'id' '10.150.145.51' }}
------
{ 'tag' '20140528092151158538' 'data' : { 'fun_args' : [ 'sleep 30;ip a' ],  'jid' '20140528092151158538' 'return' '1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN \n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n    link/ether 00:0c:29:fe:a4:a1 brd ff:ff:ff:ff:ff:ff\n    inet 10.150.145.51/16 brd 10.150.255.255 scope global eth0\n    inet 10.150.145.55/32 scope global eth0\n    inet 10.150.145.100/32 scope global eth0\n    inet6 fe80::20c:29ff:fefe:a4a1/64 scope link \n       valid_lft forever preferred_lft forever' 'retcode' 0 'success' : True,  'cmd' '_return' '_stamp' '2014-05-28_09:22:21.281017' 'fun' 'cmd.run' 'id' '10.150.145.51' }}



对于websocket把结果打到前端,咱们就直接用websocket客户端搞~


websocket模块的地址在,https://github.com/liris/websocket-client.git


pip install https://github.com/liris/websocket-client.git

cd webso*

python setup.py install


1
2
3
4
5
6
7
8
9
from websocket  import  create_connection
ws = create_connection( "ws://localhost:8888/ws" )
print  "Sending 'Hello, World'..."
ws.send( "Hello, World" )
print  "Sent"
print  "Reeiving..."
result =  ws.recv()
print  "Received '%s'"  % result
ws.close()


原文: http://rfyiamcool.blog.51cto.com/1030776/1418208


event和websocket结合就可以了,event的结果有些乱,可以预先把任务的jid放到list里面,然后每次去遍历数据,send到前端。


这篇文章,写的有些泛泛,大家图个新鲜就好 ~




 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1418208 ,如需转载请自行联系原作者

相关文章
|
1月前
|
Java
SpringBoot快速搭建WebSocket服务端和客户端
由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程。
140 1
|
8月前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
1916 1
|
8月前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
392 7
|
网络协议 JavaScript 前端开发
WebSocket:实现客户端与服务器实时通信的技术
WebSocket:实现客户端与服务器实时通信的技术
|
前端开发 JavaScript Java
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
|
移动开发 网络协议 JavaScript
web客户端websocket
web客户端websocket
197 1
|
网络协议 Go API
php-websocket hyperf/websocket-server/client 客户端和服务器实时双向数据传输
php-websocket hyperf/websocket-server/client 客户端和服务器实时双向数据传输
454 0
|
JSON Java API
Java 编程问题:十三、HTTP 客户端和 WebSocket API
Java 编程问题:十三、HTTP 客户端和 WebSocket API
433 0
|
存储 Java
WebSocket区分不同客户端方法
WebSocket区分不同客户端方法
536 0
使用WebSocket实现服务端和客户端的通信
使用WebSocket实现服务端和客户端的通信
137 0