SaltStack Event事件系统使用指南

来源:互联网 发布:光伏产业数据查询 编辑:程序博客网 时间:2024/06/06 18:39
本文主要内容来自SaltStack官网的英文入门教学文档,适当补充个人实践中的一些知识所形成。

本指南将主要带大家熟悉以下内容
  • 怎样启用和监控事件系统
  • 配置和启用对主机系统上非Salt活动的监控
  • 基于事件触发的Salt反应器

1、Salt Event事件系统有哪些功能:
  • 当用户登录到生产服务器时发送一个文本消息
  • 当构建失败时调用报警接口发送通知
  • 在产生未经授权的配置变更时,立即予以恢复
  • 自动化扩展云平台上的资源
  • 监视磁盘,处理器,RAM和其他系统统计信息,并在超出定义阈值时采取措施

2、观察事件信息
几乎Salt中各种组件的通信都是基于事件总线实现的。
可以在Salt Master上面运行以下命令来实时地观察当前事件总线上收到的各种事件信息:
salt-run state.event pretty=True
另外打开一个窗口登录Salt Master,执行salt p1 test.ping。上面的监视窗口会输出信息如下:
20170917195557483110    {    "_stamp": "2017-09-17T11:55:57.483329",    "minions": [        "p1"    ]}salt/job/20170917195557483110/new    {    "_stamp": "2017-09-17T11:55:57.483457",    "arg": [],    "fun": "test.ping",    "jid": "20170917195557483110",    "minions": [        "p1"    ],    "tgt": "p1",    "tgt_type": "glob",    "user": "root"}salt/job/20170917195557483110/ret/p1    {    "_stamp": "2017-09-17T11:55:57.645305",    "cmd": "_return",    "fun": "test.ping",    "fun_args": [],    "id": "p1",    "jid": "20170917195557483110",    "retcode": 0,    "return": true,    "success": true}

事件的格式:
  • 事件标签,salt事件都是以"sat/"打头的,多层级的,层级间使用"/"分隔。在事件标签中往往会包含job ID或minion ID。
  • 事件数据,都会包含一个时间戳以及其它与该事件相关的信息。

3、自定义事件
启用附加的Salt事件
  • PRESENCE EVENTS,启用Salt presence事件后,Salt Master将会周期性地向事件总线发出该事件,以探听所有minions的连接就绪状态。需要修改master config配置文件,设置参数presence_events: True
  • SALT STATE EVENTS,启用Salt状态事件后,当Salt状态运行中的每一个功能完成执行后,Salt minion都会发送一个进度事件,需要修改master config配置文件,设置参数state_events: True

让一个Salt 状态完成时就发送出一个事件
对于比较复杂的Salt state配置,可能会包含多个状态同步的内容。你可以通过添加fire_event参数,让一个状态同步完成后,发出一个事件通知:
nano installed:  pkg.installed:    - name: nano    - fire_event: True

更进一步的,你甚至可以把参数fire_event的值替换为一个自定义的字符串,这时不但会在状态同步完成时发送事件通知,还会把你自定义的这个信息也添加到事件数据中去。
nano installed:
  pkg.installed:
    - name: nano
   - fire_event: nano/installed
发送一个自定义的事件
在一个minion上面执行:
salt-call event.send /my/test/event '{"data": "my event test"}'
在Salt Master上可以观察下:
/my/test/event    {    "_stamp": "2017-09-17T14:25:16.953828",    "cmd": "_minion_event",    "data": {        "__pub_fun": "event.send",        "__pub_jid": "20170917222516899269",        "__pub_pid": 31967,        "__pub_tgt": "salt-call",        "data": "my event test"    },    "id": "p1",    "tag": "/my/test/event"}salt/job/20170917222516965122/ret/p1    {    "_stamp": "2017-09-17T14:25:16.965923",    "arg": [        "/my/test/event",        "{\"data\": \"my event test\"}"    ],    "cmd": "_return",    "fun": "event.send",    "fun_args": [        "/my/test/event",        "{\"data\": \"my event test\"}"    ],    "id": "p1",    "jid": "20170917222516965122",    "retcode": 0,    "return": true,    "tgt": "p1",    "tgt_type": "glob"}

4、BEACONS(Salt信标)
Salt Beacons为监控系统活动并触发报警事件提供了一种解决方案。因为该功能很新,在网上几乎找不到什么中文资料。不过,在各种系统监控平台软件大行其道的今天,谁会在什么场景中使用Salt Beacons功能也存在疑问。
目前Salt Beacons可以提供的监控能力包括:
  • 文件系统变化
  • 系统负载
  • 服务运行状态
  • shell活动,如用户登录
  • 网络和磁盘使用情况

启用一个Beacon:
通常通过在minion的配置文件中放置一个top-level信标部的段落来启用信标功能。
beacons:  inotify:    home/user/importantfile:      mask:        - modify
当beacon结合salt reactor使用时,可能会由reactor引发对minion上配置文件的重新状态同步操作。而这些操作无疑会继续触发beacon的报警事件,进而产生一个环路。为了避免这类问题,一般需要再增加一个控制参数哪下:
beacons:  inotify:    home/user/importantfile:      mask:        - modify      disable_during_state_run: True
disable_during_state_run: True,在执行状态同步期间,暂停beacon功能。

设置beacon监视的时间间隔:
默认为1s,可以使用interval参数人为指定。
beacons:  inotify:    /etc/httpd/conf.d: {}    /opt: {}    interval: 5  load:    - 1m:      - 0.0      - 2.0    - 5m:      - 0.0      - 1.5    - 15m:      - 0.1      - 1.0    - interval: 10

