saltstack 事件

  1. 云栖社区>
  2. 博客>
  3. 正文

saltstack 事件

技术小胖子 2017-11-17 15:11:00 浏览1239
展开阅读全文

https://docs.saltstack.com/en/latest/topics/event/index.html

salt的内部组件之间的通信是通过发送和监听事件实现的。在salt中,几乎所有的变动都会产生事件,如:

salt minion连接salt master
密钥被接受或拒绝
发送作业
从minion返回作业结果
在线心跳(默认情况下已关闭)
甚至是salt命令行接口使用事件系统都会产生事件。当一个命令发送到salt master后,salt CLI仅仅需要监视事件总线来获取从目标minion返回的作业结果。

监视事件
salt提供了一个runner来在salt master上实时显示事件。
salt-run state.event pretty=True

事件格式
事件由两个主要部分组成:标识事件的tag和事件的详细信息。

事件标记
所有的salt事件的前缀是salt/,加上基于事件类型的额外级别(level)。例如,作业事件前缀为salt/job/。每个事件部分使用/分隔提供简单的命名空间。这个标识符称为事件标记(event tag),通常包含具体的详细信息,如作业ID或minion ID。
除了事件标记外,每个事件还包括特定的事件数据。

事件数据
每一个事件包括一个timestamp和该特定事件唯一的键和值。

除了内置事件,你可以在Salt系统中启用一些其他事件,以及生成你自己的事件。
presence事件
激活presence事件会使master定期地查找主动连接的minions。presence事件以一定的间隔在事件总线上触发,事件包含已连接minions列表,以及新连接或已断开的minions列表。
在salt master配置文件中激活:

presence_events: True

salt state事件
激活salt state事件会使在salt state完成每一个函数时发送进度事件。
在salt master配置文件中激活:

state_events: True
完成一个state后触发事件

如果你的作业配置包含多个salt state,你可以增加fire_event参数以使每一个salt state完成后触发一个事件:
nano installed:
pkg.installed:

  • name: nano
  • fire_event: True
    或者你可以将True替换为自定义事件字符串,该字符串将附加到触发的事件:

nano installed:
pkg.installed:

  • name: nano
  • fire_event: nano/installed

触发一个自定义事件 (minion端执行)
你也可以直接在命令行指定一个自定义事件tag和事件数据直接触发一个事件。在你的其中一个salt minions运行如下命令:
salt-call event.send /my/test/event '{"data": "my event test"}'

我的是master-------------------syndic-----------------minion 集群,所以会有syndic到master minion到syndic 以及所有job信息 
#############################################################################################################################################
salt/auth {
"_stamp": "2017-12-06T06:49:03.953439",
"act": "accept",
"id": "192.168.90.179",
"pub": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs7VDHzCJ8950PJIBilFH\nERwCFz3mBXw6vEG98UkVyAe8dQSAJRwYXyxNgIUTCyFJSpdFNPuYEDeLj1f/4Ubx\n+yMa/Xz06PyFLZbK20FIqH4sepnGrfZYw8R7HRV6mdFOCjiSGHDGoB+gMbddCkb1\nML+Vgy42I31eADJI8Cf/1B9PSxOzySMWOHY2Yp4PNogDP8Xv6kV5rxzINK2y1m9a\njHIsb/4G1Lm8xi9JPst/y2X4Z+FKfZp4AWF1d3jmcmc10dByQ5iQlsNhLSjnYbiQ\n4TaxALOqzCoVlfJyMa2bBGfq2RjS2bG6fwjLKgDxKKppkSN3rgvMcXCaYctopEOa\niQIDAQAB\n-----END PUBLIC KEY-----",
"result": true
}
syndic/jy-KVM2/salt/auth {
"_stamp": "2017-12-06T06:49:03.955292",
"act": "accept",
"id": "192.168.90.179",
"pub": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs7VDHzCJ8950PJIBilFH\nERwCFz3mBXw6vEG98UkVyAe8dQSAJRwYXyxNgIUTCyFJSpdFNPuYEDeLj1f/4Ubx\n+yMa/Xz06PyFLZbK20FIqH4sepnGrfZYw8R7HRV6mdFOCjiSGHDGoB+gMbddCkb1\nML+Vgy42I31eADJI8Cf/1B9PSxOzySMWOHY2Yp4PNogDP8Xv6kV5rxzINK2y1m9a\njHIsb/4G1Lm8xi9JPst/y2X4Z+FKfZp4AWF1d3jmcmc10dByQ5iQlsNhLSjnYbiQ\n4TaxALOqzCoVlfJyMa2bBGfq2RjS2bG6fwjLKgDxKKppkSN3rgvMcXCaYctopEOa\niQIDAQAB\n-----END PUBLIC KEY-----",
"result": true
}
/my/test/event {
"_stamp": "2017-12-06T06:49:03.956857",
"cmd": "_minion_event",
"data": {
"pub_fun": "event.send",
"__pub_jid": "20171206144903777457",
"
pub_pid": 12248,
"pub_tgt": "salt-call",
"data": "my event test"
},
"id": "192.168.90.179",
"tag": "/my/test/event" -------------------------minion自定义事件
}
syndic/jy-KVM2//my/test/event {
"_stamp": "2017-12-06T06:49:03.958386",
"cmd": "_minion_event",
"data": {
"
pub_fun": "event.send",
"pub_jid": "20171206144903777457",
"__pub_pid": 12248,
"
pub_tgt": "salt-call",
"data": "my event test"
},
"id": "192.168.90.179",
"tag": "/my/test/event"
}
salt/job/20171206144903833771/ret/192.168.90.179 {
"_stamp": "2017-12-06T06:49:03.972055",
"fun": "event.send",
"fun_args": null,
"id": "192.168.90.179",
"jid": "20171206144903833771",
"retcode": 0,
"return": true
}

