Example #1
0
 def post(request):
     ret = {'status': True, 'error': None, }
     try:
         if request.POST.get('nid'):
             ids = request.POST.get('nid', None)
             asset_obj = AssetInfo.objects.get(id=ids)
             try:
                 asset_obj.user.hostname
             except Exception as e:
                 logger.error(e)
                 ret['status'] = False
                 ret['error'] = '未关联用户,请关联后再更新'.format(e)
                 return HttpResponse(json.dumps(ret))
             assets = [{"hostname": asset_obj.hostname,
                        "ip": asset_obj.network_ip,
                        "port": asset_obj.port,
                        "username": asset_obj.user.username,
                        "password": decrypt_p(asset_obj.user.password),
                        "private_key": asset_obj.user.private_key.name
                        }]
             ansbile_asset_hardware.delay(ids, assets)
     except Exception as e:
         logger.error(e)
         ret['status'] = False
         ret['error'] = '获取资产信息错误{}'.format(e)
     finally:
         return HttpResponse(json.dumps(ret))
Example #2
0
    def post(request):
        ret = {
            'status': True,
            'error': None,
        }
        try:
            if request.POST.get('nid'):
                ids = request.POST.get('nid', None)
                asset_obj = AssetInfo.objects.get(id=ids)
                try:
                    asset_obj.user.hostname
                except Exception as e:
                    logger.error(e)
                    ret['status'] = False
                    ret['error'] = '未关联用户,请关联后再更新'.format(e)
                    return HttpResponse(json.dumps(ret))

                assets = [{
                    "hostname": asset_obj.hostname,
                    "ip": asset_obj.network_ip,
                    "port": asset_obj.port,
                    "username": asset_obj.user.username,
                    "password": decrypt_p(asset_obj.user.password),
                    "private_key": asset_obj.user.private_key.name
                }]
                ansbile_asset_hardware.delay(ids, assets)

        except Exception as e:
            logger.error(e)
            ret['status'] = False
            ret['error'] = '获取资产信息错误{}'.format(e)
        finally:
            return HttpResponse(json.dumps(ret))
Example #3
0
def taillog(request, hostname, port, username, password, private, tail):
    """
    执行 tail log 接口
    """
    channel_layer = get_channel_layer()
    user = request.user.username
    os.environ["".format(user)] = "true"
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    if password:
        ssh.connect(hostname=hostname,
                    port=port,
                    username=username,
                    password=decrypt_p(password))
    else:
        pkey = paramiko.RSAKey.from_private_key_file(private)
        ssh.connect(hostname=hostname, port=port, username=username, pkey=pkey)
    cmd = "tail " + tail
    stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
    for line in iter(stdout.readline, ""):
        if os.environ.get("".format(user)) == 'false':
            break
        result = {"status": 0, 'data': line}
        result_all = json.dumps(result)
        async_to_sync(channel_layer.group_send)(user, {
            "type": "user.message",
            'text': result_all
        })
Example #4
0
    def post(request):
        ids = request.POST.getlist('id')
        args = request.POST.getlist('args', None)
        modules = request.POST.getlist('module', None)

        idstring = ','.join(ids)
        asset_obj = AssetInfo.objects.extra(where=['id IN (' + idstring + ')'])

        tasks, assets = [], []
        for x in range(len(modules)):
            tasks.append(
                {
                    "action": {
                        "module": modules[x],
                        "args": args[x]
                    },
                    "name": 'task{}'.format(x)
                }, )

        ret_data = {'data': []}

        for i in asset_obj:

            try:
                i.user.hostname
            except Exception as e:
                logger.error(e)
                ret = {
                    'hostname': i.hostname,
                    'data': '未关联用户,请关联后再操作  {0}'.format(e)
                }
                ret_data['data'].append(ret)
                return HttpResponse(json.dumps(ret_data))

            varall = {
                'hostname': i.hostname,
                'inner_ip': i.inner_ip,
                "network_ip": i.network_ip,
                "project": i.project
            }
            try:
                varall.update(Variable.objects.get(assets__hostname=i).vars)
            except Exception as e:
                logger.error(e)

            assets.append(
                {
                    "hostname": i.hostname,
                    "ip": i.network_ip,
                    "port": i.port,
                    "username": i.user.username,
                    "password": decrypt_p(i.user.password),
                    "private_key": i.user.private_key.name,
                    "vars": varall,
                }, )

        t = cmdjob(assets, tasks)
        ret_data['data'] = t
        return HttpResponse(json.dumps(ret_data))
