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()
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()
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()
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
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})
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)