获取token

#!/usr/bin/env python
#-*-coding:utf--*- import urllib
import urllib.parse
import urllib.request
# import urllib2    #python2.x需要引入
import ssl,json

context = ssl._create_unverified_context()
ssl._create_default_https_context = ssl._create_unverified_context  #ssl问题 class SaltAPI(object):
__token_id = ''
def __init__(self,url,username,password):  #初始化
self.__url = url.strip()
self.__user = username
self.__password = password

#python2示例
# def token_id(self):
# ''' user login and get token id '''
# params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
# encode = urllib.urlencode(params)
# obj = urllib.unquote(encode)
# content = self.postRequest(obj,prefix='/login')
# try:
# self.__token_id = content['return'][]['token']
# print self.__token_id
# except KeyError:
# raise KeyError
#
# def postRequest(self,obj,prefix='/'):
# url = self.__url + prefix
# headers = {'X-Auth-Token':self.__token_id}
# req = urllib2.Request(url, obj, headers)
# opener = urllib2.urlopen(req)
# content = json.loads(opener.read())
# return content    #python3.x示例
def token_id(self):      #获取token
params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
encode_params = urllib.parse.urlencode(params).encode(encoding='utf-8')
content = self.postRequest(encode_params,prefix='/login')  #表示获取token的时候访问/login
self.__token_id = content['return'][0]['token']
print (self.__token_id)
    def postRequest(self,params,prefix='/'):    #构造http请求
     url = self.__url + prefix
     headers = {'X-Auth-Token':self.__token_id}
req = urllib.request.Request(url,params,headers=headers)
data = urllib.request.urlopen(req).read().decode("utf-8")
content = json.loads(data)  #由于获取的内容为str类型,所以用json处理一下方便操作
return content v = SaltAPI("https://192.168.132.148:8000",username="saltapi",password="saltapi") v.token_id()

 

示例(python3):

   #在以上的基础上定义一个函数,获取所有的key名(主机名) 
  def list_all_key(self): params = {'client': 'wheel', 'fun': 'key.list_all'}      #自定义saltstack要执行的相关参数
obj = urllib.parse.urlencode(params).encode(encoding="utf-8")
self.token_id()      #调用token_id函数,使执行post请求的时候加载当时的token_id content = self.postRequest(obj)    #调用postRequest函数
minions = content['return'][]['data']['return']['minions']
minions_pre = content['return'][]['data']['return']['minions_pre']
#print (minions,minions_pre)
return minions, minions_pre

其他函数示例(仅供参考,根据实际情况修改)

#!/usr/bin/env python
# coding: utf8 import urllib2,urllib try:
import json
except ImportError:
import simplejson as json class SaltAPI(object):
__token_id = ''
def __init__(self,url,username,password):
self.__url = url.rstrip('/')
self.__user = username
self.__password = password def token_id(self):
''' user login and get token id '''
params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
encode = urllib.urlencode(params)
obj = urllib.unquote(encode)
content = self.postRequest(obj,prefix='/login')
try:
self.__token_id = content['return'][0]['token']
except KeyError:
raise KeyError def postRequest(self,obj,prefix='/'):
url = self.__url + prefix
headers = {'X-Auth-Token' : self.__token_id}
req = urllib2.Request(url, obj, headers)
opener = urllib2.urlopen(req)
content = json.loads(opener.read())
return content def list_all_key(self):
'''
获取包括认证、未认证salt主机
''' params = {'client': 'wheel', 'fun': 'key.list_all'}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
minions = content['return'][0]['data']['return']['minions']
minions_pre = content['return'][0]['data']['return']['minions_pre']
return minions,minions_pre def delete_key(self,node_name):
'''
拒绝salt主机
''' params = {'client': 'wheel', 'fun': 'key.delete', 'match': node_name}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]['data']['success']
return ret def accept_key(self,node_name):
'''
接受salt主机
''' params = {'client': 'wheel', 'fun': 'key.accept', 'match': node_name}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]['data']['success']
return ret def salt_runner(self,jid):
'''
通过jid获取执行结果
''' params = {'client':'runner', 'fun':'jobs.lookup_jid', 'jid': jid}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def salt_running_jobs(self):
'''
获取运行中的任务
''' params = {'client':'runner', 'fun':'jobs.active'}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def remote_execution(self,tgt,fun,arg,expr_form):
'''
异步执行远程命令、部署模块
''' params = {'client': 'local_async', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': expr_form}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
jid = content['return'][0]['jid']
return jid def remote_localexec(self,tgt,fun,arg,expr_form):
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': expr_form}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def salt_state(self,tgt,arg,expr_form):
'''
sls文件
'''
params = {'client': 'local', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg, 'expr_form': expr_form}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def project_manage(self,tgt,fun,arg1,arg2,arg3,arg4,arg5,expr_form):
'''
文件上传、备份到minion、项目管理
'''
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg1, 'expr_form': expr_form}
# 拼接url参数
params2 = {'arg':arg2}
arg_add = urllib.urlencode(params2)
obj = urllib.urlencode(params)
obj = obj + '&' + arg_add
params3 = {'arg': arg3}
arg_add = urllib.urlencode(params3)
obj = obj + '&' + arg_add
params4 = {'arg': arg4}
arg_add = urllib.urlencode(params4)
obj = obj + '&' + arg_add
params5 = {'arg': arg5}
arg_add = urllib.urlencode(params5)
obj = obj + '&' + arg_add
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def file_copy(self,tgt,fun,arg1,arg2,expr_form):
'''
文件上传、备份到minion、项目管理
'''
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg1, 'expr_form': expr_form}
# 拼接url参数
params2 = {'arg':arg2}
arg_add = urllib.urlencode(params2)
obj = urllib.urlencode(params)
obj = obj + '&' + arg_add
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def file_bak(self,tgt,fun,arg,expr_form):
'''
文件备份到master
'''
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': expr_form}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def file_manage(self,tgt,fun,arg1,arg2,arg3,expr_form):
'''
文件回滚
'''
params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg1, 'expr_form': expr_form}
params2 = {'arg': arg2}
arg_add = urllib.urlencode(params2)
obj = urllib.urlencode(params)
obj = obj + '&' + arg_add
params3 = {'arg': arg3}
arg_add_2 = urllib.urlencode(params3)
obj = obj + '&' + arg_add_2
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def salt_alive(self,tgt):
'''
salt主机存活检测
''' params = {'client': 'local', 'tgt': tgt, 'fun': 'test.ping'}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0]
return ret def remote_server_info(self,tgt,fun):
'''
获取远程主机信息
'''
params = {'client': 'local', 'tgt': tgt, 'fun': fun}
obj = urllib.urlencode(params)
self.token_id()
content = self.postRequest(obj)
ret = content['return'][0][tgt]
return ret def main():
sapi = SaltAPI(url='https://127.0.0.1:8000',username='saltapi',password='password') if __name__ == '__main__':
main()
复制代码

