コード例 #1
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() + 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()
コード例 #2
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()
コード例 #3
0
ファイル: cron.py プロジェクト: zhaojinhong/roe
def cron_config(request):
    serverList = Server_Assets.objects.all()
    if request.method == "GET": 
        return render(request,'opscontrol/cron/cron_config.html',{"user":request.user,"serverList":serverList},
                                  )    
    elif request.method == "POST": 
        try:
            server = Server_Assets.objects.get(id=request.POST.get('cron_server'))
        except:
            return JsonResponse({'msg':"主机资源不存在","code":500,'data':[]})  
        try:
            repeatCron = ""
            for ds in request.POST.get('cron_data').split('\n'):
                cron = ds.split('|')
                cron_name = cron[0]
                cron_time = cron[1]
                cron_data = cron_time.split(' ',5)
                try:
                    cron = Cron_Config.objects.create(
                                               cron_minute=cron_data[0],
                                               cron_hour=cron_data[1],
                                               cron_day=cron_data[2],
                                               cron_week=cron_data[3],
                                               cron_month=cron_data[4],
                                               cron_user=request.POST.get('cron_user'),
                                               cron_name=cron_name,
                                               cron_desc=cron_name,
                                               cron_server=server,
                                               cron_command=cron_data[5],
                                               cron_script=request.FILES.get('file', None),
                                               cron_status=request.POST.get('cron_status',0),
                                               )
                    # recordCron.delay(cron_user=str(request.user),cron_id=cron.id,cron_name=cron.cron_name,cron_content="导入计划任务",cron_server=server.ip)
                    if  int(cron.cron_status) == 1: 
                        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)
                        ANS.run_model(host_list=sList,module_name="cron",module_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
                                                                                                                                                         )
                                                                                     )                     
                except Exception,e:
                    repeatCron = cron_name + "<br>" + repeatCron 
        except:
            return JsonResponse({'msg':'数据格式不对',"code":500,'data':[]}) 
        if repeatCron:return JsonResponse({'msg':'添加失败,以下是重复内容:<br>' + repeatCron,"code":200,'data':[]}) 
        else:return JsonResponse({'msg':'添加成功',"code":200,'data':[]}) 
コード例 #4
0
    def run_model(self, group_ids, host_ids, selected_module_name,
                  custom_model_name, module_args):
        gen_resource = GenResource()

        if group_ids == ['custom'] or group_ids == ['all']:
            resource = gen_resource.gen_host_list(host_ids)
        else:
            resource = gen_resource.gen_group_dict(group_ids)

        host_list = [
            DeviceInfo.objects.get(id=host_id).assets.asset_management_ip
            for host_id in host_ids
        ]

        module_name = selected_module_name if selected_module_name != 'custom' else custom_model_name

        unique_key = '{}.{}.{}'.format(host_ids, module_name, module_args)

        if self.redis_instance.get(unique_key):
            self.send(
                '<code style="color: #FF0000">\n有相同的任务正在进行!请稍后重试!\n</code>',
                close=True)
        else:
            try:
                self.redis_instance.set(unique_key, 1)
                ans = ANSRunner(resource,
                                become='yes',
                                become_method='sudo',
                                become_user='******',
                                sock=self)
                ans.run_module(host_list=host_list,
                               module_name=module_name,
                               module_args=module_args)

                module_record.delay(ans_user=UserProfile.objects.get(
                    id=self.ans_info['run_user']),
                                    ans_remote_ip=self.ans_info['remote_ip'],
                                    ans_module=module_name,
                                    ans_args=module_args,
                                    ans_server=host_list,
                                    ans_result=ans.get_module_results)
            except Exception as e:
                self.send(
                    '<code style="color: #FF0000">\nansible执行模块出错:{}\n</code>'.
                    format(str(e)))
            finally:
                self.redis_instance.delete(unique_key)
                self.close()