Example #5
0
    def post(request):
        name = Names.objects.get(username=request.user)
        ids = request.POST.getlist('id')
        args = request.POST.getlist('args', None)
        modules = request.POST.getlist('module', None)
        ret_data = {'data': []}
        if not ids or args == [''] or not modules:
            ret = {'hostname': None, 'data': "请选中服务器,输入要执行的命令"}
            ret_data['data'].append(ret)
            return HttpResponse(json.dumps(ret_data))

        idstring = ','.join(ids)
        asset_obj = AssetInfo.objects.extra(where=['id IN (' + idstring + ')'])

        for i in asset_obj:
            project = AssetInfo.objects.get(hostname=i).project
            project_obj = AssetProject.objects.get(projects=project)
            hasperm = name.has_perm('cmd_assetproject', project_obj)
            if hasperm == False:
                return HttpResponse(status=500)

        tasks, assets = [], []
        for x in range(len(modules)):
            tasks.append(
                {"action": {"module": modules[x], "args": args[x]}, "name": 'task{}'.format(x)}, )

        for i in asset_obj:
            try:
                i.user.hostname
            except Exception as e:
                logger.error(e)
                ret = {
                    'hostname': i.hostname,
                    'data': '未关联用户,请关联后再操作  {0}'.format(e)}
                ret_data['data'].append(ret)
                return HttpResponse(json.dumps(ret_data))

            var_all = {
                'hostname': i.hostname,
                'inner_ip': i.inner_ip,
                "network_ip": i.network_ip,
                "project": i.project.projects}
            try:
                var_all.update(Variable.objects.get(assets__hostname=i).vars)
            except Exception as e:
                pass

            assets.append({
                "hostname": i.hostname,
                "ip": i.network_ip,
                "port": i.port,
                "username": i.user.username,
                "password": decrypt_p(i.user.password),
                "private_key": i.user.private_key.name,
                "vars": var_all,
            }, )
        t = cmdjob(assets, tasks)
        ret_data['data'] = t
        return HttpResponse(json.dumps(ret_data))
Example #6
0
    def post(request):
        name = Names.objects.get(username=request.user)
        ids = request.POST.getlist('id')
        args = request.POST.getlist('args', None)
        modules = request.POST.getlist('module', None)
        ret_data = {'data': []}
        if not ids or args == [''] or not modules:
            ret = {'hostname': None, 'data': "请选中服务器,输入要执行的命令"}
            ret_data['data'].append(ret)
            return HttpResponse(json.dumps(ret_data))

        idstring = ','.join(ids)
        asset_obj = AssetInfo.objects.extra(where=['id IN (' + idstring + ')'])

        for i in asset_obj:
            project = AssetInfo.objects.get(hostname=i).project
            project_obj = AssetProject.objects.get(projects=project)
            hasperm = name.has_perm('cmd_assetproject', project_obj)
            if not hasperm:
                return HttpResponse(status=500)

        tasks, assets = [], []
        for x in range(len(modules)):
            tasks.append(
                {"action": {"module": modules[x], "args": args[x]}, "name": 'task{}'.format(x)}, )

        for i in asset_obj:
            try:
                i.user.hostname
            except Exception as e:
                logger.error(e)
                ret = {
                    'hostname': i.hostname,
                    'data': '未关联用户,请关联后再操作  {0}'.format(e)}
                ret_data['data'].append(ret)
                return HttpResponse(json.dumps(ret_data))

            var_all = {
                'hostname': i.hostname,
                'inner_ip': i.inner_ip,
                "network_ip": i.network_ip,
                "project": i.project.projects}
            try:
                var_all.update(Variable.objects.get(assets__hostname=i).vars)
            except Exception as e:
                pass
            assets.append({
                "hostname": i.hostname,
                "ip": i.network_ip,
                "port": i.port,
                "username": i.user.username,
                "password": decrypt_p(i.user.password),
                "private_key": i.user.private_key.name,
                "vars": var_all,
            }, )
        t = cmdjob(assets, tasks)
        ret_data['data'] = t
        return HttpResponse(json.dumps(ret_data))
