示例#1
0
def filetransfer_task(task, li_fp_srv, account, run_type):
    li_rem_host = [
        srv.ansible_host for srv in Server.objects.filter(id__in=li_fp_srv)
    ]
    print("li_rem_host22222222", li_rem_host)
    ft_obj = FileTransfer.objects.filter(id=task)
    f_path = ft_obj[0].files_path
    dest = ft_obj[0].dest_path
    li_f_path = f_path.split('||')
    tsk = [
        Tasks(li_rem_host,
              module_name='copy',
              module_args='src=%s' % fp + ' dest=%s' % dest)
        for fp in li_f_path
    ]
    # for fp in li_f_path:
    #     tsk.append(Tasks(li_rem_host, module_name='copy', module_args='src=%s' % fp + ' dest=%s' % dest))
    start_time = datetime.datetime.utcnow()
    result = run_multi_tasks(tsk)  # 开始传输文件
    end_time = datetime.datetime.utcnow()
    total_time = (end_time - start_time).total_seconds()
    tr = TaskRecord(account=account,
                    run_type=run_type,
                    task_id=task,
                    start_time=start_time,
                    end_time=end_time,
                    total_time=total_time,
                    task_type='job_filetransfer')
    tr.save()
    tr.result, flag = analyze_filetransfer_result(result)
    tr.result = json.dumps(tr.result)
    tr.save()
    ft = FileTransfer.objects.get(id=task)
    ft.status = 1 if flag else 2
    ft.save()
示例#2
0
def runscript_task(task, li_rs_srv, account, run_type):
    li_rem_host = [
        srv.ansible_host for srv in Server.objects.filter(id__in=li_rs_srv)
        if srv.ansible_host
    ]  # 注意这里id__in=后面要跟一个列表
    commands_obj = RunScript.objects.filter(id=task)
    commands_from_mysql = commands_obj[0].script_content
    file_path = save_tmp_script(commands_from_mysql)
    start_time = datetime.datetime.utcnow()
    r_result = run_task(li_rem_host,
                        module_name='script',
                        module_args=file_path)  # 运行脚本
    end_time = datetime.datetime.utcnow()
    total_time = (end_time - start_time).total_seconds()
    # 把run_task的执行返回结果,转化为列表,为后面传参做准备
    li_r_result = []
    li_r_result.append(r_result)
    # print "li_r_result", li_r_result
    try:
        tr = TaskRecord(account=account,
                        task_id=task,
                        start_time=start_time,
                        end_time=end_time,
                        total_time=total_time,
                        run_type=run_type,
                        task_type='job_bash')
        tr.save()
        tr.result, flag = run_results(li_r_result)
        tr.result = json.dumps(tr.result)
        tr.save()
        rs = RunScript.objects.get(id=task)
        rs.status = 1 if flag else 2
        rs.save()
    except Exception as e3:
        traceback.print_exc()
示例#3
0
def run_job(job_id='', account='', run_type=0):
    """
    运行作业多个任务
    :param job_id: 作业ID
    :param account: 执行人
    :param run_type: 执行类型(默认为0 网页执行)。(1 crontab执行)
    :return:
    """
    job = Job.objects.get(id=job_id)
    tasks = job.task_id.split(',')
    job.current_task = tasks[0]
    job.status = 0
    job.save()

    start_time = datetime.datetime.utcnow()
    task_list = []
    try:
        for task in tasks:
            # job.current_task = task
            # job.save()
            print("task", task)
            print("--------------------------------------------")
            task_rs_obj = RunScript.objects.filter(id=task)  # 执行结果为一个列表
            task_ft_obj = FileTransfer.objects.filter(id=task)  # 执行结果为一个列表
            # 如果是执行脚本
            if task_rs_obj:  # 如果列表不为空,则为执行脚本的任务
                task_list.append(gen_runscript_task(task))
            # 如果是分发文件
            if task_ft_obj:  # 如果列表不为空,则为分发文件的任务
                _tmp_task = gen_filetransfer_task(task)
                if isinstance(_tmp_task, list):
                    task_list.extend(_tmp_task)
                else:
                    task_list.append(_tmp_task)
        inv = [
            si.ansible_host
            for si in ServerInfo.objects.filter(id__in=job.server.split(','))
        ]
        runner = Runner(task_list=task_list, host_list=inv)
        code, res = runner.run(callback=FileTransferResultsCollector(
            jobid=job_id))
        end_time = datetime.datetime.utcnow()
        total_time = (end_time - start_time).total_seconds()
        TaskRecord(account=account,
                   task_id=str(job.id),
                   start_time=start_time,
                   end_time=end_time,
                   total_time=total_time,
                   run_type=run_type,
                   task_type='job').save()
        job.current_task = ''
        job.status = 1
        job.save()
    except Exception as e:
        traceback.print_exc()
