Esempio n. 1
0
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})                         
Esempio n. 2
0
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()  
Esempio n. 3
0
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)))
Esempio n. 4
0
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)},
                                    )             
Esempio n. 5
0
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()
Esempio n. 6
0
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()
Esempio n. 7
0
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
            })
Esempio n. 8
0
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})
Esempio n. 9
0
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':[]})
Esempio n. 10
0
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},
                                  )
Esempio n. 11
0
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': []
            })
Esempio n. 12
0
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,
Esempio n. 13
0
     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.")
Esempio n. 14
0
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()
Esempio n. 15
0
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': []
            })
Esempio n. 16
0
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','')}) 
Esempio n. 17
0
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':[]})    
Esempio n. 18
0
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':[]})