码迷,mamicode.com
首页 > 其他好文 > 详细

event学习

时间:2014-07-23 00:28:28      阅读:390      评论:0      收藏:0      [点我收藏+]

标签:event   saltstack   

近期在学习saltstack的event模块,发现这个模块用处很大。于是乎将这个模块的知识总结下,方便后面学习使用。

原理:基于本地的zeromq pub和pull socket。

作用:(自己的理解)

1、结合returner用作审计。

2、结合reactor用作触发器。

3、用于第三方程序。


先在master上开启event监听,运行ipython,执行如下代码:

import sys
sys.path.append("/opt/app/salt/lib/python2.6/site-packages")
import salt
event = salt.utils.event.MasterEvent("/opt/app/salt/run/master")
for eachevent in event.iter_events(full=True):
    print eachevent
    print ‘------------------------‘

bubuko.com,布布扣

这个是执行结果,每条数据是个字典,每条数据就是个event事件,每个event事件是由tag和data两部分组成。只要看tag以"salt/job"开头的就行了,其他的是为了兼容旧版本产生的信息。salt/new/jid/new表示任务信息,包含jid、目标minions等等。salt/job/jid/ret/id表示minion返回的结果,包含任务是否成功执行的信息。


我们在master执行这个命令:

salt ‘192.168.110.132‘ cmd.run ‘sleep 6;echo "haha"‘

bubuko.com,布布扣

上面的结果是怎么回事呢?下面来解释下(这里需要多谢saltstack中国用户组的帮助)


首先master下发命令后,会等待timeout时间(默认5s,可以在配置里设置),如果所有minion在这个时间内都返回了结果,则直接退出,如果有minion超过timeout事件还没有返回,则会自动触发一个saltutil.find_job任务,会向所有minion发送,去检查任务是否执行。如果minion返回任务正在执行的结果,则master再等待一个timeout周期,如果期间返回了执行结果则退出,否则这样一直循环。如果期间触发的find_job任务没有返回结果,则认为任务没有执行,认为minion出现问题,不再通信。


上面监听event时,有个对象是event,看了源代码之后,发现主要的方法:get_event,iter_events,fire_event。在ipython中可以直接看出来的。


get_event(wait=5,tag=‘‘,full=False,use_pending=False),这个方法默认等待5s就退出了,默认监听所有事件,full=True代表返回tag和data的完整信息,full=False表示只返回data信息,use_pending=True表示将信息写入列表中,会消耗很大的内存,不会使用的。

bubuko.com,布布扣

iter_events(tag=‘‘,full=False),这个方法产生一个生成器,长期用于过滤某些事件,默认是过滤所有事件。


fire_event(data,tag,timeout=1000),这个方法用于触发一个event事件,timeout是zeromq的连接过期时间,单位是ms。data必须是字典,tag表示标签。

触发事件代码:

import sys
sys.path.append("/opt/app/salt/lib/python2.6/site-packages")

import salt.utils.event
sock_dir = ‘/opt/app/salt/run/master‘
payload = {‘sample-msg‘: ‘this is a test‘,
           ‘example‘: ‘this is the same test‘}

event = salt.utils.event.SaltEvent(‘master‘, sock_dir)
event.fire_event(payload, ‘tag‘)


监听结果:

bubuko.com,布布扣


也可以使用命令行触发

salt-call event.fire ‘{"data":"haha"}‘ ‘tag‘


上面用的都是/opt/app/salt/run/master里的socket,那/opt/app/salt/run/minion的socket怎么使用。这里需要涉及到minion的id

import sys
sys.path.append("/opt/app/salt/lib/python2.6/site-packages")

import salt
event = salt.utils.event.SaltEvent(‘minion‘, ‘/opt/app/salt/run/minion‘,id=‘haha‘)
for eachevent in event.iter_events(full=True):                  
    print eachevent                                             
    print ‘------------------------‘


在id为‘haha‘的minion端触发两个事件

/opt/app/salt/bin/salt-call event.fire ‘{"data":"haha"}‘ ‘tag‘

/opt/app/salt/bin/salt-call event.fire_master ‘{"data":"haha"}‘ ‘tag‘

执行结果如下:

bubuko.com,布布扣

会发现两个的tag不一样,第一个是event.fire执行的结果,第二个是event.fire_master的执行结果。

区别:event.fire是在minion触发一个本地的event,而event.fire_master是从minion触发一个远程的event,这个event会发送到master上,也就是说master的标签是tag,而minion接受的事件tag是fire_master,至于为什么是fire_master,这个是源代码(salt/modules/event.py)里写死的。

本文出自 “fly天地” 博客,请务必保留此出处http://liuping0906.blog.51cto.com/2516248/1441417

event学习

标签:event   saltstack   

原文地址:http://liuping0906.blog.51cto.com/2516248/1441417

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!