Example #1
0
def execute(workflow, atomic_task):
    """Encapsulate the Ansible api, actually run a playbook"""
    runner = ANSRunner(resource=atomic_task.resource,
                       redisKey=atomic_task.redisKey,
                       logId=atomic_task.logId)
    runner.run_playbook(host_list=None,
                        playbook_path=atomic_task.task_file,
                        extra_vars=atomic_task.extra_vars)
    result = runner.get_playbook_result()
    print('*' * 32 + 'Result of {}'.format(atomic_task) + '*' * 32)
    print(result)
    print('*' * 32 + 'End of result.' + '*' * 32)

    # 添加 执行结果,前端可访问
    redisKey = 'WorkflowTask-{}-{}'.format(atomic_task.logId,
                                           atomic_task.task_file)
    DsRedis.OpsAnsiblePlayBook.lpush(redisKey, 'Done')

    if any((result['failed'], result['unreachable'])):  # on failure
        if atomic_task.on_failure is not None:
            node = atomic_task.on_failure
            print(('Executing {} encounter failure try to execute '
                   '{}').format(atomic_task, node))
            execute.delay(workflow, node)
    else:  # on success
        if atomic_task.on_success is not None:
            node = atomic_task.on_success
            print(('Executing {} encounter success try to execute '
                   '{}').format(atomic_task, node))
            execute.delay(workflow, node)
Example #2
0
def AnsiblePlayBook(**kw):
    logId = None
    try:
        if kw.has_key('playbook_id'):
            playbook = Ansible_Playbook.objects.get(id=kw.get('playbook_id'))
            filePath = os.getcwd() + '/upload/' + str(playbook.playbook_file)
            if kw.has_key('hosts'):
                try:
                    sList = list(kw.get('hosts'))
                except Exception, ex:
                    return ex
            else:
                try:
                    numberList = Ansible_Playbook_Number.objects.filter(
                        playbook=playbook)
                    if numberList:
                        sList = [s.playbook_server for s in numberList]
                except Exception, ex:
                    return ex
            if kw.has_key('logs'):
                logId = AnsibleRecord.PlayBook.insert(
                    user='******',
                    ans_id=playbook.id,
                    ans_name=playbook.playbook_name,
                    ans_content=u"执行Ansible剧本",
                    ans_server=','.join(sList))
            sList, resource = AssetsSource().queryAssetsByIp(ipList=sList)
            ANS = ANSRunner(resource, redisKey=None, logId=logId)
            ANS.run_playbook(host_list=sList, playbook_path=filePath)
            return ANS.get_playbook_result()
Example #3
0
def AnsiblePlayBook(**kw):
    logId = None
    sList = []
    resource = []
    try:
        if kw.has_key('playbook_id'):
            playbook = Ansible_Playbook.objects.get(id=kw.get('playbook_id'))
            filePath = settings.PLAYBOOK_PATH + '/' + str(
                playbook.playbook_file)
            try:
                numberList = Ansible_Playbook_Number.objects.filter(
                    playbook=playbook)
                serverList = [s.playbook_server for s in numberList]
                for server in serverList:
                    server_assets = TF_Device_Info.objects.filter(
                        device_id=server)
                    for iter in server_assets:
                        sList.append(iter.device_id)
                        resource.append({
                            "hostname": iter.device_id,
                            "ip": iter.ansible_ssh_host,
                            "port": int(iter.ansible_ssh_port),
                            "username": iter.ansible_ssh_user
                        })
                playbook_vars = playbook.playbook_vars
                if len(playbook_vars) == 0:
                    playbook_vars = dict()
                else:
                    playbook_vars = json.loads(playbook_vars)
                playbook_vars['host'] = sList
            except Exception, ex:
                return ex

            logId = AnsibleRecord.PlayBook.insert(
                user='******',
                ans_id=playbook.id,
                ans_name=kw.get('cron_task_name'),
                ans_content=u"执行定时任务",
                ans_server=','.join(sList))
            ANS = ANSRunner(resource, redisKey=None, logId=logId)
            ANS.run_playbook(host_list=sList,
                             playbook_path=filePath,
                             extra_vars=playbook_vars)
            return ANS.get_playbook_result()
    except Exception, e:
        return False
Example #4
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()
Example #5
0
            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))
            for sip in sList:
                try:
                    server_assets = Server_Assets.objects.get(ip=sip)
                except Exception, ex:
                    continue
                if server_assets.keyfile == 1:
                    resource.append({
                        "hostname": server_assets.ip,
                        "port": int(server_assets.port)
                    })
                else:
                    resource.append({
                        "hostname": server_assets.ip,
                        "port": int(server_assets.port),
                        "username": server_assets.username,
                        "password": server_assets.passwd
                    })
            ANS = ANSRunner(resource, redisKey=None, logId=logId)
            ANS.run_playbook(host_list=sList, playbook_path=filePath)
            return ANS.get_playbook_result()
    except Exception, e:
        print e
        return False