Example #7
0
def taillog(request, hostname, port, username, password, private, tail):
    """
    执行 tail log 接口
    """
    channel_layer = get_channel_layer()
    user = request.user.username
    os.environ["".format(user)] = "true"
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    if password:
        ssh.connect(hostname=hostname, port=port, username=username, password=decrypt_p(password))
    else:
        pkey = paramiko.RSAKey.from_private_key_file("{0}".format(private))
        ssh.connect(hostname=hostname, port=port, username=username, pkey=pkey)
    cmd = "tail " + tail
    stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
    for line in iter(stdout.readline, ""):
        if os.environ.get("".format(user)) == 'false':
            break
        result = {"status": 0, 'data': line}
        result_all = json.dumps(result)
        async_to_sync(channel_layer.group_send)(user, {"type": "user.message", 'text': result_all})
Example #8
0
    def post(request):
        """
        执行工具
        :param request:  asset_id,tool_id
        :return:  ret
        """
        ret = {
            'status': True,
            'error': None,
        }
        name = Names.objects.get(username=request.user)
        try:
            asset_id = request.POST.getlist('asset[]', None)
            tool_id = request.POST.getlist('tool[]', None)

            if asset_id == [] or tool_id == []:
                ret['status'] = False
                ret['error'] = '未选择主机 或 未选择工具'
                return HttpResponse(json.dumps(ret))

            asset_id_tring = ','.join(asset_id)

            asset_obj = AssetInfo.objects.extra(
                where=['id IN (' + asset_id_tring + ')'])

            for i in asset_obj:
                pro = AssetInfo.objects.get(hostname=i).project
                proj = AssetProject.objects.get(projects=pro)
                rets = name.has_perm('cmd_assetproject', proj)
                if rets == False:
                    return HttpResponse(status=403)

            tool_obj = Tools.objects.filter(id=int(tool_id[0])).first()
            assets = []
            for i in asset_obj:
                varall = {
                    'hostname': i.hostname,
                    'inner_ip': i.inner_ip,
                    "network_ip": i.network_ip,
                    "project": i.project.projects
                }
                try:
                    varall.update(
                        Variable.objects.get(assets__hostname=i).vars)
                except Exception as e:
                    logger.error(e)

                assets.append(
                    {
                        "hostname": i.hostname,
                        "ip": i.network_ip,
                        "port": i.port,
                        "username": i.user.username,
                        "password": decrypt_p(i.user.password),
                        "private_key": i.user.private_key.name,
                        "vars": varall,
                    }, )

            file = "data/script/{0}".format(random.randint(0, 999999))
            file2 = "data/script/{0}".format(random.randint(1000000, 9999999))
            rets = None
            if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python':

                with open("{}.sh".format(file), 'w+') as f:
                    f.write(tool_obj.tool_script)
                os.system("sed  's/\r//'  {0}.sh >  {1}.sh".format(
                    file, file2))
                rets = ansbile_tools.delay(assets, '{}.sh'.format(file2),
                                           "script")
            elif tool_obj.tool_run_type == 'yml':

                with open("{}.yml".format(file), 'w+') as f:
                    f.write(tool_obj.tool_script)
                os.system("sed  's/\r//'  {0}.yml >  {1}.yml".format(
                    file, file2))
                rets = ansbile_tools.delay(assets,
                                           tools='{}.yml'.format(file2),
                                           modules="yml")

            task_obj = ToolsResults.objects.create(task_id=rets.task_id)
            ret['id'] = task_obj.id
            return HttpResponse(json.dumps(ret))
        except Exception as e:
            ret['status'] = False
            ret['error'] = '创建任务失败,{0}'.format(e)
            return HttpResponse(json.dumps(ret))
