saltstack event 实践

今天对官网一个salt event的测试例子进行修改并总结,以更好的理解event这个怎么用法,下面的测试都基于官网的入门步骤来做

测试1:

先在master端写一个python脚本:

import salt.utils.event
event = salt.utils.event.MasterEvent(‘/var/run/salt/master‘)
for eachevent in event.iter_events(full=True):
    print eachevent
    print "------"

另外开一个终端,再执行命令:

salt ‘*‘ test.ping

结果如下:

{‘tag‘: ‘20150227111546144547‘, ‘data‘: {‘_stamp‘: ‘2015-02-27T11:15:46.145663‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘new_job‘, ‘data‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227111546144547‘, ‘tgt‘: ‘*‘, ‘_stamp‘: ‘2015-02-27T11:15:46.147099‘, ‘user‘: ‘root‘, ‘arg‘: [], ‘fun‘: ‘test.ping‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘salt/job/20150227111546144547/new‘, ‘data‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227111546144547‘, ‘tgt‘: ‘*‘, ‘_stamp‘: ‘2015-02-27T11:15:46.148181‘, ‘user‘: ‘root‘, ‘arg‘: [], ‘fun‘: ‘test.ping‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘20150227111546144547‘, ‘data‘: {‘fun_args‘: [], ‘jid‘: ‘20150227111546144547‘, ‘return‘: True, ‘retcode‘: 0, ‘success‘: True, ‘cmd‘: ‘_return‘, ‘_stamp‘: ‘2015-02-27T11:15:46.216332‘, ‘fun‘: ‘test.ping‘, ‘id‘: ‘gs-ssh‘}}
------
{‘tag‘: ‘salt/job/20150227111546144547/ret/gs-ssh‘, ‘data‘: {‘fun_args‘: [], ‘jid‘: ‘20150227111546144547‘, ‘return‘: True, ‘retcode‘: 0, ‘success‘: True, ‘cmd‘: ‘_return‘, ‘_stamp‘: ‘2015-02-27T11:15:46.218268‘, ‘fun‘: ‘test.ping‘, ‘id‘: ‘gs-ssh‘}}
------

从输出结果看, 对于tag只是jid的, 官方在源码中标记的注释是"old dup event", 推测是为了兼容旧的event系统(0.17.0版本event系统进行了更新), 本次对其不做处理. 下发任务对应的tag为 new_job, 并且下发任务时就master端就在event中注定了那些minions需要运行(对应的data字典中的minions). 如果tag中包含 salt/job/ 字样并且data字典中 return 为True, 则表示该Event是minion返回的结果.

测试2:

超过timeout设置(默认为5秒)的任务:

执行命令:

salt ‘*‘ cmd.run ‘sleep 6; echo hello world‘

结果如下:

{‘tag‘: ‘20150227113729719091‘, ‘data‘: {‘_stamp‘: ‘2015-02-27T11:37:29.720087‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘new_job‘, ‘data‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227113729719091‘, ‘tgt‘: ‘gs*‘, ‘_stamp‘: ‘2015-02-27T11:37:29.722007‘, ‘user‘: ‘root‘, ‘arg‘: [‘sleep 6; echo hello world‘], ‘fun‘: ‘cmd.run‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘salt/job/20150227113729719091/new‘, ‘data‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227113729719091‘, ‘tgt‘: ‘gs*‘, ‘_stamp‘: ‘2015-02-27T11:37:29.723067‘, ‘user‘: ‘root‘, ‘arg‘: [‘sleep 6; echo hello world‘], ‘fun‘: ‘cmd.run‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘20150227113734739021‘, ‘data‘: {‘_stamp‘: ‘2015-02-27T11:37:34.739470‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘new_job‘, ‘data‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227113734739021‘, ‘tgt‘: ‘gs*‘, ‘_stamp‘: ‘2015-02-27T11:37:34.740245‘, ‘user‘: ‘root‘, ‘arg‘: [‘20150227113729719091‘], ‘fun‘: ‘saltutil.find_job‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘salt/job/20150227113734739021/new‘, ‘data‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227113734739021‘, ‘tgt‘: ‘gs*‘, ‘_stamp‘: ‘2015-02-27T11:37:34.740498‘, ‘user‘: ‘root‘, ‘arg‘: [‘20150227113729719091‘], ‘fun‘: ‘saltutil.find_job‘, ‘minions‘: [‘gs-ssh‘]}}
------
{‘tag‘: ‘20150227113734739021‘, ‘data‘: {‘fun_args‘: [‘20150227113729719091‘], ‘jid‘: ‘20150227113734739021‘, ‘return‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227113729719091‘, ‘tgt‘: ‘gs*‘, ‘pid‘: 24526, ‘ret‘: ‘‘, ‘user‘: ‘root‘, ‘arg‘: [‘sleep 6; echo hello world‘], ‘fun‘: ‘cmd.run‘}, ‘retcode‘: 0, ‘success‘: True, ‘cmd‘: ‘_return‘, ‘_stamp‘: ‘2015-02-27T11:37:34.806601‘, ‘fun‘: ‘saltutil.find_job‘, ‘id‘: ‘gs-ssh‘}}
------
{‘tag‘: ‘salt/job/20150227113734739021/ret/gs-ssh‘, ‘data‘: {‘fun_args‘: [‘20150227113729719091‘], ‘jid‘: ‘20150227113734739021‘, ‘return‘: {‘tgt_type‘: ‘glob‘, ‘jid‘: ‘20150227113729719091‘, ‘tgt‘: ‘gs*‘, ‘pid‘: 24526, ‘ret‘: ‘‘, ‘user‘: ‘root‘, ‘arg‘: [‘sleep 6; echo hello world‘], ‘fun‘: ‘cmd.run‘}, ‘retcode‘: 0, ‘success‘: True, ‘cmd‘: ‘_return‘, ‘_stamp‘: ‘2015-02-27T11:37:34.806801‘, ‘fun‘: ‘saltutil.find_job‘, ‘id‘: ‘gs-ssh‘}}
------
{‘tag‘: ‘20150227113729719091‘, ‘data‘: {‘fun_args‘: [‘sleep 6; echo hello world‘], ‘jid‘: ‘20150227113729719091‘, ‘return‘: ‘hello world‘, ‘retcode‘: 0, ‘success‘: True, ‘cmd‘: ‘_return‘, ‘_stamp‘: ‘2015-02-27T11:37:35.814281‘, ‘fun‘: ‘cmd.run‘, ‘id‘: ‘gs-ssh‘}}
------
{‘tag‘: ‘salt/job/20150227113729719091/ret/gs-ssh‘, ‘data‘: {‘fun_args‘: [‘sleep 6; echo hello world‘], ‘jid‘: ‘20150227113729719091‘, ‘return‘: ‘hello world‘, ‘retcode‘: 0, ‘success‘: True, ‘cmd‘: ‘_return‘, ‘_stamp‘: ‘2015-02-27T11:37:35.814502‘, ‘fun‘: ‘cmd.run‘, ‘id‘: ‘gs-ssh‘}}
------

除了之前test.ping测试类似的输出外, 可以看到tag为 new_job 的event产生后的5秒, 自动产生了一个fun值为 saltutil.find_job, 其arg为之前new_job的jid的event. 然后minion返回之前运行的fun值为 cmd.run 对应的进行运行信息(pid等信息, 已确保任务正在被执行).

salt对应的处理机制:

1.master在下发指令后,如果在设置的timeout时间内, 所有minion均返回了结果, 则直接退出.

2.如果达到timeout时间(默认是5s)后, 依然有minion没有返回结果, 则自动触发一个 saltutil.find_job 的任务, 去所有minion上查询该任务是否在执行.

3.如果minion返回任务当前正在执行中, 则等待一个新的timeout周期, 如果期间所有minion均返回了结果, 则退出;

依次类推, 一直等到直到所有minion均返回结果. 如果期间在触发saltutil.find_job 时minion并没有返回任务的执行状况, 且之前并没有返回结果, 则认为minion出现问题, 就会输出"Minion did not return" 字样(可以通过salt -v参数查询到).

从该机制中可以知道, 如果经常出现minion无法返回结果的情况, 对于某些场景如规模较大或minion高负载的情况下, 达到设置的timeout时间时, 自动触发 saltutil.find_job 任务, 而minion此时并没有开始运行之前下发的任务. 导致master直接认为"Minion did not return". 此时需要增大timeout的值(可以修改master的配置文件中的timeout选项)

同时由于master会自动触发 saltutil.find_job 任务, 而该任务也会记入Event系统, 所以对于如Halite等第三方系统, 执行长时间的任务时, 你会发现大量的 saltutil.find_job 操作, 此为正常现象, 无需处理。

总结:

Salt提供了强大的Event系统, 第三方程序可以轻松插入Event系统, 捕获当前Salt的运行状态, 易于扩展Salt功能.

时间: 2024-10-13 10:11:46

saltstack event 实践的相关文章

saltstack(七)返回值

一.自定义创建模块 在base目录下创建_modules目录,你自己编写的模块都可以存放在该目录下,当前目录结构下: 1 2 3 4 5 6 7 8 [[email protected]:]# tree -L 3 salt salt ├── etc ├── _grains │   ├── dmp_scribe.py │   └── zabbix_conf.py ├── _modules │   └── ip.py 通过上图可以看到已经创建了一个名为ip.py文件,看看相关内容: 1 2 3 4

saltstack 实验(小弟不才)

原理: minion端和master端认证的原理 Master与Minion认证(1).minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master. (2).master在接收到minion的public key后,通过salt-key命令accept minion public

基于Salt Event系统构建Master端returner

前置阅读 环境说明 开工 前置配置 编写returner 测试 SaltStack 的 returner 是由minion端主动连接returner完成执行结果的存储, 在部分场景下并不能满足需求. 由于Salt底层已经构建了一套 Event系统, 所有的操作均会产生event. 因此基于Salt Event系统构建Master端returner成为一种可能. 之前已经完成了 SaltStack Event系统监听events测试, 本文将基于Salt Event系统构建Master端retur

C#学习日记24----事件(event)

事件为类和类的实例提供了向外界发送通知的能力,实现了对象与对象之间的通信,如果定义了一个事件成员,表示该类型具有 1.能够在事件中注册方法 (+=操作符实现). 2.能够在事件中注销方法(-=操作符实现). 3.当事件被触发时注册的方法会被通知(事件内部维护了一个注册方法列表).委托(Delegate)是事件(event)的载体,要定义事件就的要有委托.  有关委托的内容请点击 委托(De... www.mafengwo.cn/event/event.php?iid=4971258www.maf

学习Linux(必看经典)牛人40天精通Linux运维的学习方法

学习Linux(必看经典)牛人40天精通Linux运维的学习方法 简介:linux运维人才是企业目前急需的技术人才之一,从从事linux运维的工作,本系列整理的视频课程是你不可或缺的要学习的内容,学习时,建议做好笔记,画好图,勤加练习,多和同学交流讨论,则可成大器.  Linux职业路线图 企业Linux高薪运维实战必会精品学习路线图 http://edu.51cto.com/roadmap/view/id-62.html 简介:如果你,认真学习完,并掌握了本课程,即可掌握企业的实战运维的基本应

双十二老男孩教育51视频全场福利大回馈!

双十二老男孩教育福利大回馈! 1.老男孩教育在51CTO全部课程视频5-6折 2.购买交易总额超过300的课程赠老男孩老师1月份出版的新书一本(带签名) 3.双十二当天购课消费返金币(51CTO学院承担) 满1212元返112金币, 满2121元返212金币 4.即日起分享下面的地址活动帖子,截图发给客服(QQ:4008519651 或点击下方汇总主页右下方咨询按钮)即可领取50金币优惠券!(购买150金币及以上课程抵扣50金币)客服MM将在24小时内发放优惠券到您账户,节假日顺延(一个账户送一

linux运维之路

Linux入门必备内容 成为一个优秀的linux运维人员必要条件 如何能高标准的掌握linux运维实战技术 计算机硬件组成.工作原理 CPU.内存.磁盘.raid卡生产工作标准详解 企业生产主流品牌服务器及型号内部拆卸讲解 操作系统cache与buffer的原理及硬件设计哲学 结合企业生产实战运维场景如何利用硬件优化 操作系统.Unix及Linux介绍 linux操作系统种类及运维人员选择建议 CentOS Linux原理深入.安装 Linux入门知识进阶 远程连接工具原理及使用 编辑工具 比较

双11,老男孩教育精品视频全场5折之后再折上折!

双11当天购买老男孩教育精品视频课程.套餐及会员卡,满额送大礼包: 满888元:送小号无忧熊+数据线+50元优惠券1张+200元面授优惠劵1张 满1288元:送中号无忧熊+定制版帽衫+数据线+50元优惠券2张+400元面授优惠劵1张 满1588元:送大号无忧熊+定制版帽衫+数据线+50元优惠券3张+600元面授优惠劵1张 满2888元:送全家福无忧熊+定制版帽衫+数据线+50元优惠券3张+100元优惠券1张+1000元面授优惠劵1张 4888元以上:送全家福无忧熊+定制版帽衫+数据线+50元优惠

AngularJs实战

放弃了IE8,引入了单项数据绑定,删掉了过时的API 四大核心特性:MVC.模块化module.指令系统.双向数据绑定 1.小例子介绍: 1.MVC 是一种手段,为了模块化和复用. HelloAngular_MVC.html <!doctype html> <html ng-app> <head> <meta charset="utf-8"> </head> <body> <div ng-controller