salt的Event和Reactor

目录
  1. salt的event系统
  2. salt的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:

/etc/salt/master.d/reactor.conf
1
2
3
reactor:
- 'salt/test':
- /opt/salt/staging/event/test.sls

上面的配置中,在master的主配置文件夹中添加了一个reactor.conf的文件,此文件可以是任意名称,只要扩展名为conf便可。第1行表明这是关于reactor的配置。第2行表明当收到的events的tag为’salt/test’时,将要执行第3行定义的文件中的内容。

/opt/salt/staging/event/test.sls
1
2
3
4
5
command_run:
local.cmd.run:
- tgt: 'centos7-A'
- arg:
- 'ls -l /* > /tmp/test_output'

上面的配置第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运行部署任务。