def file_download_audit(request): if request.method == "POST": try: order = Order_System.objects.create(order_type=3, order_subject=request.POST.get('order_subject'), order_executor=request.POST.get('order_executor'), order_status=4, order_level=0, order_user=request.user.id, ) except Exception, ex: logger.error(msg="文件下载申请失败: {ex}".format(ex=ex)) return JsonResponse({'msg':"文件下载申请失败: {ex}".format(ex=ex),"code":500}) if request.POST.get('server_model') == 'service': serverList = AssetsSource().service(business=request.POST.get('service'))[0] elif request.POST.get('server_model') == 'group': serverList = AssetsSource().group(group=request.POST.get('group'))[0] elif request.POST.get('server_model') == 'custom': serverList = AssetsSource().custom(serverList=request.POST.get('server').split(','))[0] else: return JsonResponse({'msg':"参数不正确","code":500}) try: FileDownload_Audit_Order.objects.create( order = order, dest_path=request.POST.get('dest_path'), dest_server=json.dumps(serverList), order_content=request.POST.get('order_content'), ) except Exception, ex: order.delete() logger.error(msg="文件下载申请失败: {ex}".format(ex=ex)) return JsonResponse({'msg':"文件下载申请失败: {ex}".format(ex=ex),"code":500})
def apps_playbook_online_modf(request,pid): try: playbook = Ansible_Playbook.objects.get(id=pid) numberList = Ansible_Playbook_Number.objects.filter(playbook=playbook) except: return render(request,'apps/apps_playbook_modf.html',{"user":request.user, "errorInfo":"剧本不存在,可能已经被删除."}, ) if request.method == "POST": playbook_server_value = None sList = [] if request.POST.get('server_model') in ['service','group','custom','inventory']: if request.POST.get('server_model') == 'custom': serverList = request.POST.getlist('playbook_server[]') sList,resource = AssetsSource().custom(serverList) elif request.POST.get('server_model') == 'group': sList,resource = AssetsSource().group(group=request.POST.get('ansible_group')) playbook_server_value = request.POST.get('ansible_group') elif request.POST.get('server_model') == 'service': sList,resource = AssetsSource().service(business=request.POST.get('ansible_service')) playbook_server_value = request.POST.get('ansible_service') elif request.POST.get('server_model') == 'inventory': sList,resource,groups = AssetsSource().inventory(inventory=request.POST.get('ansible_inventory')) playbook_server_value = request.POST.get('ansible_inventory') if request.POST.get('playbook_content'): playbook_file = os.getcwd() + '/upload/' + str(playbook.playbook_file) with open(playbook_file, 'w') as f: f.write(request.POST.get('playbook_content')) else: return JsonResponse({'msg':"文件内容不能为空","code":500,'data':[]}) try: Ansible_Playbook.objects.filter(id=pid).update( playbook_name = request.POST.get('playbook_name'), playbook_desc = request.POST.get('playbook_desc'), playbook_vars = request.POST.get('playbook_vars',None), playbook_server_model = request.POST.get('server_model','custom'), playbook_server_value = playbook_server_value, playbook_auth_group = request.POST.get('playbook_auth_group',0), playbook_auth_user = request.POST.get('playbook_auth_user',0), ) except Exception, ex: logger.error(msg="修改playbook目标失败: {ex}".format(ex=str(ex))) return JsonResponse({'msg':str(ex),"code":500,'data':[]}) if sList: tagret_server_list = [ s.playbook_server for s in numberList ] postServerList = [] for sip in sList: try: postServerList.append(sip) if sip not in tagret_server_list: Ansible_Playbook_Number.objects.create(playbook=playbook,playbook_server=sip) except Exception,e: return render(request,'apps/apps_playbook_modf.html',{"user":request.user, "errorInfo":"目标服务器信息修改错误:%s" % str(e)}, ) #清除目标主机 - delList = list(set(tagret_server_list).difference(set(postServerList))) for ip in delList: Ansible_Playbook_Number.objects.filter(playbook=playbook,playbook_server=ip).delete()
def apps_online(request): if request.method == "GET": serverList = AssetsSource().serverList() groupList = Group.objects.all() userList = User.objects.all() serviceList = Service_Assets.objects.all() projectList = Project_Assets.objects.all() inventoryList = Ansible_Inventory.objects.all() return render(request,'apps/apps_playbook_online.html',{"user":request.user,"userList":userList, "serverList":serverList,"groupList":groupList, "serviceList":serviceList,"projectList":projectList, "inventoryList":inventoryList}, ) elif request.method == "POST": sList = [] playbook_server_value = None if request.POST.get('server_model') in ['service','group','custom','inventory']: if request.POST.get('server_model') == 'custom': serverList = request.POST.getlist('playbook_server[]') sList,resource = AssetsSource().custom(serverList) elif request.POST.get('server_model') == 'group': sList,resource = AssetsSource().group(group=request.POST.get('ansible_group')) playbook_server_value = request.POST.get('ansible_group') elif request.POST.get('server_model') == 'service': sList,resource = AssetsSource().service(business=request.POST.get('ansible_service')) playbook_server_value = request.POST.get('ansible_service') elif request.POST.get('server_model') == 'inventory': sList,resource,groups = AssetsSource().inventory(inventory=request.POST.get('ansible_inventory')) playbook_server_value = request.POST.get('ansible_inventory') fileName = 'playbook/online-{ram}.yaml'.format(ram=uuid.uuid4().hex[0:8]) filePath = os.getcwd() + '/upload/' + fileName if request.POST.get('playbook_content'): if os.path.isdir(os.path.dirname(filePath)) is not True:os.makedirs(os.path.dirname(filePath))#判断文件存放的目录是否存在,不存在就创建 with open(filePath, 'w') as f: f.write(request.POST.get('playbook_content')) else: return JsonResponse({'msg':"文件内容不能为空","code":500,'data':[]}) try: playbook = Ansible_Playbook.objects.create( playbook_name = request.POST.get('playbook_name'), playbook_desc = request.POST.get('playbook_desc'), playbook_vars = request.POST.get('playbook_vars'), playbook_uuid = uuid.uuid4(), playbook_file = fileName, playbook_server_model = request.POST.get('server_model','custom'), playbook_server_value = playbook_server_value, playbook_auth_group = request.POST.get('playbook_auth_group',0), playbook_auth_user = request.POST.get('playbook_auth_user',0), playbook_type = 1 ) except Exception, ex: logger.error(msg="添加在线playbook失败: {ex}".format(ex=str(ex))) return JsonResponse({'msg':str(ex),"code":500,'data':[]}) for sip in sList: try: Ansible_Playbook_Number.objects.create(playbook=playbook,playbook_server=sip) except Exception, ex: playbook.delete() logger.error(msg="添加在线playbook目标失败: {ex}".format(ex=str(ex)))
def apps_upload(request): if request.method == "GET": serverList = AssetsSource().serverList() projectList = Project_Assets.objects.all() groupList = Group.objects.all() userList = User.objects.all() inventoryList = Ansible_Inventory.objects.all() serviceList = Service_Assets.objects.all() return render(request,'apps/apps_playbook_upload.html',{"user":request.user,"userList":userList, "serverList":serverList,"groupList":groupList, "serviceList":serviceList,"projectList":projectList, "inventoryList":inventoryList}, ) elif request.method == "POST": if request.POST.get('server_model') in ['service','group','custom','inventory']: if request.POST.get('server_model') == 'custom': serverList = request.POST.getlist('playbook_server') sList,resource = AssetsSource().custom(serverList) playbook_server_value = None elif request.POST.get('server_model') == 'group': sList,resource = AssetsSource().group(group=request.POST.get('ansible_group')) playbook_server_value = request.POST.get('ansible_group') elif request.POST.get('server_model') == 'service': sList,resource = AssetsSource().service(business=request.POST.get('ansible_service')) playbook_server_value = request.POST.get('ansible_service') elif request.POST.get('server_model') == 'inventory': sList,resource,groups = AssetsSource().inventory(inventory=request.POST.get('ansible_inventory')) playbook_server_value = request.POST.get('ansible_inventory') try: playbook = Ansible_Playbook.objects.create( playbook_name = request.POST.get('playbook_name'), playbook_desc = request.POST.get('playbook_desc'), playbook_vars = request.POST.get('playbook_vars'), playbook_uuid = uuid.uuid4(), playbook_file = request.FILES.get('playbook_file'), playbook_server_model = request.POST.get('server_model','custom'), playbook_server_value = playbook_server_value, playbook_auth_group = request.POST.get('playbook_auth_group',0), playbook_auth_user = request.POST.get('playbook_auth_user',0), playbook_type = 0, ) except Exception, ex: logger.error(msg="添加playboo失败: {ex}".format(ex=str(ex))) return render(request,'apps/apps_playbook_upload.html',{"user":request.user,"errorInfo":"剧本添加错误:%s" % str(ex)}, ) for sip in sList: try: Ansible_Playbook_Number.objects.create(playbook=playbook,playbook_server=sip) except Exception,ex: logger.error(msg="添加playboo目标主机失败: {ex}".format(ex=str(ex))) playbook.delete() return render(request,'apps/apps_playbook_upload.html',{"user":request.user,"errorInfo":"目标服务器信息添加错误:%s" % str(ex)}, )
def AnsiblePlayBook(**kw): logId = None try: if kw.has_key('playbook_id'): playbook = Ansible_Playbook.objects.get(id=kw.get('playbook_id')) filePath = os.getcwd() + '/upload/' + str(playbook.playbook_file) if kw.has_key('hosts'): try: sList = list(kw.get('hosts')) except Exception, ex: return ex else: try: numberList = Ansible_Playbook_Number.objects.filter( playbook=playbook) if numberList: sList = [s.playbook_server for s in numberList] except Exception, ex: return ex if kw.has_key('logs'): logId = AnsibleRecord.PlayBook.insert( user='******', ans_id=playbook.id, ans_name=playbook.playbook_name, ans_content=u"执行Ansible剧本", ans_server=','.join(sList)) sList, resource = AssetsSource().queryAssetsByIp(ipList=sList) ANS = ANSRunner(resource, redisKey=None, logId=logId) ANS.run_playbook(host_list=sList, playbook_path=filePath) return ANS.get_playbook_result()
def AnsibleScripts(**kw): logId = None try: if kw.has_key('scripts_id'): script = Ansible_Script.objects.get(id=kw.get('scripts_id')) filePath = os.getcwd() + str(script.script_file) if kw.has_key('hosts'): try: sList = list(kw.get('hosts')) except Exception, ex: return ex else: try: sList = json.loads(script.script_server) except Exception, ex: return ex if kw.has_key('logs'): logId = AnsibleRecord.Model.insert(user='******', ans_model='script', ans_server=','.join(sList), ans_args=filePath) sList, resource = AssetsSource().queryAssetsByIp(ipList=sList) ANS = ANSRunner(resource, redisKey=None, logId=logId) ANS.run_model(host_list=sList, module_name='script', module_args="{filePath} {args}".format( filePath=filePath, args=script.script_args)) return ANS.get_model_result()
def file_download_list(request, page): if request.method == "GET": if request.user.is_superuser: uploadList = Order_System.objects.filter( order_type=3).order_by("-id")[0:1000] else: uploadList = Order_System.objects.filter( Q(order_user=request.user.id) | Q(order_executor=request.user.id), order_type=3).order_by("-id")[0:1000] #分页信息 paginator = Paginator(uploadList, 25) try: uploadList = paginator.page(page) except PageNotAnInteger: uploadList = paginator.page(1) except EmptyPage: uploadList = paginator.page(paginator.num_pages) userList = User.objects.filter(is_superuser=1) serverList = AssetsSource().serverList() #Server_Assets.objects.all() serviceList = Service_Assets.objects.all() projectList = Project_Assets.objects.all() groupList = Group.objects.all() return render( request, 'filemanage/file_download_list.html', { "user": request.user, "serverList": serverList, "userList": userList, "serviceList": serviceList, "projectList": projectList, "groupList": groupList, "uploadList": uploadList })
def ansible_inventory_modf(request,id): if request.method == "GET": try: inventory = Ansible_Inventory.objects.get(id=id) except Exception,ex: logger.warn(msg="获取资产组失败: {ex}".format(ex=str(ex))) serverList = AssetsSource().serverList() return render(request,'apps/apps_inventory_modf.html',{"user":request.user,"serverList":serverList,"inventory":inventory})
def apps_model(request): if request.method == "GET": projectList = Project_Assets.objects.all() serverList = AssetsSource().serverList() groupList = Group.objects.all() serviceList = Service_Assets.objects.all() inventoryList = Ansible_Inventory.objects.all() return render(request,'apps/apps_model.html',{"user":request.user,"ans_uuid":uuid.uuid4(), "serverList":serverList,"groupList":groupList, "serviceList":serviceList,"projectList":projectList, "inventoryList":inventoryList}) elif request.method == "POST" and request.user.has_perm('OpsManage.can_exec_ansible_model'): resource = [] sList = [] if request.POST.get('server_model') in ['service','group','custom','inventory']: if request.POST.get('server_model') == 'custom': serverList = request.POST.getlist('ansible_server') sList,resource = AssetsSource().custom(serverList) elif request.POST.get('server_model') == 'group': sList,resource = AssetsSource().group(group=request.POST.get('ansible_group')) elif request.POST.get('server_model') == 'service': sList,resource = AssetsSource().service(business=request.POST.get('ansible_service')) elif request.POST.get('server_model') == 'inventory': sList,resource,groups = AssetsSource().inventory(inventory=request.POST.get('ansible_inventory')) if len(request.POST.get('custom_model')) > 0:model_name = request.POST.get('custom_model') else:model_name = request.POST.get('ansible_model',None) if len(sList) > 0: redisKey = request.POST.get('ans_uuid') logId = AnsibleRecord.Model.insert(user=str(request.user),ans_model=model_name,ans_server=','.join(sList),ans_args=request.POST.get('ansible_args',None)) DsRedis.OpsAnsibleModel.delete(redisKey) DsRedis.OpsAnsibleModel.lpush(redisKey, "[Start] Ansible Model: {model} ARGS:{args}".format(model=model_name,args=request.POST.get('ansible_args',"None"))) if request.POST.get('ansible_debug') == 'on':ANS = ANSRunner(resource,redisKey,logId,verbosity=4) else:ANS = ANSRunner(resource,redisKey,logId) if request.POST.get('server_model') == 'inventory':sList = groups[:-1] ANS.run_model(host_list=sList,module_name=model_name,module_args=request.POST.get('ansible_args',"")) DsRedis.OpsAnsibleModel.lpush(redisKey, "[Done] Ansible Done.") return JsonResponse({'msg':"操作成功","code":200,'data':[]}) else: return JsonResponse({'msg':"操作失败,未选择主机或者该分组没有成员","code":500,'data':[]}) else: return JsonResponse({'msg':"操作失败,不支持的操作类型","code":500,'data':[]})
def ansible_inventory(request): if request.method == "GET": inventoryList = [] for ds in Ansible_Inventory.objects.all(): try: ds.user = User.objects.get(id=ds.user).username except Exception,ex: logger.warn(msg="查询用户信息失败: {ex}".format(ex=str(ex))) inventoryList.append(ds) serverList = AssetsSource().serverList() return render(request,'apps/apps_inventory.html',{"user":request.user,"serverList":serverList, "inventoryList":inventoryList}, )
def file_downloads(request): if request.method == "POST": try: order = Order_System.objects.get(id=request.POST.get('id', 0), order_type=3) except Exception, ex: return JsonResponse({'msg': ex, "code": 500, 'data': []}) if request.user.is_superuser or request.user.id in [ order.order_executor, order.order_user ]: sList, resource = AssetsSource().queryAssetsByIp( ipList=request.POST.getlist('dest_server')) if len(sList) > 0 and order.order_status == 8: ANS = ANSRunner(resource) dest = os.getcwd() + '/upload/file/download/' module_args = "src={src} dest={dest}".format( src=request.POST.get('path'), dest=dest) ANS.run_model(host_list=sList, module_name='fetch', module_args=module_args) filesData = json.loads(ANS.get_model_result()) filePath = filesData.get('success').get( request.POST.get('dest_server')).get('dest') if filePath: response = StreamingHttpResponse( base.file_iterator(filePath)) response['Content-Type'] = 'application/octet-stream' response[ 'Content-Disposition'] = 'attachment; filename="{file_name}'.format( file_name=os.path.basename(filePath)) return response else: return JsonResponse({ 'msg': "操作失败,未选择主机或者该分组没有成员", "code": 500, 'data': [] }) else: return JsonResponse({ 'msg': "操作失败,您没有权限进行操作", "code": 500, 'data': [] })
def deploy_modf(request, pid): try: project = Project_Config.objects.select_related().get(id=pid) tagret_server = Project_Number.objects.filter(project=project) except Exception, ex: logger.error(msg="修改项目失败: {ex}".format(ex=ex)) return render( request, 'deploy/deploy_modf.html', { "user": request.user, "errorInfo": "修改项目失败: {ex}".format(ex=ex) }, ) if request.method == "GET": serverList = AssetsSource().serverList() serviceList = Service_Assets.objects.filter(project=project.project) groupList = Group.objects.all() server = [s.server for s in tagret_server] for ds in serverList: if ds.get('ip') in server: ds['count'] = 1 else: ds['count'] = 0 return render( request, 'deploy/deploy_modf.html', { "user": request.user, "project": project, "server": tagret_server, "serverList": serverList, "groupList": groupList,
except Exception,ex: return render(request,'filemanage/file_upload_run.html',{"user":request.user,"errInfo":ex}) order.fileupload_audit_order.dest_server = json.loads(order.fileupload_audit_order.dest_server) for ds in UploadFiles.objects.filter(file_order=order.fileupload_audit_order): ds.file_path = str(ds.file_path).replace('file/upload/','') uploadfilesList.append(ds) return render(request,'filemanage/file_upload_run.html',{"user":request.user,"order":order, "uploadfilesList":uploadfilesList, "ans_uuid":uuid.uuid4()}) elif request.method == "POST": try: order = Order_System.objects.get(id=id,order_type=2) except Exception,ex: return JsonResponse({'msg':ex,"code":500,'data':[]}) if request.user.is_superuser or request.user.id in [order.order_executor,order.order_user]: sList,resource = AssetsSource().queryAssetsByIp(ipList=request.POST.getlist('dest_server')) if len(sList) > 0 and order.order_status == 8: redisKey = request.POST.get('ans_uuid') DsRedis.OpsAnsibleModel.delete(redisKey) ANS = ANSRunner(resource,redisKey) DsRedis.OpsAnsibleModel.lpush(redisKey, "[Start] file distribution".format(model='copy',args=request.POST.get('ansible_args',"None"))) for files in request.POST.getlist('file_path'): file = UploadFiles.objects.get(id=files) filePath = os.getcwd() + '/upload/' + str(file.file_path) module_args = "src={src} dest={dest} mode={chown_rwx} owner={chown_user} group={chown_user} backup={backup}".format(src=filePath,backup=request.POST.get('backup','yes'), dest=order.fileupload_audit_order.dest_path, chown_user=order.fileupload_audit_order.chown_user, chown_rwx=order.fileupload_audit_order.chown_rwx ) ANS.run_model(host_list=sList,module_name='copy',module_args=module_args) DsRedis.OpsAnsibleModel.lpush(redisKey, "[Done] Ansible Done.")
def apps_playbook_modf(request, pid): try: playbook = Ansible_Playbook.objects.get(id=pid) numberList = Ansible_Playbook_Number.objects.filter(playbook=playbook) except: return render( request, 'apps/apps_playbook_modf.html', { "user": request.user, "errorInfo": "剧本不存在,可能已经被删除." }, ) if request.method == "GET": numberList = [s.playbook_server for s in numberList] serverList = AssetsSource().serverList() projectList = Project_Assets.objects.all() for ds in serverList: if ds.get('ip') in numberList: ds['count'] = 1 else: ds['count'] = 0 if playbook.playbook_type == 1: playbook_file = os.getcwd() + '/upload/' + str( playbook.playbook_file) if os.path.exists(playbook_file): content = '' with open(playbook_file, "r") as f: for line in f.readlines(): content = content + line playbook.playbook_contents = content groupList = Group.objects.all() userList = User.objects.all() serviceList = Service_Assets.objects.all() try: project = Service_Assets.objects.get( id=playbook.playbook_server_value).project serviceList = Service_Assets.objects.filter(project=project) except: project = None return render( request, 'apps/apps_playbook_modf.html', { "user": request.user, "userList": userList, "projectList": projectList, "playbook": playbook, "serverList": serverList, "project": project, "groupList": groupList, "serviceList": serviceList }, ) elif request.method == "POST": sList = [] playbook_server_value = None if request.POST.get('server_model') in ['service', 'group', 'custom']: if request.POST.get('server_model') == 'custom': if playbook.playbook_type == 1: serverList = request.POST.getlist('playbook_server[]') else: serverList = request.POST.getlist('playbook_server') sList, resource = AssetsSource().custom(serverList) elif request.POST.get('server_model') == 'group': sList, resource = AssetsSource().group( group=request.POST.get('ansible_group')) playbook_server_value = request.POST.get('ansible_group') elif request.POST.get('server_model') == 'service': sList, resource = AssetsSource().service( business=request.POST.get('ansible_service')) playbook_server_value = request.POST.get('ansible_service') if playbook.playbook_type == 1: playbook_file = os.getcwd() + '/upload/' + str( playbook.playbook_file) with open(playbook_file, 'w') as f: f.write(request.POST.get('playbook_content')) try: Ansible_Playbook.objects.filter(id=pid).update( playbook_name=request.POST.get('playbook_name'), playbook_desc=request.POST.get('playbook_desc'), playbook_vars=request.POST.get('playbook_vars', None), playbook_server_model=request.POST.get('server_model', 'custom'), playbook_server_value=playbook_server_value, playbook_auth_group=request.POST.get('playbook_auth_group', 0), playbook_auth_user=request.POST.get('playbook_auth_user', 0), ) except Exception, ex: logger.error(msg="修改playbook失败: {ex}".format(ex=str(ex))) return render( request, 'apps/apps_playbook_modf.html', { "user": request.user, "errorInfo": "剧本添加错误:%s" % str(ex) }, ) if sList: tagret_server_list = [s.playbook_server for s in numberList] postServerList = [] for sip in sList: try: postServerList.append(sip) if sip not in tagret_server_list: Ansible_Playbook_Number.objects.create( playbook=playbook, playbook_server=sip) except Exception, ex: logger.error(msg="修改playbook目标服务器失败: {ex}".format( ex=str(ex))) return render( request, 'apps/apps_playbook_modf.html', { "user": request.user, "errorInfo": "目标服务器信息修改错误:%s" % str(ex) }, ) #清除目标主机 - delList = list( set(tagret_server_list).difference(set(postServerList))) for ip in delList: Ansible_Playbook_Number.objects.filter( playbook=playbook, playbook_server=ip).delete()
def apps_playbook_run(request, pid): try: playbook = Ansible_Playbook.objects.get(id=pid) numberList = Ansible_Playbook_Number.objects.filter(playbook=playbook) if numberList: serverList = [] else: serverList = AssetsSource().serverList() except: return render( request, 'apps/apps_playbook.html', { "user": request.user, "ans_uuid": playbook.playbook_uuid, "errorInfo": "剧本不存在,可能已经被删除." }, ) if request.method == "GET": return render( request, 'apps/apps_playbook.html', { "user": request.user, "playbook": playbook, "serverList": serverList, "numberList": numberList }, ) elif request.method == "POST" and request.user.has_perm( 'OpsManage.can_exec_ansible_playbook'): if DsRedis.OpsAnsiblePlayBookLock.get(redisKey=playbook.playbook_uuid + '-locked') is None: #判断剧本是否有人在执行 #加上剧本执行锁 DsRedis.OpsAnsiblePlayBookLock.set( redisKey=playbook.playbook_uuid + '-locked', value=request.user) #删除旧的执行消息 DsRedis.OpsAnsiblePlayBook.delete(playbook.playbook_uuid) playbook_file = os.getcwd() + '/upload/' + str( playbook.playbook_file) if numberList: serverList = [s.playbook_server for s in numberList] else: serverList = request.POST.getlist('playbook_server') sList, resource = AssetsSource().queryAssetsByIp(ipList=serverList) if playbook.playbook_vars: playbook_vars = playbook.playbook_vars else: playbook_vars = request.POST.get('playbook_vars') try: if len(playbook_vars) == 0: playbook_vars = dict() else: playbook_vars = json.loads(playbook_vars) playbook_vars['host'] = sList except Exception, ex: DsRedis.OpsAnsiblePlayBookLock.delete( redisKey=playbook.playbook_uuid + '-locked') return JsonResponse({ 'msg': "{ex}".format(ex=ex), "code": 500, 'data': [] }) logId = AnsibleRecord.PlayBook.insert( user=str(request.user), ans_id=playbook.id, ans_name=playbook.playbook_name, ans_content="执行Ansible剧本", ans_server=','.join(sList)) #执行ansible playbook if request.POST.get('ansible_debug') == 'on': ANS = ANSRunner(resource, redisKey=playbook.playbook_uuid, logId=logId, verbosity=4) else: ANS = ANSRunner(resource, redisKey=playbook.playbook_uuid, logId=logId) ANS.run_playbook(host_list=sList, playbook_path=playbook_file, extra_vars=playbook_vars) #获取结果 result = ANS.get_playbook_result() dataList = [] statPer = { "unreachable": 0, "skipped": 0, "changed": 0, "ok": 0, "failed": 0 } for k, v in result.get('status').items(): v['host'] = k if v.get('failed') > 0 or v.get('unreachable') > 0: v['result'] = 'Failed' else: v['result'] = 'Succeed' dataList.append(v) statPer[ 'unreachable'] = v['unreachable'] + statPer['unreachable'] statPer['skipped'] = v['skipped'] + statPer['skipped'] statPer['changed'] = v['changed'] + statPer['changed'] statPer['failed'] = v['failed'] + statPer['failed'] statPer['ok'] = v['ok'] + statPer['ok'] DsRedis.OpsAnsiblePlayBook.lpush(playbook.playbook_uuid, "[Done] Ansible Done.") #切换版本之后取消项目部署锁 DsRedis.OpsAnsiblePlayBookLock.delete( redisKey=playbook.playbook_uuid + '-locked') #操作日志异步记录 # recordAnsiblePlaybook.delay(user=str(request.user),ans_id=playbook.id,ans_name=playbook.playbook_name, # ans_content="执行Ansible剧本",uuid=playbook.playbook_uuid,ans_server=','.join(sList)) return JsonResponse({ 'msg': "操作成功", "code": 200, 'data': dataList, "statPer": statPer }) else: return JsonResponse({ 'msg': "剧本执行失败,{user}正在执行该剧本".format( user=DsRedis.OpsAnsiblePlayBookLock.get( playbook.playbook_uuid + '-locked')), "code": 500, 'data': [] })
def cron_add(request): # serverList = Server_Assets.objects.all() serverList= AssetsSource().serverList() if request.method == "GET": return render(request,'opscontrol/cron/cron_add.html',{"user":request.user,"serverList":serverList}, ) elif request.method == "POST": cron_status = request.POST.get('cron_status',0) try: server = Server_Assets.objects.get(id=request.POST.get('cron_server')) except: return render(request,'opscontrol/cron/cron_add.html',{"user":request.user, "serverList":serverList, "errorInfo":"主机不存在,请检查是否被删除。"}, ) try: cron = Cron_Config.objects.create( cron_minute=request.POST.get('cron_minute'), cron_hour=request.POST.get('cron_hour'), cron_day=request.POST.get('cron_day'), cron_week=request.POST.get('cron_week'), cron_month=request.POST.get('cron_month'), cron_user=request.POST.get('cron_user'), cron_name=request.POST.get('cron_name'), cron_desc=request.POST.get('cron_desc'), cron_server=server, cron_command=request.POST.get('cron_command'), cron_script=request.FILES.get('cron_script', None), cron_script_path=request.POST.get('cron_script_path',None), cron_status=cron_status, ) # recordCron.delay(cron_user=str(request.user),cron_id=cron.id,cron_name=cron.cron_name,cron_content="添加计划任务",cron_server=server.ip) except Exception,e: return render(request,'opscontrol/cron/cron_add.html',{"user":request.user, "serverList":serverList, "errorInfo":"提交失败,错误信息:"+str(e)}, ) if int(cron_status) == 1: try: sList = [server.ip] if server.keyfile == 1:resource = [{"ip": server.ip, "port": int(server.port),"username": server.username}] else:resource = [{"ip": server.ip, "port": int(server.port),"username": server.username,"password": server.passwd}] ANS = ANSRunner(resource) if cron.cron_script: src = os.getcwd() + '/' + str(cron.cron_script) file_args = """src={src} dest={dest} owner={user} group={user} mode=755""".format(src=src,dest=cron.cron_script_path,user=cron.cron_user) ANS.run_model(host_list=sList,module_name="copy",module_args=file_args) result = ANS.handle_model_data(ANS.get_model_result(), 'copy',file_args) if result[0].get('status') == 'failed': cron.delete() return render(request,'opscontrol/cron/cron_add.html',{"user":request.user, "serverList":serverList, "errorInfo":"错误信息:"+result[0].get('msg')}, ) # cron_args = """name={name} minute='{minute}' hour='{hour}' day='{day}' weekday='{weekday}' month='{month}' user='******' job='{job}'""".format(name=cron.cron_name,minute=cron.cron_minute, hour=cron.cron_hour,day=cron.cron_day, weekday=cron.cron_week,month=cron.cron_month, user=cron.cron_user,job=cron.cron_command ) ANS.run_model(host_list=sList,module_name="cron",module_args=cron_args) result = ANS.handle_model_data(ANS.get_model_result(), 'cron',cron_args) except Exception,e: return render(request,'opscontrol/cron/cron_add.html',{"user":request.user, "serverList":serverList, "errorInfo":"错误信息:"+str(e)}, ) if result[0].get('status') == 'failed': cron.delete() return render(request,'opscontrol/cron/cron_add.html',{"user":request.user, "serverList":serverList, "errorInfo":"错误信息:"+result[0].get('msg').replace('\n','')})
def apps_script_online_run(request,pid): try: script = Ansible_Script.objects.get(id=pid) numberList = json.loads(script.script_server) except: return render(request,'apps/apps_script_modf.html',{"user":request.user,"errorInfo":"剧本不存在,可能已经被删除."},) def saveScript(content,filePath): if os.path.isdir(os.path.dirname(filePath)) is not True:os.makedirs(os.path.dirname(filePath))#判断文件存放的目录是否存在,不存在就创建 with open(filePath, 'w') as f: f.write(content) return filePath if request.method == "GET": projectList = Project_Assets.objects.all() serverList = AssetsSource().serverList() for ds in serverList: if ds.get('ip') in numberList:ds['count'] = 1 else:ds['count'] = 0 script_file = os.getcwd() + '/' + str(script.script_file) if os.path.exists(script_file): content = '' with open(script_file,"r") as f: for line in f.readlines(): content = content + line script.script_contents = content groupList = Group.objects.all() userList = User.objects.all() serviceList = [] try: project = Service_Assets.objects.get(id=script.script_service).project serviceList = Service_Assets.objects.filter(project=project) except: project = None return render(request,'apps/apps_script_modf.html',{"user":request.user,"userList":userList, "script":script,"serverList":serverList, "groupList":groupList,"serviceList":serviceList, "project":project,"projectList":projectList, "ans_uuid":uuid.uuid4(),}) elif request.method == "POST" and request.user.has_perm('OpsManage.can_exec_ansible_script'): resource = [] sList = [] if request.POST.get('server_model') in ['service','group','custom']: if request.POST.get('server_model') == 'custom': serverList = request.POST.getlist('ansible_server[]') for server in serverList: server_assets = Server_Assets.objects.get(id=server) sList.append(server_assets.ip) if server_assets.keyfile == 1:resource.append({"ip": server_assets.ip, "port": int(server_assets.port),"username": server_assets.username}) else:resource.append({"ip": server_assets.ip, "port": int(server_assets.port),"username": server_assets.username,"password": server_assets.passwd}) elif request.POST.get('server_model') == 'group': serverList = Assets.objects.filter(group=request.POST.get('ansible_group'),assets_type__in=["server","vmser"]) for server in serverList: sList.append(server.server_assets.ip) if server.server_assets.keyfile == 1:resource.append({"ip": server.server_assets.ip, "port": int(server.server_assets.port),"username": server.server_assets.username}) else:resource.append({"ip": server.server_assets.ip, "port": int(server.server_assets.port),"username": server.server_assets.username,"password": server.server_assets.passwd}) elif request.POST.get('server_model') == 'service': serverList = Assets.objects.filter(business=request.POST.get('ansible_service'),assets_type__in=["server","vmser"]) for server in serverList: try: sList.append(server.server_assets.ip) except Exception, ex: logger.warn(msg="获取业务失败: {ex}".format(ex=ex)) continue if server.server_assets.keyfile == 1:resource.append({"ip": server.server_assets.ip, "port": int(server.server_assets.port),"username": server.server_assets.username}) else:resource.append({"ip": server.server_assets.ip, "port": int(server.server_assets.port),"username": server.server_assets.username,"password": server.server_assets.passwd}) if request.POST.get('type') == 'save' and request.POST.get('script_file'): filePath = os.getcwd() + '/' + str(script.script_file) saveScript(content=request.POST.get('script_file'),filePath=filePath) try: Ansible_Script.objects.filter(id=pid).update( script_server=json.dumps(sList), script_group=request.POST.get('ansible_group',0), script_service=request.POST.get('ansible_service',0), script_args=request.POST.get('script_args'), script_type=request.POST.get('server_model') ) except Exception,ex: logger.error(msg="保存脚本失败: {ex}".format(ex=str(ex))) return JsonResponse({'msg':str(ex),"code":500,'data':[]}) return JsonResponse({'msg':"保存成功","code":200,'data':[]})
def apps_script_online(request): if request.method == "GET": serverList = AssetsSource().serverList() groupList = Group.objects.all() serviceList = Service_Assets.objects.all() projectList = Project_Assets.objects.all() return render(request,'apps/apps_script_online.html',{"user":request.user,"ans_uuid":uuid.uuid4(), "serverList":serverList,"groupList":groupList, "serviceList":serviceList,"projectList":projectList}) elif request.method == "POST" and request.user.has_perm('OpsManage.can_exec_ansible_script'): resource = [] sList = [] def saveScript(content,filePath): if os.path.isdir(os.path.dirname(filePath)) is not True:os.makedirs(os.path.dirname(filePath))#判断文件存放的目录是否存在,不存在就创建 with open(filePath, 'w') as f: f.write(content) return filePath if request.POST.get('server_model') in ['service','group','custom']: if request.POST.get('server_model') == 'custom': serverList = request.POST.getlist('ansible_server[]') sList,resource = AssetsSource().custom(serverList=serverList) elif request.POST.get('server_model') == 'group': sList,resource = AssetsSource().group(group=request.POST.get('ansible_group',0)) elif request.POST.get('server_model') == 'service': sList,resource = AssetsSource().service(business=request.POST.get('ansible_service')) if len(sList) > 0 and request.POST.get('type') == 'run' and request.POST.get('script_file'): filePath = saveScript(content=request.POST.get('script_file'),filePath='/tmp/script-{ram}'.format(ram=uuid.uuid4().hex[0:8])) redisKey = request.POST.get('ans_uuid') logId = AnsibleRecord.Model.insert(user=str(request.user),ans_model='script',ans_server=','.join(sList),ans_args=filePath) DsRedis.OpsAnsibleModel.delete(redisKey) DsRedis.OpsAnsibleModel.lpush(redisKey, "[Start] Ansible Model: {model} Script:{filePath} {args}".format(model='script',filePath=filePath,args=request.POST.get('script_args'))) if request.POST.get('ansible_debug') == 'on':ANS = ANSRunner(resource,redisKey,logId,verbosity=4) else:ANS = ANSRunner(resource,redisKey,logId) ANS.run_model(host_list=sList,module_name='script',module_args="{filePath} {args}".format(filePath=filePath,args=request.POST.get('script_args'))) DsRedis.OpsAnsibleModel.lpush(redisKey, "[Done] Ansible Done.") try: os.remove(filePath) except Exception, ex: logger.warn(msg="删除文件失败: {ex}".format(ex=ex)) return JsonResponse({'msg':"操作成功","code":200,'data':[]}) if request.POST.get('type') == 'save' and request.POST.get('script_file') and \ ( request.user.has_perm('OpsManage.can_add_ansible_script') or request.user.has_perm('OpsManage.can_edit_ansible_script') ): fileName = '/upload/scripts/script-{ram}'.format(ram=uuid.uuid4().hex[0:8]) filePath = os.getcwd() + fileName saveScript(content=request.POST.get('script_file'),filePath=filePath) try: service = int(request.POST.get('ansible_service')) except: service = None try: group = int(request.POST.get('ansible_group')) except: group = None try: Ansible_Script.objects.create( script_name=request.POST.get('script_name'), script_uuid=request.POST.get('ans_uuid'), script_args=request.POST.get('script_args'), script_server=json.dumps(sList), script_group=group, script_file=fileName, script_service=service, script_type=request.POST.get('server_model') ) except Exception,ex: logger.warn(msg="添加ansible脚本失败: {ex}".format(ex=ex)) return JsonResponse({'msg':str(ex),"code":500,'data':[]}) return JsonResponse({'msg':"保存成功","code":200,'data':[]})