Example #9
0
def ansbile_tools_crontab(tools_name, *args):
    current_process()._config = {'semprefix': '/mp'}

    a_list, assets_list = [], []
    for i in args:
        AssetInfo.objects.get(hostname=i)
        a_list.append(AssetInfo.objects.get(hostname=i))

    t_obj = Tools.objects.get(name=tools_name)

    for i in a_list:
        var_all = {
            'hostname': i.hostname,
            'inner_ip': i.inner_ip,
            "network_ip": i.network_ip,
            "project": i.project.projects
        }
        try:
            var_all.update(
                Variable.objects.get(assets__hostname=i.hostname).vars)
        except Exception as e:
            pass

        assets_list.append(
            {
                "hostname": i.hostname,
                "ip": i.network_ip,
                "port": i.port,
                "username": i.user.username,
                "password": decrypt_p(i.user.password),
                "private_key": i.user.private_key.name,
                "vars": var_all,
            }, )

    file = "data/script/{0}".format(random.randint(0, 999999))
    file2 = "data/script/{0}".format(random.randint(1000000, 9999999))

    tools, modules = None, None
    if t_obj.tool_run_type == 'shell' or t_obj.tool_run_type == 'python':
        with open("{}.sh".format(file), 'w+') as f:
            f.write(t_obj.tool_script)
        os.system("sed  's/\r//'  {0}.sh >  {1}.sh".format(file, file2))
        tools = '{}.sh'.format(file2)
        modules = "script"
    elif t_obj.tool_run_type == 'yml':

        with open("{}.yml".format(file), 'w+') as f:
            f.write(t_obj.tool_script)
        os.system("sed  's/\r//'  {0}.yml >  {1}.yml".format(file, file2))
        tools = '{}.yml'.format(file2)
        modules = "yml"

    inventory = BaseInventory(host_list=assets_list)
    hostname, retsult_data = [], []

    for i in inventory.hosts:
        hostname.append(i)
    ret = None

    if modules == "script":
        runner = AdHocRunner(inventory)
        tasks = [
            {
                "action": {
                    "module": "{}".format(modules),
                    "args": "{}".format(tools)
                },
                "name": "script"
            },
        ]
        retsult = runner.run(tasks, "all")

        try:
            ok = retsult.results_raw['ok']
            failed = retsult.results_raw['failed']
            unreachable = retsult.results_raw['unreachable']
            if not ok and not failed:
                ret = unreachable
            elif not ok:
                ret = failed
            else:
                ret = ok
        except Exception as e:
            logger.error("{}".format(e))

        for i, element in enumerate(hostname):
            std, ret_host = [], {}
            try:
                out = ret[element]['script']['stdout']
                if not out:
                    out = ret[element]['script']['stderr']
                std.append("{0}".format(out))
            except Exception as e:
                logger.error(e)
                try:
                    std.append("{0}".format(ret[element]['script']['msg']))
                except Exception as e:
                    logger.error("执行失败{0}".format(e))
            ret_host['hostname'] = element
            ret_host['data'] = ''.join(std)
            retsult_data.append(ret_host)

    elif modules == 'yml':
        runers = PlayBookRunner(playbook_path=tools, inventory=inventory)
        retsult = runers.run()

        try:
            ret = retsult['results_callback']
        except Exception as e:
            logger.error("{}".format(e))
        for i, element in enumerate(hostname):
            std, ret_host = [], {}
            try:
                out = ret[element]['stdout']
                if not out:
                    out = ret[element]['stderr']
                std.append("{0}".format(out))
            except Exception as e:
                logger.error(e)
                try:
                    std.append("{0}".format(ret[element]['msg']))
                except Exception as e:
                    logger.error("执行失败{0}".format(e))
            ret_host['hostname'] = element
            ret_host['data'] = ''.join(std)
            retsult_data.append(ret_host)
    return retsult_data
