saltstack 动态pillar实现
简介
pillar支持的数据存储方式有很多,mysql, mogo,json等。本篇介绍关于http存储方式。
首先简要说明整个流程:salt-master会去一个指定http发送get请求获取一个json串,然后将json存储为pillar。获取json时是根据salt-minon的minion_id 去获取,也就说每个minion_id获取到的json是不同的,这样http页面就应该是一个动态页面。例如http:/test.com/pillar/minion_id;不同的minion_id获取不同的json串。
实现过程
(1)HTTP
首先要建立HTTP服务,方法很多,这里的关键是提供一个动态url,salt通过不同的minion_id获取对应要存储的pillar值。
# 动态url获取内容,需要达到下面的效果, node1和node2是不同的minion_id 访问 http://192.168.1.12:8088/pillar/node1 获取: ' {"serverid":"1001","mysql_port":"3306"}' 访问 http://192.168.1.12:8088/pillar/node2 获取: ' {"serverid":"1002","mysql_port":"3306"}'
(2)salt 源码修改
写了个高大上的名字,其实就是添加一个Python脚本。。。脚本目录是在salt安装在python的site-packages目录里。找不到就find / -name salt ;
# cd /usr/local/lib/python3.6/site-packages/salt/pillar/ # 这个目录下是pillar的各种ext_pillar方法 # vim ops.py # 创建一个python脚本,名字随意取,但一定要唯一,名字之后会用到 #!/usr/bin/env python # -*- coding:utf-8 -*- # author : wangyongcun import logging import requests import json log = logging.getLogger(__name__) def ext_pillar(minion_id, pillar, api): pillar_url = api + "/" + minion_id # 不同minion将访问不同的url log.warning("Querying SOPS system Pillar of %s" % (minion_id, )) # 自己加的一条日志,可忽略 try: ret = requests.get(url=pillar_url) # 向url发送get请求,这个方法需要requests模块,若没有需要安装,在master安装就可以 r = ret.text # get获取到的结果 if r: result = json.loads(r) # 将获取的json字符串转化为字典类型 else: # 如果获取的json为空 result = {} except Exception as e: # 这个异常处理,一般情况都是无法连接url获取到内容,记录个日志 log.exception( "Query SOPS system failed! Error: [%s] :%s" % (minion_id,e, ) ) return {} return result # 返回字典格式的数据
(3)修改salt-master 配置文件
# vim /etc/salt/master # 注意格式空格 ext_pillar: - sops: # 这个是上面添加的py文件名称 api: http://192.168.1.12:8088/pillar/
(4)重启master
# 重启 systemctl stop salt-master systemctl start salt-master # 刷新pillar salt '*' saltutil.refresh_pillar # 查看一下 [root@aliyuntest ~]# salt '*' pillar.items node1: ---------- mysql_port: 3306 serverid: 1001 node2: ---------- mysql_port: 3306 serverid: 1002