saltstack 动态pillar实现

简介

  pillar支持的数据存储方式有不少,mysql, mogo,json等。本篇介绍关于http存储方式。node

  首先简要说明整个流程: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串。python

实现过程

(1)HTTPmysql

  首先要创建HTTP服务,方法不少,这里的关键是提供一个动态url,salt经过不一样的minion_id获取对应要存储的pillar值。sql

# 动态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 源码修改json

  写了个高大上的名字,其实就是添加一个Python脚本。。。脚本目录是在salt安装在python的site-packages目录里。找不到就find / -name salt ;vim

# 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 配置文件api

# vim /etc/salt/master    
# 注意格式空格
ext_pillar:
  - sops:  # 这个是上面添加的py文件名称
      api: http://192.168.1.12:8088/pillar/

(4)重启masterurl

# 重启
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
相关文章
相关标签/搜索