Example #10
0
    def post(request):
        """
        执行工具
        :param request:  asset_id,tool_id,priority
        :return:  ret
        """
        ret = {
            'status': True,
            'error': None,
        }
        name = Names.objects.get(username=request.user)
        try:
            asset_id = request.POST.getlist('asset_id', None)
            tool_id = request.POST.getlist('tool_id', None)
            priority = request.POST.getlist('priority', None)

            if asset_id == [] or tool_id == [] or priority == []:
                ret['status'] = False
                ret['error'] = '未选择主机 或 未选择脚本 或 未设置优先级'
                return HttpResponse(json.dumps(ret))

            while '' in priority:
                priority.remove('')

            for i in priority:
                if priority.count(i) >= 2:
                    ret['status'] = False
                    ret['error'] = '优先级设置有重复 ,请重新修改!!!'
                    return HttpResponse(json.dumps(ret))

            asset_id_tring = ','.join(asset_id)
            asset_obj = AssetInfo.objects.extra(
                where=['id IN (' + asset_id_tring + ')'])

            for i in asset_obj:
                project = AssetInfo.objects.get(hostname=i).project
                project_obj = AssetProject.objects.get(projects=project)
                hasperm = name.has_perm('cmd_assetproject', project_obj)
                if not hasperm:
                    return HttpResponse(status=500)

            assets = []
            for i in asset_obj:
                var_all = {
                    'hostname': i.hostname,
                    'inner_ip': i.inner_ip,
                    "network_ip": i.network_ip,
                    "project": i.project.projects
                }
                try:
                    var_all.update(
                        Variable.objects.get(assets__hostname=i).vars)
                except Exception as e:
                    pass

                assets.append(
                    {
                        "hostname": i.hostname,
                        "ip": i.network_ip,
                        "port": i.port,
                        "username": i.user.username,
                        "password": decrypt_p(i.user.password),
                        "private_key": i.user.private_key.name,
                        "vars": var_all,
                    }, )

            tool_priority_1 = dict(zip(tool_id, priority))
            tool_priority = sorted(tool_priority_1.items(),
                                   key=lambda item: item[1])

            tasks = []
            for i in tool_priority:
                tool_obj = Tools.objects.get(id=i[0])
                if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python':
                    t = time.time()
                    file = "data/script/{0}".format(
                        int(round(t * 1000)) + random.randint(0, 999999))
                    t1 = time.time()
                    file2 = "data/script/{0}".format(
                        int(round(t1 * 1000)) +
                        random.randint(10000000, 99999999))
                    with open("{}.sh".format(file), 'w+') as f:
                        f.write(tool_obj.tool_script)
                    os.system("sed  's/\r//'  {0}.sh >  {1}.sh".format(
                        file, file2))
                    tasks.append(
                        {
                            "action": {
                                "module": "script",
                                "args": '{}.sh'.format(file2),
                            },
                            "name": 'task{}'.format(i[1])
                        }, )

                elif tool_obj.tool_run_type == 'yml':
                    t = time.time()
                    file = "data/script/{0}".format(
                        int(round(t * 1000)) + random.randint(0, 999999))
                    t1 = time.time()
                    file2 = "data/script/{0}".format(
                        int(round(t1 * 1000)) +
                        random.randint(10000000, 99999999))
                    with open("{}.yml".format(file), 'w+') as f:
                        f.write(tool_obj.tool_script)
                    os.system("sed  's/\r//'  {0}.yml >  {1}.yml".format(
                        file, file2))
                    tasks.append(
                        {
                            "action": {
                                "module": "yml",
                                "args": '{}.yml'.format(file2),
                            },
                            "name": 'task{}'.format(i[1])
                        }, )

            rets = ansbile_tools.delay(assets, tasks)
            task_obj = ToolsResults.objects.create(task_id=rets.task_id,
                                                   add_user=name)
            ret['id'] = task_obj.id
            return HttpResponse(json.dumps(ret))
        except Exception as e:
            ret['status'] = False
            ret['error'] = '创建任务失败,{0}'.format(e)
            return HttpResponse(json.dumps(ret))
