• Returners 返回器



    Returner

    minion端将数据返回给salt master,但是我们可以使用salt Returner将返回的数据重定向到
    其他外部组件上,便于以后的分析和归档。

    所有内置的Returner支持列表参看链接:http://docs.saltstack.cn/ref/returners/index.html,里面有详细的使用方法


    USING RETURNERS

    可以指定一个returners提供数据接收
    salt '*' test.ping --return redis_return

    也可以指定多个returners接收器
    salt '*' test.ping --return mongo_return,redis_return,cassandra_return


    WRITING A RETURNER

    一个redis的例子:

     1 import redis
     2 import json
     3 
     4 def returner(ret):
     5     '''
     6     Return information to a redis server
     7     '''
     8     # Get a redis connection
     9     serv = redis.Redis(
    10                 host='redis-serv.example.com',
    11                 port=6379,
    12                 db='0')
    13     serv.sadd("%(id)s:jobs" % ret, ret['jid'])
    14     serv.set("%(jid)s:%(id)s" % ret, json.dumps(ret['return']))
    15     serv.sadd('jobs', ret['jid'])
    16     serv.sadd(ret['jid'], ret['id'])
    View Code

    minion端返回的数据格式可使用如下命令获取:

    salt-call --local --metadata test.ping --out=pprint

    如何写一个returners,介绍一个job cache需要具备的哪些功能要求

    一个MASTER JOB CACHE SUPPORT需要提供的基本功能
    prep_jid
    提供jid的唯一性
    示例代码:

    1 def prep_jid(nocache, passed_jid=None):  # pylint: disable=unused-argument
    2     '''
    3     Do any work necessary to prepare a JID, including sending a custom id
    4     '''
    5     return passed_jid if passed_jid is not None else salt.utils.jid.gen_jid()
    View Code

    save_load
    保存job的内容,并进行序列化存放在salt.jids表中
    示例代码:

     1 def save_load(jid, load):
     2     '''
     3     Save the load to the specified jid id
     4     '''
     5     query = '''INSERT INTO salt.jids (
     6                  jid, load
     7                ) VALUES (
     8                  '{0}', '{1}'
     9                );'''.format(jid, json.dumps(load))
    10 
    11     # cassandra_cql.cql_query may raise a CommandExecutionError
    12     try:
    13         __salt__['cassandra_cql.cql_query'](query)
    14     except CommandExecutionError:
    15         log.critical('Could not save load in jids table.')
    16         raise
    17     except Exception as e:
    18         log.critical('''Unexpected error while inserting into
    19          jids: {0}'''.format(str(e)))
    20         raise
    View Code

    get_load
    接收一个jid参数,返回存储在save_load里面的内容
    示例代码:

     1 def get_load(jid):
     2     '''
     3     Return the load data that marks a specified jid
     4     '''
     5     query = '''SELECT load FROM salt.jids WHERE jid = '{0}';'''.format(jid)
     6 
     7     ret = {}
     8 
     9     # cassandra_cql.cql_query may raise a CommandExecutionError
    10     try:
    11         data = __salt__['cassandra_cql.cql_query'](query)
    12         if data:
    13             load = data[0].get('load')
    14             if load:
    15                 ret = json.loads(load)
    16     except CommandExecutionError:
    17         log.critical('Could not get load from jids table.')
    18         raise
    19     except Exception as e:
    20         log.critical('''Unexpected error while getting load from
    21          jids: {0}'''.format(str(e)))
    22         raise
    23 
    24     return ret
    View Code

    一个EXTERNAL JOB CACHE SUPPORT需要提供除master的那些功能以外还需要提供额外的一些功能

    get_jid
    根据任务ID返回一个字典类型的job内容

     1 {
     2     "local": {
     3         "master_minion": {
     4             "fun_args": [],
     5             "jid": "20150330121011408195",
     6             "return": true,
     7             "retcode": 0,
     8             "success": true,
     9             "cmd": "_return",
    10             "_stamp": "2015-03-30T12:10:12.708663",
    11             "fun": "test.ping",
    12             "id": "master_minion"
    13         }
    14     }
    15 }
    View Code

    get_fun
    返回一组minion和对应执行的函数

    1 {
    2     "local": {
    3         "minion1": "test.ping",
    4         "minion3": "test.ping",
    5         "minion2": "test.ping"
    6     }
    7 }
    View Code

    get_jids
    返回job id的列表

    1 {
    2     "local": [
    3         "20150330121011408195",
    4         "20150330195922139916"
    5     ]
    6 }
    View Code

    get_minions
    返回minion列表

    1 {
    2      "local": [
    3          "minion3",
    4          "minion2",
    5          "minion1",
    6          "master_minion"
    7      ]
    8 }
    View Code

    EVENT SUPPORT

    支持时间返回,但是需要在master中打开相关的配置
    event_return
    event_return_queue

    支持自定义event_return,默认的返回示例如下:

     1 def event_return(events):
     2  '''
     3  Return event to mysql server
     4 
     5  Requires that configuration be enabled via 'event_return'
     6  option in master config.
     7  '''
     8  with _get_serv(events, commit=True) as cur:
     9      for event in events:
    10          tag = event.get('tag', '')
    11          data = event.get('data', '')
    12          sql = '''INSERT INTO `salt_events` (`tag`, `data`, `master_id` )
    13                   VALUES (%s, %s, %s)'''
    14          cur.execute(sql, (tag, json.dumps(data), __opts__['id']))
    View Code

    CUSTOM RETURNERS

    在file_roots环境里面定义一个_returners目录,使用方法salt://_returners,解释查看:http://docs.saltstack.cn/ref/modules/all/salt.modules.saltutil.html#salt.modules.saltutil.sync_returners里面的释义


    NAMING THE RETURNER

    returners的命名问题,__virtual__ 函数可以用来重写该命名,例如redis_return.py在加载的时候就变成了redis
    示例代码如下:

     1 try:
     2     import redis
     3     HAS_REDIS = True
     4 except ImportError:
     5     HAS_REDIS = False
     6 
     7 __virtualname__ = 'redis'
     8 
     9 def __virtual__():
    10     if not HAS_REDIS:
    11         return False
    12     return __virtualname__
    View Code

    TESTING THE RETURNER


    测试自己写的returner,可以在minion上通过salt-call测试自己编写的扩展存储组件的基本功能
    示例方法如下:

    1 salt-call ret.get_jids cassandra_cql --output=json
    2 salt-call ret.get_fun cassandra_cql test.ping --output=json
    3 salt-call ret.get_minions cassandra_cql --output=json
    4 salt-call ret.get_jid cassandra_cql 20150330121011408195 --output=json
    View Code

    EVENT RETURNERS

    可以记录salt master上的所有时间信息,注意主机的性能问题,因为大量的minion会给master带来较大的压力

     思考:

      (1)为什么extend job cache需要比master端支持更多的功能

          可能是由于在master进行数据收集重定向的时候,master端已经将数据进行过整理,而在minion端收集返回数据则类似一个分布式的信息上传机制,功能需求相应的会复

          杂一些。

  • 相关阅读:
    Spark集群搭建步骤
    Hadoop集群搭建步骤
    Linux上传与下载(sz-rz)
    Spark文档
    Hadoop基本命令详解
    lzo压缩格式文件查看
    hadoop端口配置指南
    eclipse无法连接到makertplace
    Socket 服务端使用多线程实现多客户端通讯实例
    Jenkins和Sonar集成
  • 原文地址:https://www.cnblogs.com/solitarywares/p/7446344.html
Copyright © 2020-2023  润新知