使用Http API接口来读取pillar数据 -- ext_pillar

大多时,在使用pillar我们都是直接用的SLS文件存储数据,但其实pillar可以支持多种数据存储方式,例如: mysql、mongo、json等等;这些都可以在官网或者代码中看到ext_piilar的代码;

pillar支持的数据存储模块列表地址:http://docs.saltstack.com/en/latest/ref/pillar/all/index.html#all-salt-pillars

需求:

先说说为什么会有这个需求,某些时候我们需要把pillar数据存储在CMDB中,或者去拉取CMDB的数据提供pillar使用,这个时候再去编辑pillar下的SLS文件就有点不优雅了;ext_pillar就是解决这个问题,它作为pillar数据映射和数据存储(CMDB)的一个枢纽。

最近在写代码发布,需要用到pillar数据(平台上提供一个版本号,代码url,在打包完代码推送到repo时,把版本号更新到pillar数据上,供saltstack调取),就想起了ext_pillar这个事儿,OMS运维平台用到了MySQL数据库,就想直接使用这个模块;在接触的时候,有点淡淡的忧伤,文档真少~~  找到一个翻译文章采用的是MongoDB,想到再去搭个mongodb就有点过了; 肥肥给我的建议是不要采用MySQL,建议做成Http API接口方式;

pillar是一大利器,不仅可以存储安全性数据,也可以作为业务数据存储; 利用ext_pillar对接CMDB系统,state用来描述业务处理逻辑,而真实数据取自CMDB;以前没想到还可以这么玩,这块绿肥、jacky两人最早实现,很有经验

讲了这么多,来说说这么实现这个Http API的ext_pillar(无CMDB)

1. 实现后端数据  ->   根据业务场景,设计数据结构(dict)来满足业务,控制权在你手上,你想要什么样子就可以实现什么样子,关键点符合你业务

2. 实现ext_pillar,能访问到http访问到后端数据

3. 配置salt master配置文件,重启master

4. pillar测试

实现:

1. 后端数据实现.

采用http方式用的就是JSON数据,不仅能生成json数据,也能变更json数据;首先来看下pillar数据映射SLS文件格式

hdworkers:

ver: 2014102202

上述数据格式转换下dict,{‘hdworkers‘: {‘ver‘: ‘2014102202‘}} ,我只需要实现简单的版本号映射就行,那么复杂的数据,大家可以自行设计;下面贴程序代码(代码很烂,莫喷~)

 # -*- coding: utf-8 -*-
import json
import os

class BuildJson(object):
    ‘‘‘
    Build JSON data(base and minion_id etc..)
    ‘‘‘
    def base_data(self,args):
        ‘‘‘
        build base data
        ‘‘‘
        info = {}
        ret = dict(info,**args)
        self.write_data(‘base‘,ret)

    def build_data(self,id,args):
        if not os.path.exists(‘/home/api/pillar/%s‘ % (id)):
            with open(‘/home/api/pillar/base‘) as f:
                obj = f.readlines()[0]
            ret = eval(obj)
            self.write_data(id,ret)
        with open(‘/home/api/pillar/%s‘ % (id)) as f:
            data = f.readlines()[0]
        cov_data = eval(data)
        if not cov_data.has_key(args.keys()[0]):
            ret = dict(cov_data,**args)
            self.write_data(id,ret)
        else:
            cov_data.update(args)
            self.write_data(id,cov_data)

    def write_data(self,file,ret):
        f = open(‘/home/api/pillar/%s‘ % (file),‘w+‘)           
        f.write(str(ret))
        f.close()

#data = {‘hdworkers‘:{‘ver‘:‘2014103105‘}}

#bapi = BuildJson()

#bapi.base_data(data)

#bapi.build_data(‘test-01‘,data)

生成base数据,再调用build_data(继承base数据,同时更新数据),而有些数据是会在id上有,但base是没的~,所以上述是我写的;  看官可以自行玩耍,,有好的可以反馈给我,我在修改~

2. 实现ext_pillar,能通过http方式访问

因为是和OMS平台结合,上述生成的文件,我在nginx做了localtion设置,让数据能通过http访问;不然ext_pillar没法玩了

Nginx配置过程我就忽略,直接贴结果

ID数据能通过http访问到,OK,往下走,配ext_pillar

ext_pillar实现

more /usr/lib/python2.6/site-packages/salt/pillar/oms.py

# -*- coding: utf-8 -*-
‘‘‘
author: pengyao
A module to pull data from OMS system via its API into the Pillar dictionary

Configuring the Wolf system ext_pillar
==================================

.. code-block:: yaml

  ext_pillar:
  - oms:
      api: http://oms.example.com/api/pillar/

Module Documentation
====================
‘‘‘

# Import python libs
import logging
import urllib2
import json

# Set up logging
log = logging.getLogger(__name__)

def ext_pillar(minion_id, pillar, api):
    ‘‘‘
    Read pillar data from OMS system via its API.
    ‘‘‘
    pillar_url = api + "/" + minion_id

    log.info("Querying OMS system Pillar for %r" %(minion_id))
    try:
        request = urllib2.urlopen(pillar_url).read()
        ret = eval(request)
        result = json.loads(json.dumps(ret))
    except Exception, e:
        log.exception(
            ‘Query OMS system failed! Error: %s‘ %(e)
        )
        return {}

    return result

上述代码很简单,urllib2请求minion_id数据,json.loads把数据转换成dict返回给saltstack。 注意urllib请求得到的数据是str,我这把str先给转换成dict在传递给json去转,避免成为unicode......(赶脚json是不是有点多~)