Example #6
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 = Server_Assets.objects.all()
    except:
        return render(
            request,
            'apps/apps_playbook.html',
            {
                "user": request.user,
                "ans_uuid": playbook.playbook_uuid,
                "errorInfo": "剧本不存在,可能已经被删除."
            },
        )
    if request.method == "GET":
        return render(
            request,
            'apps/apps_playbook.html',
            {
                "user": request.user,
                "playbook": playbook,
                "serverList": serverList,
                "numberList": numberList
            },
        )
    elif request.method == "POST":
        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() + '/' + str(playbook.playbook_file)
            sList = []
            resource = []
            if numberList: serverList = [s.playbook_server for s in numberList]
            else: serverList = request.POST.getlist('playbook_server')
            for server in serverList:
                server_assets = Server_Assets.objects.get(ip=server)
                sList.append(server_assets.ip)
                if server_assets.keyfile == 1:
                    resource.append({
                        "hostname": server_assets.ip,
                        "port": int(server_assets.port)
                    })
                else:
                    resource.append({
                        "hostname": server_assets.ip,
                        "port": int(server_assets.port),
                        "username": server_assets.username,
                        "password": server_assets.passwd
                    })
            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, e:
                DsRedis.OpsAnsiblePlayBookLock.delete(
                    redisKey=playbook.playbook_uuid + '-locked')
                return JsonResponse({
                    'msg': "剧本外部变量不是Json格式",
                    "code": 500,
                    'data': []
                })
            logId = AnsibleRecord.PlayBook.insert(
                user=str(request.user),
                ans_id=playbook.id,
                ans_name=playbook.playbook_name,
                ans_content="执行Ansible剧本",
                ans_server=','.join(sList))
            #执行ansible playbook
            if request.POST.get('ansible_debug') == 'on':
                ANS = ANSRunner(resource,
                                redisKey=playbook.playbook_uuid,
                                logId=logId,
                                verbosity=4)
            else:
                ANS = ANSRunner(resource,
                                redisKey=playbook.playbook_uuid,
                                logId=logId)
            ANS.run_playbook(host_list=sList,
                             playbook_path=playbook_file,
                             extra_vars=playbook_vars)
            #获取结果
            result = ANS.get_playbook_result()
            dataList = []
            statPer = {
                "unreachable": 0,
                "skipped": 0,
                "changed": 0,
                "ok": 0,
                "failed": 0
            }
            for k, v in result.get('status').items():
                v['host'] = k
                if v.get('failed') > 0 or v.get('unreachable') > 0:
                    v['result'] = 'Failed'
                else:
                    v['result'] = 'Succeed'
                dataList.append(v)
                statPer[
                    'unreachable'] = v['unreachable'] + statPer['unreachable']
                statPer['skipped'] = v['skipped'] + statPer['skipped']
                statPer['changed'] = v['changed'] + statPer['changed']
                statPer['failed'] = v['failed'] + statPer['failed']
                statPer['ok'] = v['ok'] + statPer['ok']
            DsRedis.OpsAnsiblePlayBook.lpush(playbook.playbook_uuid,
                                             "[Done] Ansible Done.")
            #切换版本之后取消项目部署锁
            DsRedis.OpsAnsiblePlayBookLock.delete(
                redisKey=playbook.playbook_uuid + '-locked')
            #操作日志异步记录
            #             recordAnsiblePlaybook.delay(user=str(request.user),ans_id=playbook.id,ans_name=playbook.playbook_name,
            #                                         ans_content="执行Ansible剧本",uuid=playbook.playbook_uuid,ans_server=','.join(sList))
            return JsonResponse({
                'msg': "操作成功",
                "code": 200,
                'data': dataList,
                "statPer": statPer
            })
        else:
            return JsonResponse({
                'msg':
                "剧本执行失败,{user}正在执行该剧本".format(
                    user=DsRedis.OpsAnsiblePlayBookLock.get(
                        playbook.playbook_uuid + '-locked')),
                "code":
                500,
                'data': []
            })