示例#4
0
    def v2_playbook_on_task_complete(self):
        # 每次执行完一个任务(所有的主机)回调该方法
        _task = RunScript.objects.safe_get(id__in=self.job.task_id.split(','),
                                           name=self.current_task.name)
        if _task:
            start_time = datetime.datetime.utcnow()
            end_time = datetime.datetime.utcnow()
            total_time = (end_time - start_time).total_seconds()
            tr = TaskRecord(account='fengxu',
                            task_id=str(_task.id),
                            start_time=start_time,
                            run_type=0,
                            task_type='job_bash',
                            total_time=total_time)
            tr.save()
            print('*****', self.result[self.current_task.name])
            _result, flag = run_results(self.result[self.current_task.name])
            tr.result = json.dumps(_result)
            tr.save()

            rs = RunScript.objects.get(id=_task.id.get_hex())
            rs.status = 1 if flag else 2
            rs.save()
        else:
            if self.current_task.name.find(self.sep) > 0:
                task_name, sub_name = self.current_task.name.split(self.sep)
                _task = FileTransfer.objects.safe_get(
                    id__in=self.job.task_id.split(','), name=task_name)
                if not _task:
                    return

                start_time = datetime.datetime.utcnow()
                end_time = datetime.datetime.utcnow()
                total_time = (end_time - start_time).total_seconds()
                tr = TaskRecord.objects.safe_get(task_id=str(_task.id))
                if not tr:
                    tr = TaskRecord(account='fengxu',
                                    run_type=0,
                                    task_id=_task.id.get_hex(),
                                    start_time=start_time,
                                    end_time=end_time,
                                    total_time=total_time,
                                    task_type='job_filetransfer')
                    tr.save()
                    old_result = None
                else:
                    old_result = json.loads(tr.result) if tr.result else None

                new_result, flag = analyze_job_filetransfer_result(
                    self.result[task_name], old_result)
                tr.result = json.dumps(new_result)
                tr.save()
                ft = FileTransfer.objects.get(id=str(_task.id))
                ft.status = 1 if flag else 2
                ft.save()

            else:
                _tasks = FileTransfer.objects.filter(
                    id__in=self.job.task_id.split(','),
                    name=self.current_task.name)
                task_name = self.current_task.name
                pass
