salt的Event和Reactor
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
除了提供以结构化的方法进行配置管理的功能外,salt也提供了许多其它的功能,例如Event系统和Reactor系统。在salt中,Event系统为基础的通信方式。Reactor系统允许我们根据接收到的特定的Event,来进行特定的操作。
salt的event系统
在salt中,event系统通过event bus在minions和masters上传递需要的数据。Events是非常简单的数据结构。每个Events中,都包含一个ID和其相应的数据。这个Event ID称为tag,它的格式与文件系统非常类似,是一个层次结构,以“/”分隔不同的层次。可以通过在master上,使用state.event的runner来查看event:
[root@centos7-A ~]# salt-run state.event pretty=True
这时此命令会阻塞,等待事件的到来。在打开另一个终端后,通过sudo salt ‘centos7-A’ test.ping发送一个命令,在此终端上可以看到下面的输出:
20161031111459171418 {
"_stamp": "2016-10-31T03:14:59.216257",
"minions": [
"centos7-A"
]
}
salt/job/20161031111459171418/new {
"_stamp": "2016-10-31T03:14:59.243522",
"arg": [],
"fun": "test.ping",
"jid": "20161031111459171418",
"minions": [
"centos7-A"
],
"tgt": "centos7-A",
"tgt_type": "glob",
"user": "sudo_yangdong"
}
salt/job/20161031111459171418/ret/centos7-A {
"_stamp": "2016-10-31T03:15:00.037574",
"cmd": "_return",
"fun": "test.ping",
"fun_args": [],
"id": "centos7-A",
"jid": "20161031111459171418",
"retcode": 0,
"return": true,
"success": true
}
上面的输出中,大括号前面的部分为tag,大括号中的部分为传输的data。常见的Events的种类有’salt/auth’、’salt/minion’、’salt/job’等。上边的输出为’salt/job’类型的event。当请求从master发送到minion上时,生成了一个salt/job/<job-id>/new
的event;当对应的minion返回其响应时,生成了salt/job/<job-id>/ret/<minion-id>
的event。
还有另外的方式可以用来生成events,例如通过event.fire_master,event.send或event.fire:
[root@centos7-A ~]# salt-call event.fire_master '{"data":"salt events test"}' 'salt/test'
local:
True
在前面阻塞的终端上可以得到下面的输出:
salt/auth {
"_stamp": "2016-10-31T03:36:02.692162",
"act": "accept",
"id": "centos7-A",
"pub": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwZwF/rh+jJTMoz04dmq4\nQrSXWrByDdIo8yqfcPsL0XZlaGHdWZzzDn0BC9J2dvg8b+81dKhd2DivnD6di6Bu\nnoFC62XCj3b7yrs1uyJyfoOk6CMwQaCyBlmgHUk2OedeO+yxM9p/l9NmLWnrpi47\nauz0HIoWxu6L0LGljLcazgUD9qHxe5E4emLwTsQp2PYtS0KqIl0yWDVUoYIbraZp\nHHybJNAePqM/p/rZkG+2GeardOYPiWuE7r6Xv5gPvoHCz4KScfjCm2ooYgMueg3X\nlgmOVlhHhEG0G32mvsinRNucfsUvEOZLo2PeWPpnaSgX3bVjSLAFoCsEhKsOYGlp\nQwIDAQAB\n-----END PUBLIC KEY-----",
"result": true
}
salt/test {
"_stamp": "2016-10-31T03:36:03.461534",
"cmd": "_minion_event",
"data": {
"data": "salt events test"
},
"id": "centos7-A",
"tag": "salt/test"
}
salt/job/20161031113603486635/ret/centos7-A {
"_stamp": "2016-10-31T03:36:03.505026",
"arg": [
"{\"data\":\"salt events test\"}",
"salt/test"
],
"cmd": "_return",
"fun": "event.fire_master",
"fun_args": [
"{\"data\":\"salt events test\"}",
"salt/test"
],
"id": "centos7-A",
"jid": "20161031113603486635",
"retcode": 0,
"return": true,
"tgt": "centos7-A",
"tgt_type": "glob"
}
salt的reactor系统
salt中reactor系统的基本功能是根据从minions上收到的events,以运行states或运行命令的方式来做出反应。下面就来配置一个最简单的reactor:
上面的配置中,在master的主配置文件夹中添加了一个reactor.conf的文件,此文件可以是任意名称,只要扩展名为conf便可。第1行表明这是关于reactor的配置。第2行表明当收到的events的tag为’salt/test’时,将要执行第3行定义的文件中的内容。
上面的配置第1行为配置的名称。第2行local.cmd.run模块相当于当模块从salt命令行运行时的cmd.run这个执行模块。第3行通过使用tgt的属性,指定了centos7-A这个特定的minion。第4行的arg属性指定了要执行的命令。
完成上述的配置后,重启salt master,重新读入配置文件。然后使用上一节的相关命令来监听event:
[root@centos7-A ~]# salt-run state.event pretty=True
在另一个终端发送event:
[root@centos7-A tmp]# salt-call event.fire_master '{"data":"salt events test"}' 'salt/test'
最后,在/tmp文件夹中发现生成了test_output的文件。
通过event和reactor系统,可以将上述过程应用到持续集成或持续部署环境中。例如当一个构建任务成功执行后,一个event可以发送到master上,通知master运行部署任务。