コード例 #5
0
ファイル: cron.py プロジェクト: zhaojinhong/roe
def cron_mod(request,cid): 
    try:
        cron = Cron_Config.objects.select_related().get(id=cid)
    except:
        return render(request,'opscontrol/cron/cron_modf.html',{"user":request.user,
                                                         "errorInfo":"任务不存在,可能已经被删除."},
                                )    
    if request.method == "GET": 
        return render(request,'opscontrol/cron/cron_modf.html',
                                  {"user":request.user,"cron":cron},
                                ) 
    elif request.method == "POST":    
        try:
            Cron_Config.objects.filter(id=cid).update(
                       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_desc=request.POST.get('cron_desc'),
                       cron_command=request.POST.get('cron_command'),
                       cron_script_path=request.POST.get('cron_script_path',None),
                       cron_status=request.POST.get('cron_status'),
                                       )
            # recordCron.delay(cron_user=str(request.user),cron_id=cid,cron_name=cron.cron_name,cron_content="修改计划任务",cron_server=cron.cron_server.ip)
        except Exception,e:
            return render(request,'opscontrol/cron/cron_modf.html',
                                      {"user":request.user,"errorInfo":"更新失败,错误信息:"+str(e)},
                                  )  
        try:
            sList = [cron.cron_server.ip]
            if cron.cron_server.keyfile == 1:resource = [{"ip": cron.cron_server.ip, "port": int(cron.cron_server.port),"username": cron.cron_server.username}] 
            else:resource = [{"ip": cron.cron_server.ip, "port": int(cron.cron_server.port),
                         "username": cron.cron_server.username,"password": cron.cron_server.passwd}]    
            cron = Cron_Config.objects.get(id=cid)
            if request.FILES.get('cron_script'):
                cron.cron_script=request.FILES.get('cron_script')
                cron.save()
            ANS = ANSRunner(resource)
            if  cron.cron_status == 0:ANS.run_model(host_list=sList,module_name="cron",module_args="""name={name} state=absent""".format(name=cron.cron_name))       
            else:
                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)  
                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)    
        except Exception,e:
            return render(request,'opscontrol/cron/cron_modf.html',{"user":request.user,"errorInfo":"错误信息:"+str(e)},
                                  )                     
コード例 #6
0
ファイル: filemanage.py プロジェクト: zhaojinhong/roe
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': []
            })
コード例 #7
0
def exe_modules(request):

    if request.method == 'GET':
        # jsonTree2=jsonTree.replace(' ','').replace('\n','')
        ans_uuid = uuid.uuid4(),
        #无法同时渲染页面和传递json格式,渲染页面的编码和json编码是不一样的,因此只能通过异步的方式获取json格式数据
        return render(request, 'opscontrol/exejobs/exe_modules.html', locals())
    elif request.method == 'POST':
        model_name = request.POST['ansible_model']
        hostid_list = request.POST['hosts'].split(',')

        redisKey = request.POST['ans_uuid']
        ansible_args = request.POST['ansible_args']
        try:
            ans_debug = request.POST['ans_debug']
        except:
            ans_debug = 'OFF'
        ip_list, hostlist = get_ans_host(hostid_list)
        if ip_list:
            logId = AnsibleRecord.Model.insert(
                user=str(request.user),
                ans_model=model_name,
                ans_server=','.join(hostid_list),
                ans_args=ansible_args)

            DsRedis.OpsAnsibleModel.delete(redisKey)  # 删掉这个key

            DsRedis.OpsAnsibleModel.lpush(
                redisKey, "[Start] Ansible Model: {model}  ARGS:{args}".format(
                    model=model_name, args=ansible_args))
            if ans_debug == 'on':
                ANS = ANSRunner(hostlist, redisKey, logId, verbosity=4)
            else:
                ANS = ANSRunner(hostlist, redisKey, logId)

            ANS.run_model(host_list=ip_list,
                          module_name=model_name,
                          module_args=ansible_args)
            DsRedis.OpsAnsibleModel.lpush(redisKey, "[Done] Ansible Done.")
            return JsonResponse({'msg': "操作成功", "code": 200, 'data': []})
        else:

            return JsonResponse({
                'msg': "操作失败,未选择主机或者该分组没有成员",
                "code": 500,
                'data': []
            })