3. 配置salt master配置文件,pillar测试

根据ext_pillar代码配置master配置文件,让master会去加载pillar数据

cat /etc/salt/master

ext_pillar:

- oms:           #代码名字,oms.py
         api: http://X.X.X.X/pillar/       # api前缀,http://访问域名/IP/pillar/minion_id能访问到数据

重启master

/etc/init.d/salt-master restart

4. pillar测试

salt  ‘minion_id‘ pillar.item hdworkers

我这就不演示数据生成过程,只要后端数据更新,执行对应minion id的pillar就能获取到最新数据,因为pillar是动态的~

希望这篇文章能帮助大家,玩的开心~~~   以后再也不用和我一样找不到文章了。。

时间: 2024-11-01 14:36:05

使用Http API接口来读取pillar数据 -- ext_pillar的相关文章

新闻资讯API接口-健康资讯免费数据API接口

健康资讯API免费接口 ,主要开放健康资讯,医药新闻,社会热点,企业要闻,生活贴士. 健康资讯是医药吧网(www.yi18.net)旗下的医药健康网,专业的健康 资讯门户网站,提供最专业.完善的健康信息服务. 新闻资讯的API路径 BasePath( api.yi18.net/news ) 主要包括如下四个功能 资讯分类.资讯详情.资讯列表.资讯搜索 API接口调用方式都是常见的http方式,返回结果是现在比较流行的JSON. 1.取得资讯信息列表 如:api.yi18.net/news/lis

疾病API接口免费开放-APP数据接口

医疗中心 (medical.yi18.net)是医药吧网(www.yi18.net)旗下的医疗信息网. 专门提供疾病信息,专门的疾病数据库中心. 现在医疗中心网 中有8千左右的疾病数据信息,同时每天有5个左右的数据更新. 虽然食品总数不多,但我们会不断的更新域维护. API不仅提供APP调用,同时也可以支持网站调用.免费开放,永久支持! API文档地址:doc.yi18.net/diseaseapidoc 疾病API接口的开放,主要提供快速生存APP应用,为APP应用提供免费的数据接口. 比如:

不使用jQuery对Web API接口POST,PUT,DELETE数据

前些天,Insus.NET有演示Web API接口的操作: <怎样操作WebAPI接口(显示数据)>http://www.cnblogs.com/insus/p/5670401.html <ASP.NET MVC对WebAPI接口操作(添加,更新和删除)>http://www.cnblogs.com/insus/p/5673641.html 但是,有网友说,不想使用jQuery,全部以ASP.NET MVC来实现.Ok,那来看看,先来实现POST的功能,即是往Web API添加数据

如何用 Python 和 API 收集与分析网络数据?

摘自 https://www.jianshu.com/p/d52020f0c247 本文以一款阿里云市场历史天气查询产品为例,为你逐步介绍如何用 Python 调用 API 收集.分析与可视化数据.希望你举一反三,轻松应对今后的 API 数据收集与分析任务. 市场 我们尝试的,是他们找到的阿里云市场的一款 API 产品,提供天气数据. 它来自于易源数据,链接在 https://market.aliyun.com/products/57096001/cmapi010812.html?spm=517

百度云删除文件API接口探索

通过抓包发现百度云删除文件接口https://pan.baidu.com/api/filemanager,本文主要试图通过该接口来封装一个删除百度网盘文件的api接口. 浏览器请求数据包信息如下: 浏览器响应信息如下: 上述响应信息说明文件删除成功 代码如下: 1 #! /usr/bin/python3 2 # -*- coding: UTF-8 -*- 3 4 import time, re, requests, json 5 from selenium.webdriver import Fi

开放API接口及其安全性

开放出来给别人调用的API接口是就是开放API接口. 弱点: 数据窃取 用户的密码等信息被不轨之人窃取,登录账号发布敏感信息,盗刷等. 数据篡改 提交的数据被抓包后进行篡改再提交. 数据泄露 爬虫将业务数据甚至核心数据抓取,直接或者间接造成损失. RSA/DES加密 MD5混淆 TOKEN令牌 有令牌才能通过,没有令牌则不能通过 加密分为对称加密和非对称加密 对称加密有:DES,AES 加密和解密是使用同一套秘钥 非对称加密有:RSA 公钥和私钥 公钥加密,私钥解密 RSA可以用来加密和签名 H

Jquery Mobile实例--利用优酷JSON接口读取视频数据

本文将介绍,如何利用JqueryMobile调用优酷API JSON接口显示视频数据. (1)注册用户接口. 首页,到 http://open.youku.com 注册一个账户,并通过验证.然后找到API接口 (http://open.youku.com/docs/tech_doc.html) 可以看到优酷提供不少API,本文将演示“通过视频关键词”接口. 点击进去后,会发现client_id和keyword是必填的,因此,未来构造的URL应该类似 https://openapi.youku.c

【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地

本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得到客户端的ip,并获取利用新浪api接口获取此ip的归属地. 可以看到,在IE6也是相当正常的. 目录结构如下,非常简单,同样就两个文件,其实如果你愿意,写成一个php文件也可以,但是显示层和逻辑业务层还是不混在一起为好吧? 唯一值得注意的是,这两个文件打死也不能一个叫ipGet.php,ipGet.html

HBase-scan API 通过scan读取表中数据

直接贴代码啦 /** * * @param zkIp * @param zkPort * @param tablename * @param startRow 传null扫全表 * @param stopRow 已~结尾 * @throws Exception */ public static void scanTable(String zkIp,String zkPort,String tablename,String startRow,String stopRow) throws Excep