微信号:Idevops168

介绍:运维自动化开发:python、django、saltstack、tornado、bootstrap、redis等经验分享!

SaltStack 实战之pillar的py格式应用

2015-08-28 08:33 张奇

最近接到了一个需求,需要向每台机器推送一组key值相同但数据值不同的数据,而且数据的经常变动,于是想到了使用salt pillar实现,传统yaml的格式编写方式如下:


root@ubuntu:/srv/pillar# cat top.sls

base:

'192.168.227.129':

- srv

'192.168.227.130':

- srv1


root@ubuntu:/srv/pillar# cat srv.sls

myname: 'a'


root@ubuntu:/srv/pillar# cat srv1.sls

myname:

'b'


root@ubuntu:/srv/pillar# salt \* pillar.item myname

192.168.227.129:

----------

myname:

a

192.168.227.130:

----------

myname:

b

上面的实现起来本身是没有问题的,但是机器多了,数据复杂了,写起来会很麻烦,主要是数据经常性变动.

查阅资料发现pillar是支持python代码的,于是将pillar的格式转换成了下面的方法:


root@ubuntu:/srv/pillar# cat top.sls

base:

'*':

- srv


root@ubuntu:/srv/pillar# cat srv.sls

#!py

def run():

d = {'192.168.227.130': {'myname': 'b'}, '192.168.227.129': {'myname': 'a'}}

id = __salt__['grains.get']('id')

for i in d:

if id == i:

ret = d[i]

return ret


root@ubuntu:/srv/pillar# salt \* pillar.item myname

192.168.227.129:

----------

myname:

a

192.168.227.130:

----------

myname:

b


使用pythonpillar时一定要使用run作为入口函数,返回值要为字典格式,而且文件的开头要加#!py声明渲染方式.

上面的例子只是简单的一个手写字典的测试数据,看看方法可行.真正环境从Mysql中获取,代码如下:


#!py

import MySQLdb


def sql_exc(cmd):

try:

db = MySQLdb.connect(host='127.0.0.1', port=3306, user='test', passwd='test', charset="utf8")

except:

return 2, "Error: Mysql not connect"

try:

cursor = db.cursor(MySQLdb.cursors.DictCursor)

cursor.execute(cmd)

db.commit()

sqlret = cursor.fetchall()

except:

return 2,

cursor.close()

db.close()

return 0, sqlret


def gen_data():

inssql = r"select saltid,myname from `test`.test;"

org_data = sql_exc(inssql)

data = {}

if not data[0]:

for item in org_data[1]:

host = item.pop('saltid')

data[host] = item

return data


def run():

id = __grains__['id']

data = gen_data()

if id in data:

ret = data[id]

else:

ret = {}

return ret




root@ubuntu:/srv/pillar# salt \* pillar.item myname

192.168.227.129:

----------

myname:

a

192.168.227.130:

----------

myname:

b


字段这里只测试了一个,可以多个,设计就看具体需求了,存在redis里也没有问题,有了mysqlredis和别的api接口交互起来也会很方便。


 
DevOps 更多文章 saltstack之salt-ssh的细枝末节 Ready ? "Go" !!! Go学习之数组、切片、关联数组、Range 遍历 消息队列设计精要 DNS解析过程详解
猜您喜欢 骗局!卸载搜狗输入法教程 欢迎大家来到后端技术小黑屋 又见CLOSE_WAIT Nginx技巧——在Server_Name指令中使用正则表达式 Android之WebView快速上手