1. 程式人生 > >saltstack之salt event事件用法

saltstack之salt event事件用法

OS CP values exists medium highlight -a character jid

  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事件用法