Example #7
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 = Server_Assets.objects.all()
    except:
        return render_to_response('apps/apps_playbook.html',{"user":request.user,"ans_uuid":playbook.playbook_uuid,
                                                         "errorInfo":"剧本不存在,可能已经被删除."}, 
                                  context_instance=RequestContext(request))     
    if request.method == "GET":
        return render_to_response('apps/apps_playbook.html',{"user":request.user,"playbook":playbook,
                                                             "serverList":serverList,"numberList":numberList},
                                  context_instance=RequestContext(request)) 
    elif request.method == "POST":
        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() + '/' + str(playbook.playbook_file)
            sList = []
            resource = []
            if numberList:serverList = [ s.playbook_server for s in numberList ]
            else:serverList = request.POST.getlist('playbook_server')
            for server in serverList:
                server_assets = Server_Assets.objects.get(ip=server)
                sList.append(server_assets.ip)
                if server_assets.keyfile == 1:resource.append({"hostname": server_assets.ip, "port": int(server_assets.port)})
                else:resource.append({"hostname": server_assets.ip, "port": int(server_assets.port),"username": server_assets.username,"password": server_assets.passwd})
            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,e:
                DsRedis.OpsAnsiblePlayBookLock.delete(redisKey=playbook.playbook_uuid+'-locked')
                return JsonResponse({'msg':"剧本外部变量不是Json格式","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
            ANS = ANSRunner(resource,redisKey=playbook.playbook_uuid,logId=logId)
            ANS.run_playbook(host_list=sList, playbook_path=playbook_file,extra_vars=playbook_vars)
            #获取结果
            result = ANS.get_playbook_result()
            dataList = [] 
            statPer = {
                        "unreachable": 0,
                        "skipped": 0,
                        "changed": 0,
                        "ok": 0,
                        "failed": 0                       
                       } 
            for k,v in result.get('status').items():
                v['host'] = k 
                if v.get('failed') > 0 or v.get('unreachable') > 0:v['result'] = 'Failed'
                else:v['result'] = 'Succeed'
                dataList.append(v)      
                statPer['unreachable'] = v['unreachable'] + statPer['unreachable']
                statPer['skipped'] = v['skipped'] + statPer['skipped']
                statPer['changed'] = v['changed'] + statPer['changed']
                statPer['failed'] = v['failed'] + statPer['failed']
                statPer['ok'] = v['ok'] + statPer['ok']
            DsRedis.OpsAnsiblePlayBook.lpush(playbook.playbook_uuid, "[Done] Ansible Done.")
            #切换版本之后取消项目部署锁
            DsRedis.OpsAnsiblePlayBookLock.delete(redisKey=playbook.playbook_uuid+'-locked') 
            #操作日志异步记录
#             recordAnsiblePlaybook.delay(user=str(request.user),ans_id=playbook.id,ans_name=playbook.playbook_name,
#                                         ans_content="执行Ansible剧本",uuid=playbook.playbook_uuid,ans_server=','.join(sList))
            return JsonResponse({'msg':"操作成功","code":200,'data':dataList,"statPer":statPer})        
        else:
            return JsonResponse({'msg':"剧本执行失败,{user}正在执行该剧本".format(user=DsRedis.OpsAnsiblePlayBookLock.get(playbook.playbook_uuid+'-locked')),"code":500,'data':[]}) 
Example #8
0
def apps_playbook_run(request,pid):
    try:
        playbook = Ansible_Playbook.objects.get(id=pid)
        numberList = Ansible_Playbook_Number.objects.filter(playbook=playbook)
        if numberList:serverList = []
        else:serverList = AssetsSource().serverList()           
    except:
        return render(request,'apps/apps_playbook.html',{"user":request.user,"ans_uuid":playbook.playbook_uuid,
                                                         "errorInfo":"剧本不存在,可能已经被删除."}, 
                                  )     
      
    if request.method == "GET":
        return render(request,'apps/apps_playbook.html',{"user":request.user,"playbook":playbook,
                                                        "serverList":serverList,"numberList":numberList},
                                  ) 
    elif request.method == "POST" and request.user.has_perm('OpsManage.can_exec_ansible_playbook'):
        if DsRedis.OpsAnsiblePlayBookLock.get(redisKey=playbook.playbook_uuid+'-locked') is None:#判断剧本是否有人在执行
            #加上剧本执行锁
            DsRedis.OpsAnsiblePlayBookLock.set(redisKey=playbook.playbook_uuid+'-locked',value=request.user)
            #删除旧的执行消息
            DsRedis.OpsAnsiblePlayBook.delete(playbook.playbook_uuid)            
            playbook_file = os.getcwd() + '/upload/' + str(playbook.playbook_file)
            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':[]}) 
Example #9
0
            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)) 
            for sip in sList:
                try:
                    server_assets = Server_Assets.objects.get(ip=sip)
                except Exception, ex:
                    continue
                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": int(server_assets.port),"username": server_assets.username,"password": server_assets.passwd})         
            ANS = ANSRunner(resource,redisKey=None,logId=logId)
            ANS.run_playbook(host_list=sList, playbook_path=filePath)
            return ANS.get_playbook_result()
    except Exception,e:
        print e
        return False