前沿:

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

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

saltstack的event是什么?

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

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

[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

------{'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

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到前端。

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

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

  1. springboot集成webSocket实现实时推送

    springboot集成webSocket实现实时推送 webSocket实现推送 webSocket是什么? 需求说明 websocket集成步骤 pom.xml webSocket实现 自定义处理 ...

  2. VUE+WebSocket实现实时推送

    data() {return {id: 1,webSock: null,lockReconnect: false, //避免重复连接} }, mounted() {// 调取websocket方法 写 ...

  3. Azure SignaIR 将数据从服务器实时推送到Web 和移动浏览器、桌面应用、移动应用等客户端

    本文章完整免费视频讲解地址: Azure SignaIR-向各种客户端实时推送 常规的推送技术:Websocket /服务器发送事件 (SSE) /长轮询等其他技术. ​ SignaIR存在了很长的历 ...

  4. html站内消息列表,WebSocket实现站内消息实时推送

    关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...

  5. nodejs mysql数据推送_使用Nodejs实现实时推送MySQL数据库最新信息到客户端

    下面我们要做的就是把MySQL这边一张表数据的更新实时的推送到客户端,比如MySQL这边表的数据abc变成123了,那使用程序就会把最新的123推送到每一个连接到服务器的客户端.如果服务器的连接的客户 ...

  6. websocket实现GPS数据的实时推送与地图的展示(优化)

    概述 前两天,发布了一片文章websocket实现GPS数据的实时推送与地图的展示,文章发出后引来了不少读者的关注,也有不少读者要求做进步一优化.本文应大家的要求,对上文的内容做一个优化,优化地方包括 ...

  7. 物联网设备数据流转之数据如何实时推送至前端:WebSocket前端接收

    背景 在实现 WebSocket 前端接收前,我们先说明白一件事,为什么要使用WebSocket? 这要从 HTTP 协议说起,我们知道 HTTP 协议只能由客户端发起,而且是短链接,这就会导致我们在 ...

  8. WEB 实时推送技术总结

    前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控.Web 在线通讯.即时报价系统.在线游戏等,都需要将后台发生的变化主动地.实时地传送到浏览器端,而不需要用 ...

  9. Web 实时推送技术如何弥补 HTTP 协议的缺陷? | 技术头条

    作者 | 浪里行舟 责编 | 郭芮 人工智能的现状及今后发展趋势如何?  https://edu.csdn.net/topic/ai30?utm_source=csdn_bw 随着 Web 的发展,用 ...

最新文章

  1. mysql内存爆_线上MySQL机器内存爆掉原因分析与解决
  2. Facebook 宣布改名为Meta,未来重点开发元宇宙!
  3. pycharm安装scrapy失败_Scrapy ——环境搭配与一个简单的例子
  4. Vue中使用LayUI没有效果
  5. Python学习之路day03——010函数(类似Java中的方法)
  6. 逻辑漏洞——会话管理问题
  7. java源码如何启动脚本_使用Shell脚本如何启动/停止Java的jar程序
  8. 综述 | Google团队发布,一文概览Transformer模型的17大高效变种
  9. 本周四直播:Oracle 19c 升级实战分享
  10. flex java 上传下载_完整的Flex多文件上传实例
  11. 120天的努力,从牵引力教育开始逆袭的!
  12. You are running Vue in development mode.Make sure to turn on production mode when deploying for p...
  13. 【note】PAT甲级题目中的单词整理
  14. 茶余饭后聊Spring 一
  15. CCBPM 同表单分合流说明
  16. java生成二维码工具
  17. U盘写保护,不能被格式化
  18. hdoj3085 / acwing177 Nightmare
  19. gopher攻击mysql_从一道CTF题目看Gopher攻击MySql
  20. Magisk root 原理分析之二 :Android Verified Boot (AVB)

热门文章

  1. 出现Field 'ssl_cipher' doesn't have a default value错误怎么解决
  2. Tuxedo 8.110gR3 开发环境的安装与配置
  3. 配置Tomcat时server.xml和content.xml自动还原问题
  4. 第一个C#程序—C#基础回顾
  5. KVM精简教程(七):常用虚拟机管理
  6. tomcat下jndi的三种配置方式
  7. batch size自适应log(1)
  8. [轉]9个优秀的基于 JavaScript 与 CSS 的 Web 图表框架
  9. C++11 原生字符串
  10. Internet地址结构