python 操作 saltstack Api(二) 示例

获取token

#!/usr/bin/env python
#-*-coding:utf-8-*-

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'][0]['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'][0]['data']['return']['minions'] minions_pre = content['return'][0]['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

  

posted @ 2018-01-24 16:08  FRESHMANS  阅读(1529)  评论(0编辑  收藏  举报