python 操作 saltstack Api(二) 示例
获取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(二) 示例的更多相关文章
- python操作ansible api示例
#!/usr/bin/env python # -*- coding:utf-8 -*- import json import shutil from collections import named ...
- Python 操作 GA API 指南
因为需要写一个 Blog Feature 的缘故,所以接触了下 GA 的 Python API,发现 G 家的 API 不是那么直观,比较绕,但是,在使用过程中发现其实 G 家的 API 设计挺有意思 ...
- redis -- python操作连接redis简单示例
1.先安装 redis,pyredis sudo pip install redis sudo pip install python-redis 2.示例: importredis >>& ...
- Python操作Redis(二)
List操作 redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最 ...
- Python 操作Zabbix API 获取ERROR级别告警信息并打印
1.需求:有一个语音合成播报项目,要实时获取zabbix的ERROR级别以上告警信息,将该信息合成语音播报出去.(合成语音及播报已经完成) 2.现实:整理zabbix告警级别,将不太重要的告警放到ER ...
- Python 操作Sonqube API 获取检测结果并打印
1.需求:每次Sonqube检查完毕后,需要登陆才能看到结果无法通过Jenkins发布后直接看到bug 及漏洞数量. 2.demo:发布后,可以将该项目的检测结果简单打印出来显示,后面还可以集成钉钉发 ...
- Python操作JSON数据代码示例
#!/usr/bin/env python import json import os def json_test(): return_dic = {} json_data = { 'appid':' ...
- python操作mongodb之二聚合查询
#聚合查询 from pymongo import MongoClient db = MongoClient('mongodb://10.0.0.9:27017/').aggregation_exam ...
- Python操作Saltstack
1.代码 # -*- coding:utf-8 -*- import urllib.request import urllib.parse import json class saltAPI(): d ...
随机推荐
- Ubuntu18.04安装RabbitMQ
Ubuntu18.04安装RabbitMQ 2018年06月10日 19:32:38 dmfrm 阅读数:2492 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- 错误代码 0x800700b7 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节
如果是运行VS时就报错,改个端口号就可以解决问题,改完以下两个地方重新运行
- C# 调用短信接口
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...
- Ionic3实现选项卡切换可以重新加载echarts
要求 选项卡每切换一次,就加载对应的一个echarts 图,要有一开始的动画效果效果如下: 注意点 1.echarts要想每次都能重新加载,需要移除"_echarts_instance_&q ...
- HDOJ 5666//快速积,推公式
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5666 题意:给一条直线x+y=q,在(0,0)往x+y=q上面的整数点连线,x+y=q与x,y轴截成的三角 ...
- 关于360插件化Replugin Activity动态修改父类的字节码操作
近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...
- Python数据采集分析告诉你为何上海二手房你都买不起
感谢关注Python爱好者社区公众号,在这里,我们会每天向您推送Python相关的文章实战干货. 来吧,一起Python. 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的 ...
- 【CF734F】Anton and School(构造)
[CF734F]Anton and School(构造) 题面 Codeforces 洛谷 题解 算是一道\(easy\)? 发现\((a\&b)+(a|b)=a+b\). 那么根据给定条件我 ...
- 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)
[BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...
- BZOJ5262(容斥)
题目描述 听着自己美妙的曲子,小Z进入了梦乡.在梦中,小Z仿佛又回到了自己纵横考场的年代.在梦中,小Z参加了一场 考试,这场考试一共有n道题,每道题的最终得分都是一个大于等于0的整数.然而醒来后,小Z ...