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('\r',''))
elif args.cmd_salt == 'cmd.script' :
    dd3 = cmdExec['return'][0]
    for k,v in dd3.items():
        print(k,dd3[k]['stdout'])
else :
    print(cmdExec)

 

posted on 2020-05-25 16:32  momingliu11  阅读(369)  评论(0编辑  收藏  举报