Example #11
0
    def post(self, request):
        ids = request.POST.getlist('id')
        args = request.POST.getlist('args', None)
        module = request.POST.getlist('module', None)

        idstring = ','.join(ids)
        asset_obj = asset.objects.extra(where=['id IN (' + idstring + ')'])

        tasks, assets = [], []
        for x in range(len(module)):
            tasks.append(
                {
                    "action": {
                        "module": module[x],
                        "args": args[x]
                    },
                    "name": 'task{}'.format(x)
                }, )

        ret_data = {'data': []}

        for i in asset_obj:

            try:
                test = i.user.hostname
            except Exception as e:
                logger.error(e)
                ret = {
                    'hostname': i.hostname,
                    'data': '未关联用户,请关联后再操作  {0}'.format(e)
                }
                ret_data['data'].append(ret)
                return HttpResponse(json.dumps(ret_data))

            vars = {
                'hostname': i.hostname,
                'inner_ip': i.inner_ip,
                "network_ip": i.network_ip,
                "project": i.project
            }
            try:
                vars.update(variable.objects.get(assets__hostname=i).vars)
            except Exception as e:
                logger.error(e)

            assets.append([{
                "hostname": i.hostname,
                "ip": i.network_ip,
                "port": i.port,
                "username": i.user.username,
                "password": decrypt_p(i.user.password),
                "private_key": i.user.private_key.name,
                "vars": vars,
            }], )

        t_list = []

        for i in range(asset_obj.count()):
            t = MyThread(ThreadCmdJob, args=(
                assets[i],
                tasks,
            ))
            t_list.append(t)
            t.start()

        for j in t_list:
            j.join()
            ret = j.get_result()
            ret_data['data'].append(ret)

        return HttpResponse(json.dumps(ret_data))
Example #12
0
    def post(self, request):
        """
        执行工具
        :param request:  asset_id,tool_id
        :return:  ret
        """
        ret = {
            'status': True,
            'error': None,
        }

        try:
            asset_id = request.POST.getlist('asset[]', None)
            tool_id = request.POST.getlist('tool[]', None)

            if asset_id == [] or tool_id == []:
                ret['status'] = False
                ret['error'] = '未选择主机 或 未选择工具'
                return HttpResponse(json.dumps(ret))

            asset_id_tring = ','.join(asset_id)

            asset_obj = asset.objects.extra(
                where=['id IN (' + asset_id_tring + ')'])
            tool_obj = tools_script.objects.filter(id=int(tool_id[0])).first()

            assets = []

            for i in asset_obj:
                assets.append(
                    [{
                        "hostname": i.hostname,
                        "ip": i.network_ip,
                        "port": i.port,
                        "username": i.user.username,
                        "password": decrypt_p(i.user.password),
                        "private_key": i.user.private_key.name,
                        # "vars": {'name':123}, 变量
                    }], )

            file = "data/script/{0}".format(random.randint(0, 999999))
            file2 = "data/script/{0}".format(random.randint(1000000, 9999999))

            if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python':

                with open("{}.sh".format(file), 'w+') as f:
                    f.write(tool_obj.tool_script)
                os.system("sed  's/\r//'  {0}.sh >  {1}.sh".format(
                    file, file2))
                rets = ansbile_tools.delay(assets, '{}.sh'.format(file2),
                                           "script")
            elif tool_obj.tool_run_type == 'yml':

                with open("{}.yml".format(file), 'w+') as f:
                    f.write(tool_obj.tool_script)
                os.system("sed  's/\r//'  {0}.yml >  {1}.yml".format(
                    file, file2))
                rets = ansbile_tools.delay(assets, '{}.yml'.format(file2),
                                           "yml")

            task_obj = tool_results.objects.create(task_id=rets.task_id)
            ret['id'] = task_obj.id

        except Exception as e:
            ret['status'] = False
            ret['error'] = '创建任务失败,{0}'.format(e)
        finally:
            return HttpResponse(json.dumps(ret))
