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 ...
随机推荐
- BZOJ3224普通平衡树——非旋转treap
题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...
- 蒟阵P3390 【模板】矩阵快速幂
代码如下: #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ...
- P1035 调和级数
两种解法如下: 1.模拟 这种做法的思路是枚举n从1开始,直到Sn>k结束,只需要一个循环即可实现. 代码: #include<cstdio> int main() { ; scan ...
- HDU4864 Task(算竞进阶习题)
贪心 比较巧妙的贪心..先把所有机器和任务按时间是第一关键字,等级为第二关键字排序. 然后用机器去匹配每一个任务. 排序之后,在时间上满足当前任务的机器,必定也在时间上满足后面的机器,所以我们每次把时 ...
- Crazy Circuits HDU - 3157(有源汇有上下界最小流)
给出每条边的下界 求最小流 板题 提供两个板子代码 虽然这个题 第一个比较快 但在loj上https://loj.ac/problem/117 的板题 第一个1700+ms 第二个才600+ms ...
- MT【267】第一次很重要
\begin{equation*}\textbf{已知}x_1,x_2<\pi,x_{n+1}=x_n+\left\{ \begin{aligned} sin x_n &,x_n> ...
- 【HDU - 5790 】Prefix(主席树+Trie树)
BUPT2017 wintertraining(15) #7C 题意 求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结 ...
- 【比赛】NOIP2018 填数游戏
打表找规律.... #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db doub ...
- 【BZOJ1299】巧克力棒(博弈论,线性基)
[BZOJ1299]巧克力棒(博弈论,线性基) 题面 BZOJ 题解 \(Nim\)博弈的变形形式. 显然,如果我们不考虑拿巧克力棒出来的话,这就是一个裸的\(Nim\)博弈. 但是现在可以加入巧克力 ...
- 添加 [DataContract] 到 Entity Framework 6.0 POCO Template
1. 添加using System.Runtime.Serialization; 找到这行 includeCollections ? (Environment.NewLine + "usin ...