Example #1
0
    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 = [ServerAssets.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()
Example #2
0
def run_module(request):
    if request.method == 'POST':
        gen_resource = GenResource()
        redis_conn = RedisOps(settings.REDIS_HOST, settings.REDIS_PORT,
                              settings.REDIS_DB)
        remote_ip = request.META['REMOTE_ADDR']
        group_ids = request.POST.getlist('hostGroup')
        host_ids = request.POST.getlist('ans_group_hosts')
        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 = [
            ServerAssets.objects.get(id=host_id).assets.asset_management_ip
            for host_id in host_ids
        ]
        selected_module_name = request.POST.get('ansibleModule')
        custom_model_name = request.POST.get('customModule')
        module_name = selected_module_name if selected_module_name != 'custom' else custom_model_name
        module_args = request.POST.get('ansibleModuleArgs')

        unique_key = '{}.{}.{}'.format(host_ids, module_name, module_args)

        if redis_conn.exists(unique_key):
            return JsonResponse({'msg': ['有相同的任务正在执行,请稍后再试'], 'code': 403})
        else:
            try:
                redis_conn.set(unique_key, 1)
                ans = ANSRunner(resource,
                                become='yes',
                                become_method='sudo',
                                become_user='******')
                ans.run_module(host_list=host_list,
                               module_name=module_name,
                               module_args=module_args)
                res = ans.get_model_result()

                return JsonResponse({'code': 200, 'msg': res})
            except Exception as e:
                return JsonResponse({
                    'code': 500,
                    'msg': ['任务执行失败:{}'.format(e)]
                })
            finally:
                redis_conn.delete(unique_key)
    inventory = AnsibleInventory.objects.prefetch_related('ans_group_hosts')
    hosts = ServerAssets.objects.select_related('assets')
    return render(request, 'task/run_module.html', locals())
Example #3
0
    def run_playbook(self, group_ids, playbook_id):
        playbook = AnsiblePlaybook.objects.select_related('playbook_user').get(
            id=playbook_id)
        unique_key = '{}.{}'.format(playbook.playbook_name, group_ids)

        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)
                resource = GenResource().gen_group_dict(group_ids)

                ans = ANSRunner(resource, sock=self)
                ans.run_playbook(playbook.playbook_file.path)

                playbook_record.delay(
                    playbook_user=UserProfile.objects.get(
                        id=self.ans_info['run_user']),
                    playbook_remote_ip=self.ans_info['remote_ip'],
                    playbook_name=playbook.playbook_name,
                    playbook_result=ans.get_playbook_results)
            except Exception as e:
                self.send(
                    '<code style="color: #FF0000">\nansible执行playbook出错:{}\n</code>'
                    .format(str(e)))
            finally:
                self.redis_instance.delete(unique_key)
                self.close()
Example #4
0
def get_playbook_res(group_ids, playbook_file):
    resource = GenResource().gen_group_dict(group_ids)

    ans = ANSRunner(resource)
    ans.run_playbook(playbook_file)
    res = ans.get_playbook_result()
    return res
Example #5
0
def fort_server(request):
    fort_servers = FortServer.objects.select_related('server')
    black_commands, created = FortBlackCommand.objects.get_or_create(id=1)
    fort_users = FortServerUser.objects.select_related('fort_server')
    if request.method == 'POST':
        try:
            new_black_commands = request.POST.get('black_commands')

            if fort_users.count() > 0:

                old_format_commands = format_commands(
                    black_commands.black_commands)
                new_format_commands = format_commands(new_black_commands)

                for fort_server_obj in fort_servers:
                    sudo_users = [
                        user.fort_username
                        for user in fort_server_obj.fortserveruser_set.all()
                    ]

                    resource = GenResource().gen_host_list(
                        list(str(fort_server_obj.server.id)))
                    ans = ANSRunner(resource)
                    ans.run_module(
                        host_list=fort_server_obj.server.assets.
                        asset_management_ip,
                        module_name='shell',
                        module_args=
                        r"cd /etc/sudoers.d/ && sed -i 's@{}@{}@' {}".format(
                            old_format_commands, new_format_commands,
                            ' '.join(sudo_users)))
                    FortBlackCommand.objects.filter(id=1).update(
                        black_commands=new_black_commands)
                    return JsonResponse({'code': 200, 'msg': '更新成功!'})
            else:
                FortBlackCommand.objects.filter(id=1).update(
                    black_commands=new_black_commands)
                return JsonResponse({'code': 200, 'msg': '更新成功!'})
        except Exception as e:
            return JsonResponse({'code': 500, 'msg': '更新失败!:{}'.format(e)})

    hosts = ServerAssets.objects.select_related('assets')
    server_protocols = FortServer.server_protocols
    server_status = FortServer.server_status_
    fort_user_status = FortServerUser.fort_user_status_
    users = UserProfile.objects.all()
    groups = Group.objects.all()
    remote_ip = request.META['REMOTE_ADDR']
    return render(request, 'fort/fort_server.html', locals())
Example #6
0
def get_inventory_hosts(request):
    if request.method == 'POST':
        group_ids = request.POST.getlist('hostGroup')
        hosts = GenResource().gen_host_dict(group_ids)
        return JsonResponse({'code': 200, 'hosts': hosts})
Example #7
0
def get_inventory_hosts(request):
    group_ids = request.GET.getlist('hostGroup')
    print(group_ids, type(group_ids))
    hosts = GenResource().gen_host_dict(group_ids)
    return JsonResponse({'code': 200, 'hosts': hosts})