基于Salt Event系统构建Master端returner

前置阅读

环境说明

开工

前置配置

编写returner

测试

SaltStack 的 returner 是由minion端主动连接returner完成执行结果的存储, 在部分场景下并不能满足需求. 由于Salt底层已经构建了一套 Event系统, 所有的操作均会产生event. 因此基于Salt Event系统构建Master端returner成为一种可能.

之前已经完成了 SaltStack Event系统监听events测试, 本文将基于Salt Event系统构建Master端returner.

前置阅读

SaltStack Event系统: http://docs.saltstack.com/en/latest/topics/event/index.html

SaltStack Event系统监听events测试: http://pengyao.org/saltstack_event_system_listen_events.html

环境说明

测试结构: Master/Minions结构, 共一台minion, 对应id为: salt-minion-01.example.com

Salt Version: 2014.1.1

本次测试结果将存放在MySQL中, 为了方便测试, 已经在Master本地部署了MySQL Server

开工

前置配置

安装MySQLdb依赖

yum -y install MySQL-python

配置本次测试需要使用的数据库及用户

# 创建salt数据库

mysql -e ‘create database salt‘

# 创建用于连接salt数据库的用户

mysql -e ‘"grant all on salt.* to [email protected] identified by "salt_pass‘;

# 将数据库配置添加至master配置文件中

echo -e "\n\n# MySQL\nmysql.host: ‘localhost‘\nmysql.user: ‘salt‘\nmysql.pass: ‘salt_pass‘\nmysql.db: ‘salt‘\nmysql.port: 3306" >> /etc/salt/master

为了与salt自带的 mysql returner 兼容, 本次直接使用mysql retuner对应的数据库表结构:

USE `salt`;

--

-- Table structure for table `jids`

--

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;

--

-- Table structure for table `salt_returns`

--

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,

`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

KEY `id` (`id`),

KEY `jid` (`jid`),

KEY `fun` (`fun`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

编写returner

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 party 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‘])

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‘):

# Igonre 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

运行本returner:

python salt_event_to_mysql.py

测试

新开启一个终端, 运行Salt指令:

salt ‘*‘ test.ping

输出为:

salt-minion-01.example.com:

True

检查mysql数据库, 查询salt_returns表数据:

mysql salt -e "select * from salt_returns\G"

输出为:

*************************** 1. row ***************************

fun: test.ping

jid: 20140417161103569310

return: true

id: salt-minion-01.example.com

success: 1

full_ret: {"fun_args": [], "jid": "20140417161103569310", "return": true, "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2014-04-17T16:11:03.584859", "fun": "test.ping", "id": "salt-minion-01.example.com"}

alter_time: 2014-04-17 16:11:03

入库成功

时间: 2024-12-16 02:37:59

基于Salt Event系统构建Master端returner的相关文章

基于Salt Master/Minions快速构建Salt SSH环境

前置阅读 环境说明 开工 创建用于Salt SSH环境的用户及key认证管理环境 配置Mine,以获取Minion id及IP地址 生成Salt Rosters 应用Salt SSH 后话 Salt 0.17版本已发布,该版本中重要的特性是引入了Salt SSH系统,提供了无需Minion.基于SSH的维护方式.原有的Salt维护环境已经初具规模,再手动重新构建Salt SSH环境成本较高.偷懒是人的天性,利用原有SaltStack Master/Minions环境,如何快速构建新的Salt S

基于Jenkins的自动构建系统开发_android总结

持续集成相关理论 1.1 极限编程的概述 1.1.1 极限编程的产生 2001年,为了解决许多公司的软件团队陷入不断增长的过程泥潭,一批业界专家一起概括出了一些可以让软件开发团队具有快速工作.响应变化能力的价值观和原则,他们称自己为敏捷联盟.敏捷开发过程的方法很多,主要有:SCRUM,Crystal,特征驱动软件开发(Feature Driven Development,简称FDD),自适应软件开发(Adaptive Software Development,简称ASD),以及最重要的极限编程(

?? 基于 vue2 + vuex + vue-router 构建的移动端微应用

vue-mobile-starter View README in English 基于 vue2 + vuex + vue-router 构建的移动端单页微应用,适合于vue2.vuex.vue-router核心概念的理解与掌握. 前言 做这个项目的初衷其实很简单,我司之前一直用angular.react进行PC端项目的开发,但是最近新开展了一些项目打算用vue来做移动端的开发(紧跟大厂的步伐?).无奈之前只是看了看vue的语法,没有vue项目开发的实际经验,只能去找资料开始自学,这个项目就是

一种基于动态插件系统的移动测试黑科技

百度MTC是业界领先的移动应用测试服务平台,为广大开发者在移动应用测试中面临的成本.技术和效率问题提供解决方案.同时分享行业领先的百度技术,作者来自百度员工和业界领袖等. 本文作者:hyxbiao && tony xin 背景 移动APP插件化是平台化产品解决系统限制(65535).模块解耦.和多团队协作的利器.它的最大特点是模块动态下发,给产品带来的收益显而易见,但是,在百度,这套系统给移动端测试技术带来了新思路 移动端线上问题定位的几个场景: 场景一: 云端用户反馈某功能不可用,RD猜

linux系统构建学习笔记

嵌入式系统构架:(硬件+软件)应用软件层: Application GNU C Library(glibc)文件系统: 系统层: API(Systern Call Interface) OS Core + Power Mannager+ File Manager + GUI Mannager TCP/IP HTTP WAP DataBase Browser DDI(Device Drver Interface) 板级支持:BSP:Board Support Package       OEM A

Comet技术详解:基于HTTP长连接的Web端实时通信技术

前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 关于这4种技术方式的优缺点,请参考<Web端即时通讯技术盘点:短轮询.Comet.Websocket.SSE>.本文将专门讲解Comet技术.(本文同步发布于:http://www.52im.net/thread-334-1-1.html) 学习交流 - 即时通

saltstack之salt event事件用法

event是一个本地的ZeroMQ PUB Interface,event是一个开放的系统,用于发送信息通知salt或其他的操作系统.每个event都有一个标签.事件标签允许快速制定过滤事件.除了标签之外,每个事件都有一个数据结构.这个数据结构是一个dict类型,其中包含关于事件的信息. 作用:用于监控salt-master执行结果. 一.监听salt event事件脚本 1.1.环境准备 节点 IPsalt-master 192.168.56.41salt-minion 192.168.56.

利用salt进行系统初始化操作

使用salt对系统进行初始化操作 概述 使用cobbler安装的操作系统,默认安装了一些基本的软件,比如zabbix-agent.salt-minion等,还没有对系统进行基本的初始化操作,为了实现标准化操作,需要在正式使用系统之前,对系统进行标准的初始化操作.基于这一个目标,通过salt来对系统进行初始化操作.主要操作点有如下几个: DNS标准配置 history命令调优,记录时间和用户 内核参数优化 yum仓库配置 zabbix-agent配置 命令记录 下面就基于以上的优化点,来进行针对性

基于最新RHEL7系统的Packstack自动部署RDO(OpenStack Icehouse)

本篇文章是通过最新发布的Red Hat Enterpise Linux 7 系统部署OpenStack,集成到RHEL系统的OpenStack 简称为RDO.此篇是通过制作应答文件answer.conf自动化部署OpenStack Icehouse 版本. 由于采用RHEL7系统在部署中或多或少碰到不少报错的问题,这里只列出我的几张截图,在部署中还是需要根据实际情况来决定,多看下报错及日志文件:例如:解决包的依赖,服务不能没有启动起来,数据库密码设置未成功等:希望本篇可以给部署RDO的同学带来一