event是一个本地的ZeroMQ PUB Interface,event是一个开放的系统,用于发送信息通知salt或其他的操作系统。每个event都有一个标签。事件标签允许快速制定过滤事件。除了标签之外,每个事件都有一个数据结构。这个数据结构是一个dict类型,其中包含关于事件的信息。

  作用:用于监控salt-master执行结果。

一、监听salt event事件脚本

1.1、环境准备

节点 IP
salt-master 192.168.56.41
salt-minion 192.168.56.42

1.2、配置好salt-key连接,再在salt-master节点上面开两个窗口测试。

#salt-master窗口01

[root@salt ~]# salt '*' test.ping
salt-minion:
True
[root@salt ~]# salt '*' test.ping
salt-minion:
True

#salt-master窗口02

#编写脚本
[root@salt-minion ~]# cat salt_monitor_event.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import salt.utils.event
event = salt.utils.event.MasterEvent('/var/run/salt/master')
for eachevent in event.iter_events(full=True):
print eachevent
print "---------" #授权
[root@salt-minion ~]# chmod +x salt_monitor_event.py #执行结果
[root@salt ~]# python salt_monitor_event.py
{u'tag': '20180624070339744384', u'data': {u'_stamp': u'2018-06-23T23:03:39.745401', u'minions': [u'salt-minion']}}
---------
{u'tag': 'salt/job/20180624070339744384/new', u'data': {u'tgt_type': u'glob', u'jid': u'20180624070339744384', u'tgt': u'*', u'missing': [], u'_stamp': u'2018-06-23T23:03:39.745714', u'user': u'root', u'arg': [], u'fun': u'test.ping', u'minions': [u'salt-minion']}}
---------
{u'tag': 'salt/job/20180624070339744384/ret/salt-minion', u'data': {u'fun_args': [], u'jid': u'20180624070339744384', u'return': True, u'retcode': 0, u'success': True, u'cmd': u'_return', u'_stamp': u'2018-06-23T23:03:39.783037', u'fun': u'test.ping', u'id': u'salt-minion'}}
---------
{u'tag': '20180624070341195901', u'data': {u'_stamp': u'2018-06-23T23:03:41.196632', u'minions': [u'salt-minion']}}
---------
{u'tag': 'salt/job/20180624070341195901/new', u'data': {u'tgt_type': u'glob', u'jid': u'20180624070341195901', u'tgt': u'*', u'missing': [], u'_stamp': u'2018-06-23T23:03:41.196926', u'user': u'root', u'arg': [], u'fun': u'test.ping', u'minions': [u'salt-minion']}}
---------
{u'tag': 'salt/job/20180624070341195901/ret/salt-minion', u'data': {u'fun_args': [], u'jid': u'20180624070341195901', u'return': True, u'retcode': 0, u'success': True, u'cmd': u'_return', u'_stamp': u'2018-06-23T23:03:41.234596', u'fun': u'test.ping', u'id': u'salt-minion'}}
---------
{u'tag': '20180624070347154023', u'data': {u'_stamp': u'2018-06-23T23:03:47.154591', u'minions': [u'salt-minion']}}
---------
{u'tag': 'salt/job/20180624070347154023/new', u'data': {u'tgt_type': u'glob', u'jid': u'20180624070347154023', u'tgt': u'*', u'missing': [], u'_stamp': u'2018-06-23T23:03:47.154990', u'user': u'root', u'arg': [], u'fun': u'test.ping', u'minions': [u'salt-minion']}}
---------
{u'tag': 'salt/job/20180624070347154023/ret/salt-minion', u'data': {u'fun_args': [], u'jid': u'20180624070347154023', u'return': True, u'retcode': 0, u'success': True, u'cmd': u'_return', u'_stamp': u'2018-06-23T23:03:47.191617', u'fun': u'test.ping', u'id': u'salt-minion'}} 

二、saltStack的event接口通过mysql数据库接收SaltStack批量管理日志

作用:在master上直接将返回结果写入mysql