jid 通过返回结果中的jid可以获取saltstack的执行状态(结果)

#获取jid
[root@k8s_master ~]# salt-run jobs.list_jobs|tail -n 20
runner.jobs.lookup_jid
StartTime:
2017, Nov 01 10:10:11.809798
Target:
k8s_master_master
Target-type:
User:
root
20171101102000983680:
----------
Arguments:
Function:
runner.jobs.list_jobs
StartTime:
2017, Nov 01 10:20:00.983680
Target:
k8s_master_master
Target-type:
User:
root

根据jid获取任务执行结果

[root@k8s_master ~]# salt-run jobs.lookup_jid 20171101035904902242
k8s_master:
True
[root@k8s_master ~]# salt-run jobs.lookup_jid 20171101033119112939
k8s_master_master:
----------
_stamp:
2017-10-31T19:31:20.208453
fun:
wheel.key.list_all
jid:
20171101033119112939
return:
----------
local:
- master.pem
- master.pub
minions:
- k8s_master
- k8s_node1
- k8s_node2
minions_denied:
minions_pre:
minions_rejected:
success:
True
user:
UNKNOWN

  

python 操作 saltstack Api(二) 示例的更多相关文章

  1. python操作ansible api示例

    #!/usr/bin/env python # -*- coding:utf-8 -*- import json import shutil from collections import named ...

  2. Python 操作 GA API 指南

    因为需要写一个 Blog Feature 的缘故,所以接触了下 GA 的 Python API,发现 G 家的 API 不是那么直观,比较绕,但是,在使用过程中发现其实 G 家的 API 设计挺有意思 ...

  3. redis -- python操作连接redis简单示例

    1.先安装 redis,pyredis sudo pip install redis sudo pip install python-redis 2.示例: importredis >>& ...

  4. Python操作Redis(二)

    List操作 redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最 ...

  5. Python 操作Zabbix API 获取ERROR级别告警信息并打印

    1.需求:有一个语音合成播报项目,要实时获取zabbix的ERROR级别以上告警信息,将该信息合成语音播报出去.(合成语音及播报已经完成) 2.现实:整理zabbix告警级别,将不太重要的告警放到ER ...

  6. Python 操作Sonqube API 获取检测结果并打印

    1.需求:每次Sonqube检查完毕后,需要登陆才能看到结果无法通过Jenkins发布后直接看到bug 及漏洞数量. 2.demo:发布后,可以将该项目的检测结果简单打印出来显示,后面还可以集成钉钉发 ...

  7. Python操作JSON数据代码示例

    #!/usr/bin/env python import json import os def json_test(): return_dic = {} json_data = { 'appid':' ...

  8. python操作mongodb之二聚合查询

    #聚合查询 from pymongo import MongoClient db = MongoClient('mongodb://10.0.0.9:27017/').aggregation_exam ...

  9. Python操作Saltstack

    1.代码 # -*- coding:utf-8 -*- import urllib.request import urllib.parse import json class saltAPI(): d ...

随机推荐

  1. .net core 2.0 数据访问-迁移

    将用于进行迁移的 Entity Framework Core NuGet包 添加到`.csproj`文件 <ItemGroup> <DotNetCliToolReference In ...

  2. thymeleaf手动映射根路径映射

    到/src/java/resources/templates/index.html下 @RequestMapping("/") public String index(){ ret ...

  3. MD5进行解密操作

    package com.dyy.test; import java.security.MessageDigest; public class TestMD5Util { /*** * MD5加码 生成 ...

  4. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...

  5. Python面试题练习

    1.实现1--100之和 #解答一 print sum(xrange(101)) #解答二 s=0 for i in xrange(101): s = s + i print s 2.如何在一个函数内 ...

  6. CodeForces 632C The Smallest String Concatenation//用string和sort就好了&&string的基础用法

    Description You're given a list of n strings a1, a2, ..., an. You'd like to concatenate them togethe ...

  7. 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)

    [COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σa ...

  8. Cannot set property 'innerHTML' of null

    异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 看如下错误代码: 知道是加载的问题就好解决了

  9. 简明的Python教程中的几个疑惑点分析#2

    #1简明的Python教程当中第十四章Python标准库介绍中的使用sys模块 假如你没看懂sys模块这一章节,那么没关系,看下面一段代码再看简明的Python教程中的sys模块实例你将很容易看懂 代 ...

  10. 如何设计出优秀的Restful API?

    https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247485240&idx=1&sn=b5b9c8c41659d2 ...