コード例 #8
0
ファイル: trans_file.py プロジェクト: qinjingfang/roe
def ansbile_transfile(request):

    if request.method=='GET':
        # jsonTree2=jsonTree.replace(' ','').replace('\n','')
        ans_uuid=uuid.uuid4()
        time_now=time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))

     #无法同时渲染页面和传递json格式,渲染页面的编码和json编码是不一样的,因此只能通过异步的方式获取json格式数据
        return render(request,'opscontrol/exejobs/exe_transfile.html',locals())
    elif request.method=='POST':
        source_host=request.POST['source_host']

        if not isIP(source_host):
            return JsonResponse({'msg': "操作失败,源主机要是IP 地址", "code": 500, 'data': []})
        dest_hostid_list = request.POST['dest_hosts'].split(',')
        source_file = request.POST['source_file']
        dest_file = request.POST['dest_file']
        redisKey = request.POST['ans_uuid']
        try:
         ans_debug=request.POST['ans_debug']
        except:
            ans_debug='OFF'
        ip_list,hostlist=get_ans_host(dest_hostid_list)
        playbook_vars={}
        playbook_vars['dest_host']=ip_list
        playbook_vars['source_host']=source_host
        playbook_vars['source_file']=  source_file
        playbook_vars['dest_file'] = dest_file
        playbook_name= 'copy_file_between_remote.yaml'
        playbook_file = os.getcwd() + '/upload/selfuse/'+ playbook_name

        if DsRedis.OpsAnsiblePlayBookLock.get(redisKey=redisKey + '-locked') is None:  # 判断剧本是否有人在执行
            # 加上剧本执行锁
            DsRedis.OpsAnsiblePlayBookLock.set(redisKey=redisKey+ '-locked', value=request.user)
            # 删除旧的执行消息
            DsRedis.OpsAnsiblePlayBook.delete(redisKey)


            if ip_list:

                logId = AnsibleRecord.PlayBook.insert(user=str(request.user), ans_id=1,ans_name=playbook_name, ans_content="执行文件分发",ans_server=','.join(ip_list))

                # 执行ansible playbook
                if ans_debug == 'on':
                    ANS = ANSRunner(hostlist, redisKey=redisKey, logId=logId, verbosity=4)
                else:
                    ANS = ANSRunner(hostlist, redisKey=redisKey, logId=logId)

                ANS.run_playbook(host_list=ip_list, 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(redisKey, "[Done] Ansible Done.")
                # 切换版本之后取消项目部署锁
                DsRedis.OpsAnsiblePlayBookLock.delete(redisKey=redisKey + '-locked')
                return JsonResponse({'msg': "操作成功", "code": 200, 'data': dataList, "statPer": statPer},content_type='application/json')

        else:

                return JsonResponse({'msg': "操作失败,有任务正在执行", "code": 500, 'data': []},content_type='application/json')
コード例 #9
0
ファイル: filemanage.py プロジェクト: zhaojinhong/roe
             "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',
コード例 #10
0
ファイル: sched.py プロジェクト: lui1798/roe
             continue
         sList.append(server_assets.ip)
         if server_assets.keyfile == 1:
             resource.append({
                 "hostname": server_assets.ip,
                 "port": int(server_assets.port),
                 "username": server_assets.username
             })
         else:
             resource.append({
                 "hostname": server_assets.ip,
                 "port": server_assets.port,
                 "username": server_assets.username,
                 "password": server_assets.passwd
             })
 ANS = ANSRunner(resource)
 ANS.run_model(host_list=sList, module_name='setup', module_args="")
 data = ANS.handle_cmdb_data(ANS.get_model_result())
 if data:
     for ds in data:
         status = ds.get('status')
         if status == 0:
             try:
                 assets = Server_Assets.objects.get(ip=ds.get('ip')).assets
                 Server_Assets.objects.filter(ip=ds.get('ip')).update(
                     cpu_number=ds.get('cpu_number'),
                     kernel=ds.get('kernel'),
                     selinux=ds.get('selinux'),
                     hostname=ds.get('hostname'),
                     system=ds.get('system'),
                     cpu=ds.get('cpu'),
コード例 #11
0
ファイル: cron.py プロジェクト: zhaojinhong/roe
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','')}) 
コード例 #12
0
ファイル: cron.py プロジェクト: zhaojinhong/roe
                                                                                                     user=cron.cron_user,job=cron.cron_command
                                                                                                     )                              
                ANS.run_model(host_list=sList,module_name="cron",module_args=cron_args)    
        except Exception,e:
            return render(request,'opscontrol/cron/cron_modf.html',{"user":request.user,"errorInfo":"错误信息:"+str(e)},
                                  )                     
        return HttpResponseRedirect('/cron_mod/{id}/'.format(id=cid))
    
    elif request.method == "DELETE" and request.user.has_perm('OpsManager.can_delete_cron_config'):
        try:
            # recordCron.delay(cron_user=str(request.user),cron_id=cid,cron_name=cron.cron_name,cron_content="删除计划任务",cron_server=cron.cron_server.ip)
            sList = [cron.cron_server.ip]
            if cron.cron_server.keyfile == 1:resource = [{"ip": cron.cron_server.ip, "port": int(cron.cron_server.port),"username": cron.cron_server.username}] 
            else:resource = [{"ip": cron.cron_server.ip, "port": int(cron.cron_server.port),
                         "username": cron.cron_server.username,"password": cron.cron_server.passwd}]    
            ANS = ANSRunner(resource)  
            ANS.run_model(host_list=sList,module_name="cron",module_args="""name={name} state=absent""".format(name=cron.cron_name))    
            cron.delete()      
        except Exception,e:
            return JsonResponse({'msg':'删除失败:'+str(e),"code":500,'data':[]})                
        return JsonResponse({'msg':'删除成功',"code":200,'data':[]})       
        
@login_required()
@permission_required('OpsManage.can_add_cron_config',login_url='/noperm/') 
def cron_config(request):
    serverList = Server_Assets.objects.all()
    if request.method == "GET": 
        return render(request,'opscontrol/cron/cron_config.html',{"user":request.user,"serverList":serverList},
                                  )    
    elif request.method == "POST": 
        try:
コード例 #13
0
ファイル: exe_script.py プロジェクト: z00107647/roe
def exe_script(request):

    if request.method == 'GET':
        # jsonTree2=jsonTree.replace(' ','').replace('\n','')
        ans_uuid = uuid.uuid4()
        time_now = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))

        #无法同时渲染页面和传递json格式,渲染页面的编码和json编码是不一样的,因此只能通过异步的方式获取json格式数据
        return render(request, 'opscontrol/exejobs/exe_scripts.html', locals())
    elif request.method == 'POST':

        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

        hostid_list = request.POST['hosts'].split(',')

        redisKey = request.POST['ans_uuid']
        script_name = request.POST['script_name']
        script_content = request.POST['script_content']
        ansible_args = request.POST['script_args']
        try:
            ans_debug = request.POST['ans_debug']
        except:
            ans_debug = 'OFF'
        ip_list, hostlist = get_ans_host(hostid_list)
        if ip_list:
            filePath = saveScript(
                content=script_content,
                filePath='/tmp/{filename}'.format(filename=script_name))

            logId = AnsibleRecord.Model.insert(user=str(request.user),
                                               ans_model='script',
                                               ans_server=','.join(ip_list),
                                               ans_args=filePath)

            DsRedis.OpsAnsibleModel.delete(redisKey)
            DsRedis.OpsAnsibleModel.lpush(
                redisKey,
                "[Start] Ansible Model: {model}  Script:{filePath} {args}".
                format(model='script', filePath=filePath, args=ansible_args))
            if ans_debug == 'on':
                ANS = ANSRunner(hostlist, redisKey, logId, verbosity=4)
            else:
                ANS = ANSRunner(hostlist, redisKey, logId)

            ANS.run_model(host_list=ip_list,
                          module_name='script',
                          module_args="{filePath} {args}".format(
                              filePath=filePath, args=ansible_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': []})
        else:

            return JsonResponse({
                'msg': "操作失败,未选择主机或者该分组没有成员",
                "code": 500,
                'data': []
            })
コード例 #14
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,'opscontrol/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':[]})
コード例 #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,'opscontrol/apps/apps_playbook.html',{"user":request.user,"ans_uuid":playbook.playbook_uuid,
                                                         "errorInfo":"剧本不存在,可能已经被删除."}, 
                                  )     
      
    if request.method == "GET":
        return render(request,'opscontrol/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)
            Assets = AssetsSource()
            if playbook.playbook_server_model == 'inventory':
                sList,resource,groups = Assets.inventory(inventory=playbook.playbook_server_value)
            else:
                if numberList:serverList = [ s.playbook_server for s in numberList ]
                else:serverList = request.POST.getlist('playbook_server')
                sList, resource = Assets.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') 
            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':[]}) 
コード例 #16
0
ファイル: deploy.py プロジェクト: lui1798/roe
     data["ip"] = server.ip
     data["port"] = int(server.port)
     data["username"] = server.username
     data["sudo_passwd"] = server.sudo_passwd
     resource.append(data)
 DsRedis.OpsDeploy.lpush(
     project.project_uuid,
     data="[RSYNC start rsync project to remote server]")
 if resource and hostList:
     if exclude:
         args = '''src={srcDir} dest={desDir} links=yes recursive=yes compress=yes delete=yes rsync_opts="{exclude}"'''.format(
             srcDir=softdir, desDir=ds.dir, exclude=exclude)
     else:
         args = '''src={srcDir} dest={desDir} links=yes recursive=yes compress=yes delete=yes'''.format(
             srcDir=softdir, desDir=ds.dir)
     ANS = ANSRunner(resource)
     ANS.run_model(host_list=hostList,
                   module_name='synchronize',
                   module_args=args)
     #精简返回的结果
     dataList = ANS.handle_model_data(ANS.get_model_result(),
                                      'synchronize',
                                      module_args=args)
     for ds in dataList:
         DsRedis.OpsDeploy.lpush(
             project.project_uuid,
             data=
             "[RSYNC] Rsync project to {host} status: {status} msg: {msg}"
             .format(host=ds.get('ip'),
                     status=ds.get('status'),
                     msg=ds.get('msg')))