2.编写自定义return脚本
vim salt_event_to_mysql.py #!/bin/env python
#coding=utf8
# Import python libs
import json
# Import salt modules
import salt.config
import salt.utils.event
# Import third part libs
import MySQLdb
__opts__ = salt.config.client_config('/etc/salt/master')
#create MySQL connect
#conn = MySQLdb.connect(host=__opts__['mysql.host'],user=__opts__['mysql.user'],passwd=__opts__['mysql.pass'],db=__opts__['mysql.db'],port=__opts__['mysql.port']) conn = MySQLdb.connect(host='192.168.3.87',user='salt',passwd='salt',db='salt',port=3306)
cursor = conn.cursor()
# Listen Salt Master Event System
event = salt.utils.event.MasterEvent(__opts__['sock_dir'])
for eachevent in event.iter_events(full=True):
ret = eachevent['data']
if "salt/job/" in eachevent['tag']:
#Return Event
if ret.has_key('id') and ret.has_key('return'):
#Ignore saltutil.find_job event
if ret['fun'] == "saltutil.find_job":
continue
sql = '''INSERT INTO `salt_returns`
(`fun`,`jid`,`return`,`id`,`success`,`full_ret` )
VALUES (%s,%s,%s,%s,%s,%s)'''
cursor.execute(sql,(ret['fun'],ret['jid'],
json.dumps(ret['return']),ret['id'],
ret['success'],json.dumps(ret)))
cursor.execute("COMMIT")
# Other Event
else:
pass
保存退出 注意:
MySQLdb.connect(host=__opts__['mysql.host'],user=__opts__['mysql.user'],passwd=__opts__['mysql.pass'],db=__opts__['mysql.db'],port=__opts__['mysql.port'])
要换成自己的实际数据库地址、数据库用户、密码,如:
conn = MySQLdb.connect(host='192.168.3.87',user='salt',passwd='salt',db='salt',port=3306) 3.修改master的配置文件
vim /etc/salt/master mysql.host: '192.168.3.87' # mysql服务器的IP地址
mysql.user: 'salt' # mysql数据库的用户名,需要跟后面授权的用户名一致
mysql.pass: 'salt' # mysql数据库的密码,需要跟后面授权的密码一致
mysql.db: 'salt' # mysql数据库的名称
mysql.port: 3306 # 使用端口为3306 mysql.host: '192.168.3.87' # mysql服务器的IP地址
mysql.user: 'salt' # mysql数据库的用户名,需要跟后面授权的用户名一致
mysql.pass: 'salt' # mysql数据库的密码,需要跟后面授权的密码一致
mysql.db: 'salt' # mysql数据库的名称
mysql.port: 3306 # 使用端口为3306
保存退出 4.在master上安装MySQL-python
yum -y install MySQL-python 创建数据库
CREATE DATABASE `salt`DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
USE `salt`; DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids`
(`jid` varchar(255) NOT NULL,`load` mediumtext NOT NULL,UNIQUE KEY `jid` (`jid`) )
ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns`
(`fun` varchar(50) NOT NULL,`jid` varchar(255) NOT NULL,`return` mediumtext NOT NULL,`id` varchar(255) NOT NULL,`success` varchar(10) NOT NULL,`full_ret` mediumtext NOT NULL,KEY `id` (`id`),KEY `jid` (`jid`),KEY `fun` (`fun`) )
ENGINE=InnoDB DEFAULT CHARSET=utf8; 授权
GRANT ALL PRIVILEGES ON salt.* to 'salt'@'%' identified by 'salt';
flush privileges; 5.在master的后台执行自定义return脚本
python salt_event_to_mysql.py & 6.开一个新的master终端进行测试
salt '*' test.ping 7.在mysql上看是否已经将数据写入数据库
mysql -uroot -p
输入密码之后进入mysql数据库
use salt
show tables;
select * from salt_returns \G
如果出现如下结果表示插入成功:
mysql> select * from salt_returns \G
*************************** 1. row ***************************
fun: test.ping
jid: 20160807111832766142
return: true
id: 192.168.3.108
success: 1
full_ret: {"fun_args": [], "jid": "20160807111832766142", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2016-08-07T03:18:32.950841", "fun": "test.ping", "id": "192.168.3.108"}
*************************** 2. row ***************************
fun: test.ping
jid: 20160807111832766142
return: true
id: minion_client01.DHCP
success: 1
full_ret: {"fun_args": [], "jid": "20160807111832766142", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2016-08-07T03:18:32.953034", "fun": "test.ping", "id": "minion_client01.DHCP"}

  

saltstack之salt event事件用法的更多相关文章

  1. Mysql event事件用法

    公司的数据库需要进行定期删除数据,需要用到mysql event事件,学习和梳理这块知识. 1查看event是否开启 SHOW VARIABLES LIKE 'event_scheduler'; 2开 ...

  2. javascript中window.event事件用法详解

    转自http://www.jb51.net/article/32564.htm描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生 ...

  3. mysql的event(事件)用法详解

    SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHOW VARIABLES LIKE 'e ...

  4. js事件之event.preventDefault()与event.stopPropagation()用法区别

    event.preventDefault()用法介绍 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit" ...

  5. jQuery event,冒泡,默认事件用法

    jQuery event,冒泡,默认事件用法 <%@ page language="java" import="java.util.*" pageEnco ...

  6. js事件之event.preventDefault()与(www.111cn.net)event.stopPropagation()用法区别

    event.preventDefault()用法介绍 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit" ...

  7. 【saltstack】saltstack执行结果和事件存储到mysql

    前言 项目中使用saltstack有一段时间了,之前都是在控制台操作,后来感觉越来越不方便,每次操作需要登陆服务器,还需要记一堆命令.最重要的是,公司进新人之后,新人由于不熟悉saltstack,容易 ...

  8. [.NET] C# 知识回顾 - Event 事件

    C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...

  9. jQuery 事件用法详解

    jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jque ...

随机推荐

  1. 使用Frida简化Android端应用安全测试

    @author : Dlive 在对Android应用进行Web漏洞测试时,经常遇到一种情况:HTTP传输的数据带有签名字段 处理这种情况的方法通常是逆向签名算法,但是如果算法在so中,而且so加壳了 ...

  2. nginx启动脚本(class练习)

    说明:使用类的方式编写程序启动脚本(练习) 1 #!/usr/bin/env python import sys import os from subprocess import Popen,PIPE ...

  3. (十二)进一步掌握STVD/COSMIC

    如何分配变量到指定的地址 举例:unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00unsigned char temp_B@0x100; //定 ...

  4. 在 C# 中通过 P/Invoke 调用Win32 DLL

    在 C# 中通过 P/Invoke 调用Win32 DLL 发布日期 : 1/13/2005 | 更新日期 : 1/13/2005 Jason Clark 下载本文的代码: NET0307.exe ( ...

  5. [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3202  Solved: 1198[Submit][Status ...

  6. AC日记——[JSOI2008]火星人prefix bzoj 1014

    1014 思路: 平衡树+二分答案+hash: 好了懂了吧. 代码: #include <cstdio> #include <cstring> #include <ios ...

  7. 浅谈replace()

    replace()简单介绍 replace()基本语法是String.replace(searchValue,replaceValue),其中searchValue为字符串或者正则,replaceVa ...

  8. Luis创建与发布

    首先打开网址https://www.luis.ai,打开后,需要使用你的微软帐户或是公司账户登录至Luis 登陆进入至网站后,会自动显示你的应用,在这里你可以修改和删除你之前已经创建过的应用,如果之前 ...

  9. CF 862A Mahmoud and Ehab and the MEX【数组操作】

    A. Mahmoud and Ehab and the MEX time limit per test 2 seconds memory limit per test 256 megabytes in ...

  10. python——入门系列(一)索引与切片

    1.索引和切片:python当中数组的索引和其他语言一样,从0~n-1,使用索引的方法也是中括号,但是python中的切片的使用简化了代码 索引:取出数组s中第3个元素:x=s[2] 切片:用极少的代 ...