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()
def AnsibleScripts(**kw): logId = None try: if kw.has_key('scripts_id'): script = Ansible_Script.objects.get(id=kw.get('scripts_id')) filePath = os.getcwd() + str(script.script_file) if kw.has_key('hosts'): try: sList = list(kw.get('hosts')) except Exception, ex: return ex else: try: sList = json.loads(script.script_server) except Exception, ex: return ex if kw.has_key('logs'): logId = AnsibleRecord.Model.insert(user='******', ans_model='script', ans_server=','.join(sList), ans_args=filePath) sList, resource = AssetsSource().queryAssetsByIp(ipList=sList) ANS = ANSRunner(resource, redisKey=None, logId=logId) ANS.run_model(host_list=sList, module_name='script', module_args="{filePath} {args}".format( filePath=filePath, args=script.script_args)) return ANS.get_model_result()
def 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':[]})
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()
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)}, )
def file_downloads(request): if request.method == "POST": try: order = Order_System.objects.get(id=request.POST.get('id', 0), order_type=3) except Exception, ex: return JsonResponse({'msg': ex, "code": 500, 'data': []}) if request.user.is_superuser or request.user.id in [ order.order_executor, order.order_user ]: sList, resource = AssetsSource().queryAssetsByIp( ipList=request.POST.getlist('dest_server')) if len(sList) > 0 and order.order_status == 8: ANS = ANSRunner(resource) dest = os.getcwd() + '/upload/file/download/' module_args = "src={src} dest={dest}".format( src=request.POST.get('path'), dest=dest) ANS.run_model(host_list=sList, module_name='fetch', module_args=module_args) filesData = json.loads(ANS.get_model_result()) filePath = filesData.get('success').get( request.POST.get('dest_server')).get('dest') if filePath: response = StreamingHttpResponse( base.file_iterator(filePath)) response['Content-Type'] = 'application/octet-stream' response[ 'Content-Disposition'] = 'attachment; filename="{file_name}'.format( file_name=os.path.basename(filePath)) return response else: return JsonResponse({ 'msg': "操作失败,未选择主机或者该分组没有成员", "code": 500, 'data': [] }) else: return JsonResponse({ 'msg': "操作失败,您没有权限进行操作", "code": 500, 'data': [] })
def 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': [] })
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')
"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',
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'),
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','')})
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:
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': [] })
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':[]})
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':[]})
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')))