Example #13
0
    def post(request):
        """
        执行工具
        :param request:  asset_id,tool_id,priority
        :return:  ret
        """
        ret = {'status': True, 'error': None, }
        name = Names.objects.get(username=request.user)
        try:
            asset_id = request.POST.getlist('asset_id', None)
            tool_id = request.POST.getlist('tool_id', None)
            priority = request.POST.getlist('priority', None)
            if asset_id == [] or tool_id == [] or priority == ['']:
                ret['status'] = False
                ret['error'] = '未选择主机 或 未选择脚本 或 未设置优先级'
                return HttpResponse(json.dumps(ret))

            for i in priority:
                if priority.count(i) >= 2:
                    ret['status'] = False
                    ret['error'] = '优先级设置有重复 ,请重新修改!!!'
                    return HttpResponse(json.dumps(ret))

            asset_id_tring = ','.join(asset_id)
            asset_obj = AssetInfo.objects.extra(where=['id IN (' + asset_id_tring + ')'])

            for i in asset_obj:
                project = AssetInfo.objects.get(hostname=i).project
                project_obj = AssetProject.objects.get(projects=project)
                hasperm = name.has_perm('cmd_assetproject', project_obj)
                if not hasperm:
                    return HttpResponse(status=500)

            assets = []
            for i in asset_obj:
                var_all = {
                    'hostname': i.hostname,
                    'inner_ip': i.inner_ip,
                    "network_ip": i.network_ip,
                    "project": i.project.projects
                }
                try:
                    var_all.update(Variable.objects.get(assets__hostname=i).vars)
                except Exception as e:
                    pass

                assets.append({
                    "hostname": i.hostname,
                    "ip": i.network_ip,
                    "port": i.port,
                    "username": i.user.username,
                    "password": decrypt_p(i.user.password),
                    "private_key": i.user.private_key.name,
                    "vars": var_all,
                }, )

            tool_priority_1 = dict(zip(tool_id, priority))
            tool_priority = sorted(tool_priority_1.items(), key=lambda item: item[1])

            tasks = []
            for i in tool_priority:
                tool_obj = Tools.objects.get(id=i[0])
                if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python':
                    t = time.time()
                    file = "data/script/{0}".format(int(round(t * 1000)) + random.randint(0, 999999))
                    t1 = time.time()
                    file2 = "data/script/{0}".format(int(round(t1 * 1000)) + random.randint(10000000, 99999999))
                    with open("{}.sh".format(file), 'w+') as f:
                        f.write(tool_obj.tool_script)
                    os.system("sed  's/\r//'  {0}.sh >  {1}.sh".format(file, file2))
                    tasks.append({"action": {"module": "script", "args": '{}.sh'.format(file2), },
                                  "name": 'task{}'.format(i[1])}, )

                elif tool_obj.tool_run_type == 'yml':
                    t = time.time()
                    file = "data/script/{0}".format(int(round(t * 1000)) + random.randint(0, 999999))
                    t1 = time.time()
                    file2 = "data/script/{0}".format(int(round(t1 * 1000)) + random.randint(10000000, 99999999))
                    with open("{}.yml".format(file), 'w+') as f:
                        f.write(tool_obj.tool_script)
                    os.system("sed  's/\r//'  {0}.yml >  {1}.yml".format(file, file2))
                    tasks.append({"action": {"module": "yml", "args": '{}.yml'.format(file2), },
                                  "name": 'task{}'.format(i[1])}, )

            rets = ansbile_tools.delay(assets, tasks)
            task_obj = ToolsResults.objects.create(task_id=rets.task_id, add_user=name)
            ret['id'] = task_obj.id
            return HttpResponse(json.dumps(ret))
        except Exception as e:
            ret['status'] = False
            ret['error'] = '创建任务失败,{0}'.format(e)
            return HttpResponse(json.dumps(ret))