设为首页 收藏本站
查看: 1576|回复: 0

[经验分享] saltstack event 实践

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-2-28 09:29:09 | 显示全部楼层 |阅读模式
今天对官网一个salt event的测试例子进行修改并总结,以更好的理解event这个怎么用法,下面的测试都基于官网的入门步骤来做


测试1:
先在master端写一个python脚本:

1
2
3
4
5
import salt.utils.event
event = salt.utils.event.MasterEvent('/var/run/salt/master')
for eachevent in event.iter_events(full=True):
    print eachevent
    print "------"




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

1
salt '*' test.ping




结果如下:

1
2
3
4
5
6
7
8
9
10
{'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'
结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{'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功能.


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-42816-1-1.html 上篇帖子: 写一个基于saltstack的自动化运维平台 下篇帖子: saltstack的探索-安装vim、nginx服务和配置、自定义脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表