zoukankan      html  css  js  c++  java
  • 主机管理+堡垒机系统开发:批量任务开发思路(十一)

    一、批量任务开发思路

    1、开发目标

    2、开发思路

    1、前端提交发起请求100台机器,那我要等待5分钟,

    问题就在于,这100台不是同时执行完的,有可能我有10台执行完了,执行完了不能让他等五分钟,让他执行完了立刻就返回

    2、返回一个什么呢?

    task_id的值,这个值是唯一值

    3、触发任务和拿取结果关联起来?

    你相当于第一次提交是要触发这个任务,触发完这个任务后,不想让页面卡主,所以阿贾克斯必须要立即返回

    你每隔10秒钟去后台取次结果,你再去后台取就是发的新的请求,

    触发完任务后给它返回一个task_id的值,这个值是唯一值,我来后端取的时候拿上task_id的值

    4、问题是现在结果存在哪?

    1、写消息队列,一个任务一个队列,可能不合适,消息放到队列取走就消失了,因为我想要结果永久保存

    2、一个写数据库,每个线程,把任务执行完了,自己写到数据库,我前端直接从数据库里那

    二、批量任务存储表结构

    1、引子

    1、往后台提交一条任务,就往数据库里写一条记录,就把这个记录的id返回

    2、真正执行这条命令的主机从数据库拿详细的任务

    3、一条大任务分出来很多子结果,所以你还要有一张表示存任务结果的

    2、批量任务记录表

    class Task(models.Model):
        """批量任务记录表"""
        user = models.ForeignKey("UserProfile")
        task_type_choices = ((0,'cmd'),(1,'file_transfer'))
        task_type = models.SmallIntegerField(choices=task_type_choices)
        content = models.TextField(verbose_name="任务内容")
        #hosts = models.ManyToManyField("BindHost")
        date  = models.DateTimeField(auto_now_add=True)
    
    1. 那个用户执行的要不要存?
    2. 任务类型是批量执行命令还是批量分发文件
    3. 执行任务的类型要不要存?
    4. 这个任务有没有执行完,是用过什么来确定的?

    3、子任务表

    class TaskLogDetail(models.Model):
        task = models.ForeignKey("Task")
        bind_host = models.ForeignKey("BindHost")
        result = models.TextField()
    
        status_choices = ((0,'success'),(1,'failed'),(2,'init'))
        status = models.SmallIntegerField(choices=status_choices)
    
        start_date = models.DateTimeField(auto_now_add=True)
        end_date = models.DateTimeField(blank=True,null=True)
    
    
        def __str__(self):
            return "%s %s" %(self.bind_host,self.status)
    1. 写清楚自己关联是哪个大的任务
    2. 执行每个任务的时候,要不要写清楚自己是那台主机
    3. 每个子任务执行是否成功是不是要存起来

    4、admin注册

    admin.site.register(models.Task,TaskAdmin)
    admin.site.register(models.TaskLogDetail,TaskLogDetailAdmin)

    三、批量任务前端页面开发

    1、url

    url(r'^multitask/cmd/$', views.multitask_cmd,name="multitask_cmd"),
    

    2、views

    @login_required
    def multitask_cmd(request):
    
        return render(request,"multitask_cmd.html")
    
    @login_required
    def multitask_result(request):
        task_id = request.GET.get('task_id')
        task_obj = models.Task.objects.get(id=task_id)
        task_log_results = list(task_obj.tasklogdetail_set.values('id', 'result','status','start_date','end_date'))
    
        return  HttpResponse(json.dumps(task_log_results,default=json_date_handler))
    

    3、multitask_cmd.html

    {% extends 'index.html' %}
    
    
    {% block page-title %}主机管理|批量命令{% endblock %}
    
    {% block page-content %}
        {% csrf_token %}
    
    <div class="row">
    
        {% include 'multitask_host_list_component.html' %}
    
        <div class="col-lg-8">
            <div class="panel">
                <div class="panel-heading">
                    <h3 class="panel-title">命令操作</h3>
                </div>
                <div class="panel-body">
                    <textarea id="cmd_text" class="form-control"></textarea>
                    <input type="button" id='post_task_btn'  onclick="PostTask(this,'cmd')" class="btn btn-success pull-right" value="执行命令">
                </div>
            </div>
            <div class="panel">
                <div class="panel-heading">
                    <h3 class="panel-title">任务结果</h3>
                </div>
                <div class="panel-body">
                    <ul id="task_result_container"></ul>
                </div>
            </div>
        </div>
    
    </div>
    
    
    {% include 'multitask_js_component.html' %}
    
    {% endblock %}

    4、multitask_host_list_component.html

        <div class="col-lg-4">
            <div class="panel">
                <div class="panel-heading">
                    <h3 class="panel-title">主机列表</h3>
                </div>
                <div class="panel-body">
                        <div class="list-group bord-no">
                            <a onclick="HostListDisplayToggle(this)" class="list-group-item " href="#">
                                <input type="checkbox" onclick="SelectGroup(this)">
                                未分组主机
                                <span class="badge badge-primary">{{ request.user.bind_hosts.count }}</span>
                            </a>
                            <ol class="hide">
                                {% for bind_host in request.user.bind_hosts.all %}
                                    <li><input type="checkbox"  select_host="true" value="{{ bind_host.id }}">{{ bind_host.host.hostname }}({{ bind_host.host.ip_addr }})@{{ bind_host.remote_user.username}}</li>
                                {% endfor %}
                            </ol>
    
    
    
                            {% for host_group in request.user.host_groups.select_related %}
    
                                <a onclick="HostListDisplayToggle(this)" class="list-group-item " href="#">
                                    <input type="checkbox" onclick="SelectGroup(this)">
                                    {{ host_group.name }}
                                    <span class="badge badge-primary">{{ host_group.bind_hosts.count }}</span>
                                </a>
                                <ol class="hide">
                                    {% for bind_host in host_group.bind_hosts.all %}
                                        <li><input type="checkbox"  select_host="true" value="{{ bind_host.id }}">{{ bind_host.host.hostname }}({{ bind_host.host.ip_addr }})@{{ bind_host.remote_user.username}}</li>
                                    {% endfor %}
                                </ol>
    
    
                            {% endfor %}
                        </div>
                </div>
            </div>
    
        </div>

    四、前端测试截图

     1、基本框架截图

    2、全选反选功能截图

    3、命令操作功能截图

     4、整个框架完成截图

    5、控制台批量执行命令截图

  • 相关阅读:
    购物菜单
    数据库
    增删改查
    页面交互
    计算器
    2020.9.21
    团队-团队编程项目中国象棋-项目总结
    团队-团队编程项目作业名称-最终程序
    课后作业-阅读任务-阅读提问-4
    《20171130-构建之法:现代软件工程-阅读笔记》
  • 原文地址:https://www.cnblogs.com/luoahong/p/9501526.html
Copyright © 2011-2022 走看看