• Python2调用Salt API


    #!/usr/bin/env python
    #coding=utf-8
    #For Python2
    import urllib,urllib2,json,sys,importlib,argparse
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    
    class saltAPI():
    
        def __init__(self):
            self.url = 'http://10.160.25.116:8000'
            self.data = {'username' : 'uxin_salt-api',
                         'password' : 'uxin_salt-api',
                         'eauth' : 'pam'}
            self.headers = {'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
            self.token = self.get_token()
            self.headers['X-Auth-Token'] = self.token
    
            # self.headers['Accept'] = 'application/x-yaml'
            # self.headers['Content-Type'] = 'application/json'
        #获取token
        def get_token(self):
            postdata = urllib.urlencode(self.data).encode('utf8')
            content = self.post_request('/login',postdata)
            try:
                token = content['return'][0]['token']
                return token
            except Exception as ErrorMsg:
                print(ErrorMsg)
    
        #发送post
        def post_request(self,prefix='/',postdata=None):
            try:
                request = urllib2.Request(self.url+ prefix,postdata,headers=self.headers)
                reponse = urllib2.urlopen(request).read()
                content  = json.loads(reponse.decode('utf8'))
                return content
            except Exception as ErrorMsg:
                print(ErrorMsg)
                exit()
    
        
        def SaltCmd_Exec(self,tgt,fun='cmd.run',expr_form='glob',arg=None,**kwargs):
            #通过json格式提交参数,需要指定Content-Type,用户自行选择是否指定Shell=PowerShell,可以运行grains.item、cmd.run、cmd.script等命令
            #多台主机同时执行cmd.script,使用expr_form=list
            self.headers['Content-Type'] = 'application/json'
            # params = [{'client': 'local', 'tgt': tgt, 'fun': fun,'expr_form':expr_form,'arg':arg ,'kwarg':kwargs }]
            params = {'client': 'local', 'tgt': tgt, 'fun': fun,'expr_form':expr_form,'arg':arg }
            #检查kwargs是否为空,不为空则将其加入到params中
            kwargs2 = {}
            if kwargs :
                for k,v in kwargs.items():
                    if kwargs[k] != None:
                        kwargs2[k] = kwargs[k]
            if kwargs2 :
            #     params = dict(list(params.items())+list(kwargs2.items()))
                params['kwarg'] = kwargs2
            print(params)
            #json.loads() transform str to dict;json.dumps() transform dict to str.
            # obj = bytes(json.dumps([params])) #Python2,可用
            obj = json.dumps([params]).encode('utf8') #Python2,可用
            ret = self.post_request(prefix='/',postdata=obj)
            return ret
            
        def listkeys(self):
            params = {'client':'wheel','fun':'key.list_all'}
            obj = urllib.urlencode(params).encode('UTF8')
            ret = self.post_request(prefix='/',postdata=obj)
            print(ret)
    
        def AuthTest(self):
            print(self.headers)
    
    
    #为运行grins.items命令的返回结果进行处理
    def res_proc_grainsitem(data):
        for k,v in data.items():
            d2 = data[k]
            d2['biosversion']
            d2['biosversion'].find('Hyper-V')
            if d2['biosversion'].find('Hyper-V') >= 0:
                sn = 'HV00000'
            else:
                sn  = d2['serialnumber']
            print(d2['id'],d2['host'],d2['windowsdomain'],d2['manufacturer'],d2['productname'],sn,d2['virtual'],d2['cpu_model'],d2['num_cpus'],d2['mem_total'],d2['os'],d2['osfullname'],d2['kernelrelease'])
    
    
    ###################################### Main Start #######################################
    parser = argparse.ArgumentParser(description='Input args')
    parser.add_argument('--host',dest='host',type=str,help='Input Server IP')
    parser.add_argument('--cmd_salt',dest='cmd_salt',type=str,help='Input Salt Command')
    parser.add_argument('--cmd_srv',dest='cmd_srv',type=str,help='Input Server Command')
    parser.add_argument('--spt_args',dest='spt_args',type=str,help='Input Server Script Args')
    parser.add_argument('--shell',dest='shell',type=str,help='Specify an alternate shell')
    args=parser.parse_args()
    # parser.print_help()
    
    sapi= saltAPI()
    # sapi.AuthTest()
    
    # 单台主机执行命令使用glob,多台主机执行命令使用list参数
    if args.host.find(',') >= 0:
        exprform = 'list'
    elif args.host.find('-') >= 0: #自定义组都包含了"-"字符
        exprform = 'nodegroup'
    else:
        exprform = 'glob'
    
    cmdExec = sapi.SaltCmd_Exec(args.host,args.cmd_salt,exprform,args.cmd_srv,args=args.spt_args,shell=args.shell)
    
    
    if args.cmd_salt == 'grains.items' :
        res_proc_grainsitem(cmdExec['return'][0])
    elif args.cmd_salt == 'cmd.run' :
        dd3 = cmdExec['return'][0]
        for k,v in dd3.items():
            print(k,dd3[k])
        # print(dd3[tgt].replace('
    ',''))
    elif args.cmd_salt == 'cmd.script' :
        dd3 = cmdExec['return'][0]
        for k,v in dd3.items():
            print(k,dd3[k]['stdout'])
    else :
        print(cmdExec)
  • 相关阅读:
    logback
    GC
    常用JVM配置参数
    JVM
    linux
    简单的webService 实例
    [转载]Java 工程师成神之路
    ActiveMQ 在mac 上的安装与运行
    subline3 + emmet 加快前端开发效率
    Spring WebMVC 4.1.4返回json时导致的 406(Not Acceptable)
  • 原文地址:https://www.cnblogs.com/dreamer-fish/p/12957639.html
Copyright © 2020-2023  润新知