示例#5
0
def index(request):
    """
    快速脚本执行
    :param request:
    :return:
    """
    name = create_name('执行脚本')
    if request.method == 'GET':
        srv_param = request.GET.get("server", None)
        print(request.GET)
        if srv_param:
            server_ids = srv_param.split(',')
            srvs = ServerInfo.objects.filter(id__in=server_ids)
            servers = [srv.to_dict() for srv in srvs]
        return render(request, 'operating/index.html', locals())
    if request.method == "POST":
        user = request.POST.get('user')
        runscript_form = RunScriptForm(request.POST)
        try:
            if runscript_form.is_valid():
                data = runscript_form.cleaned_data
                print("data", data)
                script_data = RunScript(
                    name=name,
                    user=data['user'],
                    script_content=data['script_content'],
                    server=data['server'],
                    script_args=data['script_args'],
                )
                script_data.save()

                tsk_id = str(script_data.id)
                li_srv = data['server'].split(",")
                li = [
                    srv.ansible_host
                    for srv in ServerInfo.objects.filter(id__in=li_srv)
                ]  # 构造ansible_host列表
                if not li:
                    raise Exception("No Server Selected!")
                file_path = save_tmp_script(script_data.script_content)
                start_time = datetime.datetime.utcnow()
                r_result = run_task(li,
                                    module_name='script',
                                    module_args=file_path + " " +
                                    script_data.script_args)  # 运行脚本
                end_time = datetime.datetime.utcnow()
                total_time = (end_time - start_time).total_seconds()

                tr = TaskRecord(account=request.user.username,
                                start_time=start_time,
                                task_id=tsk_id,
                                end_time=end_time,
                                total_time=total_time,
                                run_type=0,
                                task_type='bash')
                tr.result, flag = run_results(r_result)
                tr.result = json.dumps(tr.result)
                tr.save()
                script_data.status = 1 if flag else 2
                script_data.save()
                return JsonResponse({
                    'result': True,
                    'message': str(tr.result)
                })
            else:
                log.error("Form data ERROR: " + str(runscript_form.errors))
                message = '表单验证失败!请检查您的填写内容。' + str(runscript_form.errors)
                return JsonResponse({'result': False, 'message': message})
        except Exception as e:
            log.error(traceback.format_exc())
            message = e.message
            return JsonResponse({'result': False, 'message': message})
示例#6
0
def filetransfer(request):
    if request.method == "GET":
        ft_name = create_name('分发文件')
        srv_param = request.GET.get("server", None)
        if srv_param:
            server_ids = srv_param.split(',')
            srvs = ServerInfo.objects.filter(id__in=server_ids)
            servers = [srv.to_dict() for srv in srvs]
        return render(request, 'operating/filetransfer.html', locals())

    tasks = []
    form = FileTransferForm(request.POST)
    if form.is_valid():
        try:
            ft_name = create_name('分发文件')
            data = form.cleaned_data
            print(data)
            srvs = [
                ServerInfo.objects.get(id=i).ansible_host
                for i in data['server_ids']
            ]
            print(srvs)
            ft = FileTransfer(name=ft_name,
                              user=data['user'],
                              files_path='||'.join(data['file_path']),
                              dest_path=data['dest'],
                              server=','.join(data['server_ids']))
            ft.save()
            start_time = datetime.datetime.utcnow()
            tr = TaskRecord(account=request.user.username,
                            start_time=start_time,
                            task_id=ft.id,
                            task_type='filetransfer')
            tr.save()

            task_list = [
                Runner.Task(name='be sure libselinux-python are installed',
                            module_name='yum',
                            module_args={
                                'name': 'libselinux-python',
                                'state': 'present'
                            })
            ]
            for fp in data['file_path']:
                task_list.append(
                    Runner.Task(name='copy file ' + fp,
                                module_name='copy',
                                module_args={
                                    'src': fp,
                                    'dest': data['dest']
                                }))
            # pb = Runner.Playbook(task_list=task_list)
            rc, result = Runner(host_list=srvs, task_list=task_list).run()
            tr.result, flag = analyze_filetransfer_result(result)
            tr.result = json.dumps(tr.result)
            ft.status = 1 if flag else 2
            ft.save()
            tr.end_time = datetime.datetime.utcnow()
            tr.total_time = (tr.end_time - start_time).total_seconds()
            tr.save()
            return JsonResponse({
                'result': True,
                'message': '执行完毕',
                'data': tr.to_dict()
            })
        except Exception as e:
            traceback.print_exc()
            log.error(traceback.format_exc())
    else:
        print("验证失败")
        print(form.errors)