zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    js中this.index使用
    js中index()的四种经典用法(转https://blog.csdn.net/superit401/article/details/51726826)
    splice()的用法
    $().click()和$(document).on('click','要选择的元素',function(){})的不同(转https://www.cnblogs.com/sqh17/p/7746418.html)
    transform(转https://blog.csdn.net/qq_24189933/article/details/79293870)
    transition 带的参数什么意思
    最后一次作业----------课程总结
    实训作业---I/O流
    第五次实训
    。。。
  • 原文地址:https://www.cnblogs.com/FRESHMANS/p/8342138.html
Copyright © 2011-2022 走看看