###########################################################################

可以利用它来监听其它事情,如系统登录,硬盘使用和数据库服务”。
而beacons就是用来做这样的事情的。
beacons让你能够监控与salt无关的事情以及触发事件。beacon系统允许minion与各种系统进程挂钩并持续监控进程。当监控的系统进程活动发生时,minion就发送一个事件到salt事件总线。
salt beacons目前能对许多系统活动进行监控和发送事件,包括:

1.文件系统变动
2.系统负载
3.服务状态
4.shell活动,如用户登录
5.网络和硬盘使用情况

激活一个beacon
salt beacons的激活不需要对监控的系统进程进行任何更改,一切配置都可以使用salt来做。
在minion的配置文件中增加如下配置:

beacons:
inotify:
home/user/importantfile:
mask:

  • modify

    beacon监控间隔

beacons默认以1秒的间隔监控。可以增加一个interval参数来设置一个不同的间隔。如下是设置了5和10秒的间隔:

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
    如果一个beacon的更改可能引起重新触发这个beacon的话,设置disable_during_state_run为True以避免循环事件发生。
    增加beacon

我们准备增加一个beacon来监控一个文件的更改。要配置这个,需要使用inotify beacon和安装python-pyinotify包。因为salt minions没有这个包,首先我们使用salt来安装它。

salt 'minion1' pkg.install python-pyinotify

salt-run state.event pretty=True
让它在终端中运行并继续。

设置一个beacon

编辑minion1的/etc/salt/minion文件,在底部添加如下内容:

beacons:
inotify:
/home/vagrant/importantfile:
mask:

  • modify
    保存文件重启salt minion服务:

在/home/vagrant/目录创建importantfile:

touch importantfile
echo "some content" > importantfile
回到salt master刚才运行event runnner的终端,你应该会看到如下输出:

salt/beacon/minion1/inotify//home/vagrant/importantfile {
"_stamp": "2016-02-03T22:32:09.592113",
"data": {
"change": "IN_MODIFY",
"id": "minion1",
"path": "/home/vagrant/importantfile"
},
"tag": "salt/beacon/minion1/inotify//home/vagrant/importantfile"
}

salt的reactor系统让你能够对任何事件作出响应。你不只能够在作业和任务完成时作出响应,也能够在服务下线,用户登录,文件被更改和在任何地方发送的自定义事件作出反应。

reactor配置

在/etc/salt/master或/etc/salt/master.d/reactor.conf中添加reactor区块来配置reactor(只允许添加一个reactor区块)。
下面的示例是配置一个匹配minion启动,云资源回收和自定义事件的reactor:

