salt api

  1 #!/usr/bin/env python
  2 # -*- coding:utf8 -*-
  3 # __author__ = '北方姆Q'
  4 
  5 import requests
  6 import json
  7 from django.conf import settings
  8 from requests.packages.urllib3.exceptions import InsecureRequestWarning
  9 from plugins.duia.singleton import Singleton
 10 
 11 requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
 12 
 13 
 14 class SaltFactory(Singleton):
 15     def __init__(self, url=settings.SALT_URL, username=settings.SALT_USER, password=settings.SALT_USER_PASSWORD):
 16         """
 17 
 18         :param url: 默认api url
 19         :param username: api 用户
 20         :param password: api 用户密码
 21         """
 22         self.url = url
 23         self.username = username
 24         self.password = password
 25         self.header = {"Content-type": "application/json"}
 26         self.login_url = url + "login" if url.endswith('/') else url + "/login"
 27         self.login_data = {'username': self.username, 'password': self.password, 'eauth': 'pam'}
 28         self.token = self.worker(self.login_url, self.login_data)['token']  # 获取该用户的token,便于操作
 29         self.header['X-Auth-Token'] = self.token
 30         self.minions_url = self.url + "minions" if self.url.endswith('/') else self.url + "/minions"
 31 
 32     def worker(self, url, data):
 33         """
 34         所有命令真实执行者,更细节的命令可以通过这个执行
 35         :param url: api下各url
 36         :param data: 需要传入的参数
 37         :return: 命令执行结果,dict
 38         """
 39         data = json.dumps(data)
 40         response = requests.post(url, headers=self.header, data=data, verify=False)
 41         return response.json()['return'][0]
 42 
 43     def get_data_by_jid(self, jid, display=False):
 44         """
 45         获取某个任务id的执行结果
 46         :param jid: 任务id,str
 47         :param display: 结果展示长度,默认精简展示
 48         :return: 命令执行结果,如果任务不存在或者未运行结束为空字典,dict
 49         """
 50         assert isinstance(jid, str)
 51         data = {
 52             'client': 'runner',
 53             'fun': 'jobs.lookup_jid',
 54             'jid': jid
 55         }
 56         ret = self.worker(self.url, data)
 57 
 58         if display is False:
 59             for node_value in ret.values():
 60                 for job_key, job_value in node_value.items():
 61                     node_value[job_key] = job_value['result']
 62         return ret
 63 
 64     def get_data(self, client='local_batch', tgt='*', fun='test.ping', arg=None, tgt_type='glob', batch='100%'):
 65         """
 66         运行一条命令并等待结果
 67         :param client: 连接方式
 68 
 69             * ``local`` - 普通执行
 70             * ``local_batch`` - 分批执行 - Default
 71             * ``local_async`` - 异步执行
 72 
 73         :param tgt: 受控目标
 74         :param fun: 执行模块
 75         :param arg: 运行参数(pillar也写在里面),list
 76 
 77             ['pwd', 'test=True']
 78             ['sleep 5 && touch /root/file || touch /root/test']
 79             ['keepalived.keepalived.', 'test=True', 'saltenv=prod']
 80 
 81         :param tgt_type: 受控目标类型
 82 
 83             * ``glob`` - Bash glob completion - Default
 84             * ``pcre`` - Perl style regular expression
 85             * ``list`` - Python list of hosts
 86             * ``grain`` - Match based on a grain comparison
 87             * ``grain_pcre`` - Grain comparison with a regex
 88             * ``pillar`` - Pillar data comparison
 89             * ``pillar_pcre`` - Pillar data comparison with a regex
 90             * ``nodegroup`` - Match on nodegroup
 91             * ``range`` - Use a Range server for matching
 92             * ``compound`` - Pass a compound match string
 93             * ``ipcidr`` - Match based on Subnet (CIDR notation) or IPv4 address.
 94 
 95         :param batch: 一批的数量,数字或者百分比,str
 96         :return: 命令执行结果,dict
 97         """
 98         data = {
 99             'client': client,
100             'tgt': tgt,
101             'fun': fun,
102             'tgt_type': tgt_type,
103             'batch': batch
104         }
105         if arg:
106             data['arg'] = arg
107         ret = self.worker(self.url, data)
108         return ret
109 
110     def get_minions(self):
111         """
112         获取所有minions名
113         :return: 全minions名的generator
114         """
115         response = requests.get(self.minions_url, headers=self.header, verify=False)
116         minions_list = [minion for minion in response.json()['return'][0].keys()]
117         return minions_list

前端json解析

 1         function syntaxHighlight(json) {
 2             if (typeof json != 'string') {
 3                 json = JSON.stringify(json, undefined, 2);
 4             }
 5             json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
 6             return json.replace(/("(\u[a-zA-Z0-9]{4}|\[^u]|[^\"])*"(s*:)?|(true|false|null)|-?d+(?:.d*)?(?:[eE][+-]?d+)?)/g, function(match) {
 7                 var cls = 'number';
 8                 if (/^"/.test(match)) {
 9                     if (/:$/.test(match)) {
10                         cls = 'key';
11                     } else {
12                         cls = 'string';
13                     }
14                 } else if (/true|false/.test(match)) {
15                     cls = 'boolean';
16                 } else if (/null/.test(match)) {
17                     cls = 'null';
18                 }
19                 return '<span class="' + cls + '">' + match + '</span>';
20             });
21         }
原文地址:https://www.cnblogs.com/bfmq/p/7905044.html