下面将一步一步带领大家配置出一个Salt Beacon:
设置一个beacon,监视一个文件的变化。使用到inotify beacon和python-pyinotify包。
1)在minion上安装python-pyinotify包
yum install python-inotify
同时在master上打开事件观察器:
salt-run state.event pretty=True

2)配置一个beacon
登录minion,编辑/etc/salt/minion文件,增加以下内容:
beacons:
  inotify:
    /home/vagrant/importantfile:
      mask:
       - modify
保存并重启salt minion服务:
service salt-minion restart

3)测试
此时上面配置的beacon已经生效,我们可以向被监视的文件中写入内容,同时观察事件总线的信息输出。
在minion上面执行:
echo "this is the second testing" >> importantfile
在master上观察事件总线:
salt/beacon/cmpp_90/inotify//home/bjywb/importantfile    {    "_stamp": "2017-09-17T15:10:15.579421",    "data": {        "change": "IN_MODIFY",        "id": "cmpp_90",        "path": "/home/bjywb/importantfile"    },    "tag": "salt/beacon/cmpp_90/inotify//home/bjywb/importantfile"}
注:再结合使用reactor的功能,就可以实现一个自动化地文件变化、发现变更、触发reactor、执行状态同步。以实现对指定配置文件的实时监视和状态控制。

5、EVENT REACTOR(事件反应器)
Salt Reactor用于对指定事件做出反应。

Salt Reactor的配置方法
通过在master上/etc/salt/master 或 /etc/salt/master.d/reactor.conf中添加一个top-level的reactor段落来使用这一功能。这两个配置文件在使用时只能二选一,因为只允许存在一个reactor的配置段落。
下图中是三个配置样例,分别是针对minion启动事件、云主机销毁事件、一个自定义事件所设置的salt reactor行为。
reactor:                           # Salt master config section "reactor"

  - 'salt/minion/*/start':         # Match tag "salt/minion/*/start"
    - /srv/reactor/start.sls        # Things to do when a minion starts
    - /srv/reactor/monitor.sls      # Other things to do

  - 'salt/cloud/*/destroyed':       # Globs can be used to match tags
    - /srv/reactor/destroy/*.sls    # Globs can be used to match file names

  - 'myco/custom/event/tag':       # React to custom event tags
   - salt://reactor/mycustom.sls   # Put reactor files under file_roots
Reactor配置起来比较简单,它唯一的功能就是建立一个指定的事件标签和一个或多个reactor SLS文件的关联关系。

需要特别注意的两点:
  • Salt Reactor是单线程运行的,所以需要避免复杂的逻辑或耗时的处理。应该把工作都留给reactor SLS文件去处理,而后者是通过启动独立的进程执行的。
  • Reactor SLS文件支持使用YAML和Jinja,可以引用事件标签和事件数据变量,使用Jinja语法设计处理逻辑。

一个测试案例:
在/etc/salt/master中添加一个reactor的测试用例。
reactor:
  - 'gq/custom/event/tag':
    - salt://reactor/gqcustomevent.sls

重启master服务:
systemctl  restart salt-master

关于REACTOR SLS文件:
通常放置于/srv/salt/reactors路径下,在格式和语法上都和state sls文件非常相似。
建议将Salt reactor SLS视为salt和salt-run命令(在master上执行)的入口点,而不是作为Salt state系统(在minion上执行)的入口。

三种REACTION类型:
  • Remote execution,使用salt命令在目标minion上执行一些操作,包括应用state或highstate状态)
  • Salt Runners,使用salt-run命令执行的一些任务,如利用http runner去调用一个webhook。
  • Wheel,用于管理Salt环境变量、密钥管理或更新配置,如使用salt-key管理认证。

Remote execution执行模块的使用样例:
reactor语法格式如下。
<section id>:
  local.<function>:
    - tgt: <target>
    - arg:
        <arguments>
注:在功能模块的前面需要以"local"开头,但这么使用的原因目前没有特别的意义。
如果把下面这个salt远程执行命令写作reactor的话,会是下图的样子:
salt 'myminion' pkg.install cowsay
install cowsay on myminion:
  local.pkg.install:
    - tgt: 'myminion'
    - arg:
      - cowsay
如果想使用更复杂的target匹配规则,可以使用expr_form参数,如下:
clean_tmp:
  local.cmd.run:
    - tgt: 'os:Ubuntu'
    - expr_form: grain
    - arg:
     - rm -rf /tmp/*
因为支持Jinja语法,所以也可以通过引用事件数据中的变量来指定target。
create file on myminion:
 local.cmd.run:
   - tgt: {{ id }}
   - arg:
     - 'touch /tmp/test_file_here'
调用runner模块和wheel模块的例子:
clear_the_grains_cache_for_all_minions:
  runner.cache.clear_grains
webhook1:
  runner.http.query:
    - arg:
      - http://abc.com/path/to/webhook
accept_new_minion:
  wheel.key.accept:
   - match: {{ data['id'] }}
更多的使用举例:
一个响应salt/cloud/*/created事件的reactor。
new vm alert:
  local.pagerduty.create_event:
    - tgt: minion
    - kwarg:
        description: "New VM {{ data['name'] }}"
        details: "New VM on {{ data['provider'] }}: {{ data['name'] }}"
        service_key: 1162ee51ed6e46239265c969729c48eb
        profile: my-pagerduty-account
一个响应自定义事件的reactor。
spam slack:
  local.slack_notify.post_message
    - tgt: buildserver
    - kwarg:
        channel: "Development"
        api_key: peWcBiMOS9HrZG15peWcBiMOS9HrZG15"
        message: "Build {{ data['build_id'] }} finished with status: {{ data['status'] }}"
一个会调用state状态同步命令的reactor。
{% if data['id'] == 'mysql1' %}highstate_run:
  local.state.highstate:
    - tgt: mysql1
{% endif %}

原创粉丝点击