reactor: # Salt master配置区块"reactor"

  • 'salt/minion//start': # 匹配tag "salt/minion//start"

    • /srv/reactor/start.sls # minion启动时应用的一个state文件
    • /srv/reactor/monitor.sls # 另一个state文件
  • 'salt/cloud/*/destroyed': # 可以使用通配符匹配tags

    • /srv/reactor/destroy/*.sls # 可以使用通配符匹配文件名
  • 'myco/custom/event/tag':
    • salt://reactor/mycustom.sls

reactor的配置非常简单;reactor区块唯一的作用是关联事件tag与要运行reactor SLS文件。reactor是一个独立的线程,所以可以在SLS文件里执行繁重的任务。
reactor SLS文件具有YAML和Jinja全部的功能,所以你可以使用事件标记和数据执行过滤和测试。
我们来尝试在demo环境中添加一个reactor来测试这个系统。打开salt-vagrant-demo/saltstack/etc/master文件,添加一个reactor区块:

reactor:

  • 'my/custom/event/tag':
  • salt://reactor/customevent.sls
    这个告诉salt master在任何时候一旦发现一个事件包含my/custom/event/tag,则马上调用customevent.sls文件。
    我们学习reactor SLS文件后再创建customevent.sls文件。
    现在先重启salt-master服务(service salt-master restart)使reactor生效。

reactor SLS文件

你已经对salt state SLS文件有所了解了,与salt reactor SLS有所以类似的地方。salt state和salt reator SLS文件都是使用YAML和Jinja写的,不过因为它们语法有些不同,且用作不同的目的,它们应该放在不同的目录中(如reactor是在/srv/salt/reactors目录)。

reactor的类型

salt reactor有如下几种类型:

远程执行: 在目标minions运行一个执行模块。这个可以通过调用salt命令来完成(包括应用state或highstate)
Salt Runners: 通过使用salt-run调用的任务。如HTTP runnner可以触发webhook。
Wheel: Wheel命令管理你的salt环境,完成如接收密钥和更新配置设置的任务。
远程执行

这种类型的reactor是直接与salt执行模块连接。如果你考虑使用salt命令来运行一个远程执行模块,你应该知道salt命令必须包含三个信息:

目标
函数
参数
salt reactor中的远程执行也同样需要这三个信息:

<section id>:
local.<function>:

  • tgt: <target>
  • arg:
    <arguments>
    注意执行模块必须以local为前缀。我们来看在命令行安装一个包是怎样的:

salt 'myminion' pkg.install cowsay
在reactor SLS文件中,应该是按如下配置:

install cowsay on myminion:
local.pkg.install:

  • tgt: 'myminion'
  • arg:
    • cowsay
      RUNNER和WHEEL模块

在reactor中调用Runner模块和Wheel模块语法很简单,因为是在本地执行的函数,不是发送一个命令到远程系统。调用两个模块不需要arg或kwarg参数(除非Runner函数或Wheel函数接收参数)。

clear_the_grains_cache_for_all_minions:
runner.cache.clear_grains
spin_up_more_web_machines:
runner.cloud.profile:

  • prof: centos_6
  • instances:
    • web11
    • web12
      下面是一个wheel示例用来自动接受minion的密钥(在生产环境中你应该增加额外的检查来避免接受恶意minions)。

accept_new_minion:
wheel.key.accept:

  • match: {{ data['id'] }}
    更多的示例

下面的reactor SLS用来对salt/cloud/*/created事件反应:

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
    如果你配置了当构建系统完成后触发一个自定义事件,那么你可以使用slack来通知你:

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'] }}"
    salt state

state执行模块可以用在reactor SLS文件来应用一个salt state,或者触发一个highstate。

{% if data['id'] == 'mysql1' %}
highstate_run:
local.state.highstate:

  • tgt: mysql1
    {% endif %}

reactor配置测试

master----------------------------syndic--------------------------------------minion

master
root@jy-KVM1:/etc/salt# cat master
ipv6: False
interface: 192.168.90.177
auto_accept: True
state_top: top.sls
order_masters: True
return: mysql
event_return: mysql -------------------------------返回到mysql
file_roots:
base:

  • /etc/salt/base
    prod:
  • /etc/salt/prod

state_events: True
mysql.host: '192.168.90.177'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306

syndic
root@jy-KVM2:/etc/salt# cat master
ipv6: False
auto_accept: True
file_roots:
base:

  • /etc/salt/base
    prod:
  • /etc/salt/prod
    syndic_master: 192.168.90.177

default_include: master.d/*.conf ---------------------需要配置

root@jy-KVM2:/etc/salt/master.d# cat reactor.conf ----------------- 编写reactor文件
reactor:

  • 'salt/minion/*/start':
    • salt://a.sls

root@jy-KVM2:/etc/salt/base# cat a.sls -----------------------编写 reactor的sls文件
install cowsay on myminion:
local.cmd.run:

  • tgt: '*'
  • arg:
    • /bin/echo 123 >> /tmp/haha.log

minion
root@jy-KVM3:~# cat /etc/salt/minion|grep -v "#" |grep -v "^ *$"
master: 192.168.90.178
id: 192.168.90.179
mysql.host: '192.168.90.177'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306
root@jy-KVM3:~#

以上是定义minion 启动 触发执行a.sls 执行echo语句
会发现minion的tmp下生成这个文件。



      本文转自潘阔 51CTO博客,原文链接:http://blog.51cto.com/pankuo/2048668,如需转载请自行联系原作者




网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注