def create(self, request, *args, **kwargs): # 删除denied里的key操作 serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) minions = request.data.get('minion_id') # 删除denied里的key比较特殊无法通过saltkey_delete_api来删除因为denied的产生是在已接受key中已经存在了同名的minion_id,然后原来 # 应该存在于未认证列表中的key就会被salt存放到denied里,而通过salt-key -d删除key会把已接受的key一起删除,官方没有提出解决办法,所以 # 只能通过命令行cmd的方式用rm删除实际存放的文件来销毁denied里的key minions = ' '.join(minions) with requests.Session() as s: saltapi = SaltAPI(session=s) # 注意master的minion_id没有设置错误一般删除没都问题 response_data = saltapi.cmd_run_api( tgt=settings.SITE_SALT_MASTER, arg='cd /etc/salt/pki/master/minions_denied/ && rm -rf %s' % minions) if response_data['status'] is False: response_data = {'results': '删除key失败', 'status': False} return Response(response_data) # 命令rm删除返回值为空,所以return值是[{}]这个值不是空哟所以没出现api失败就表示成功 else: if tasks.saltkey_list(): response_data = {'results': '删除key成功', 'status': True} return Response(response_data) else: logger.error('删除denied的key在执行刷新saltkey操作即cron.py里的方法时候出错了') response_data = {'results': '删除key失败', 'status': False} return Response(response_data)
def cmd(self, periodic_name='未命名', tgt='*', tgt_type='glob', execute_cmd=''): # periodic_name参数是为了给signals.py里结果入库之前修改task_name使得生成的结果task_name个性化使用的 with requests.Session() as s: saltapi = SaltAPI(session=s) response_data = saltapi.cmd_run_api( tgt=tgt, tgt_type=tgt_type, arg=[execute_cmd, "shell='/bin/bash'", "runas='root'"]) # 当调用api失败的时候会返回false if response_data['status'] is False: return '任务执行后台出错_error(1),请联系管理员' else: response_data = response_data['results']['return'][0] return response_data
def cmd(self, periodic_name='未命名', tgt='*', tgt_type='glob', execute_cmd=''): if tgt_type == 'list': tgt = [tgt] with requests.Session() as s: saltapi = SaltAPI(session=s) response_data = saltapi.cmd_run_api(tgt=tgt, tgt_type=tgt_type, arg=[execute_cmd, "shell='/bin/bash'", "runas='root'"]) # 当调用api失败的时候会返回false if response_data['status'] is False: return '任务执行后台出错_error(1),请联系管理员' else: response_data = response_data['results']['return'][0] return response_data
def nginx_upstream(request): reg1 = re.compile(r'\nupstream[^\}]+}') reg2 = re.compile(r'\nupstream[^\{]+') reg3 = re.compile(r'\#* *server \d[^;]+;') reg4 = re.compile(r'\#+ *') upstreamlist = [] try: if request.method == 'GET': minionid = request.GET.get('minionid') nginxip = request.GET.get('nginxip') path = request.GET.get('path') with requests.Session() as s: saltapi = SaltAPI(session=s) if saltapi.get_token() is False: logger.error( 'nginx_upstream页get操作获取SaltAPI调用get_token请求出错') return render(request, 'nginx/nginx_upstream.html') else: response_data = saltapi.cmd_run_api(tgt=minionid, arg='cat %s' % path) if response_data is False: logger.error( '获取upstream列表失败可能代入的参数有问题,SaltAPI调用cmd_run_api请求出错' ) return render(request, 'nginx/nginx_upstream.html') # 判断upstream_data如果返回值如果为[{}]表明没有这个minionid elif response_data['return'] != [{}]: data_source = response_data['return'][0][minionid] data_list = re.findall(reg1, data_source) for i in data_list: # 获取upstream name b2 = re.search(reg2, i) # 获取upstream server列表 b3 = re.findall(reg3, i) # 用空格切割字符串取第二个就是servername了 namekey = b2.group().split(' ')[1] # 下面这个如果直接赋值b3会有一些问题,就是出现'## server'这样的也会被前端输出,所以用了 # 正则把这种出现'### '是全部替换成#这样不仅显示正常,在下面post中获取的前端upstream_server也会正确,很重要 upstreamlist.append([ namekey, [re.sub(reg4, '#', x.strip()) for x in b3] ]) return render( request, 'nginx/nginx_upstream.html', { 'upstreamlist': upstreamlist, 'minionid': minionid, 'nginxip': nginxip, 'path': path }) else: logger.error('获取upstream列表失败,请确认minion是否存在。。') return render(request, 'nginx/nginx_upstream.html') # 切换里面server的up/down状态,其实就是注释加#和不注释而已 else: upstream_name = request.POST.get('upstream_name') upstream_server = request.POST.get('upstream_server') upstream_status = request.POST.get('upstream_status') minionid = request.POST.get('minionid') path = request.POST.get('path') with requests.Session() as s: saltapi = SaltAPI(session=s) if saltapi.get_token() is False: logger.error( 'nginx_upstream页状态变更操作获取SaltAPI调用get_token请求出错') return JsonResponse({'result': '失败,后台问题', 'status': False}) else: if upstream_status == 'down': arg = "sed -i '/^upstream *%s/,/^}$/{s/%s/#%s/g}' %s&&free -m" % ( upstream_name, upstream_server, upstream_server, path) else: arg = "sed -i '/^upstream *%s/,/^}$/{s/#\+ *%s/%s/g}' %s&&free -m" % ( upstream_name, upstream_server, upstream_server, path) response_data = saltapi.cmd_run_api(tgt=minionid, arg=arg) if response_data is False: logger.error( 'nginx_upstream页状态变更SaltAPI调用cmd_run_api请求出错') return JsonResponse({ 'result': '失败,后台问题', 'status': False }) # 返回值如果为[{}]表明没有这个minionid elif response_data['return'] == [{}]: logger.error( 'nginx_upstream页状态变更SaltAPI调用cmd_run_api获取到空值了') return JsonResponse({ 'result': '失败,后台问题', 'status': False }) else: return JsonResponse({'result': '成功', 'status': True}) except Exception as e: logger.error('获取upstream列表失败' + str(e)) return render(request, 'nginx/nginx_upstream.html')