Exemplo n.º 1
0
def server_collects(tgt='*', server_id=0):
    server_list = SaltServer.objects.all()
    contexts = {'server_list': server_list, 'server_id': server_id}
    try:
        try:
            salt_server = SaltServer.objects.get(id=server_id)
        except Exception as e:  # id不存在时返回第一个
            salt_server = SaltServer.objects.all()[0]
    except Exception as e:
        contexts.update({'error': e})
    try:
        sapi = SaltAPI(url=salt_server.url,
                       username=salt_server.username,
                       password=salt_server.password)
        print salt_server.url
        grains = sapi.SaltCmd(tgt=tgt, fun='grains.items',
                              client='local')['return'][0]
        minions = sapi.key_list('manage.status', client='runner')['return'][0]
        if salt_server and grains:
            for i in grains.keys():
                try:
                    server = Servers.objects.get(local_ip=i)
                except:
                    server = Servers()

                # if sapi.SaltCmd(tgt=i,fun='test.ping',client='local')['return'][0]:
                if i in minions['up']:
                    minions_status = '0'
                else:
                    minions_status = '1'
                server.hostname = grains[i]['host']
                server.local_ip = grains[i]['id']
                server.OS = "%s %s" % (grains[i]['os'], grains[i]['osrelease'])
                server.Mem = grains[i]['mem_total']
                server.Cpus = grains[i]['num_cpus']
                server.Cpu_type = grains[i]['cpu_model']
                server.minion_id = grains[i]['id']
                server.app = grains[i]['virtual']
                server.server_status = minions_status
                server.save()
                contexts.update({
                    'success': u'%s 收集成功' % tgt,
                    'server_id': salt_server.id
                })
        if not grains:
            contexts.update({'error': u'%s 主机不存在或者离线' % tgt})
    except Exception as e:
        contexts.update({'error': '%s %s' % (tgt, e)})
    return contexts
Exemplo n.º 2
0
def key_list(request, server_id):

    server_list = SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:  # id不存在时返回第一个
        salt_server = SaltServer.objects.all()
        if salt_server:
            salt_server = salt_server[0]
        else:
            return render(request, 'saltstack/command.html',
                          {'apiinfo': u'请先添加SaltServer API'})
    sapi = SaltAPI(url=salt_server.url,
                   username=salt_server.username,
                   password=salt_server.password)
    context = {
        'salt_server': salt_server,
        'server_list': server_list,
        'url': 'key_list'
    }
    if request.method == 'POST':
        if request.POST.get('accept'):
            accept_minion = request.POST.get('accept')
            sapi.key_list(fun='key.accept', match=accept_minion)
        else:
            delete_minion = request.POST.get('delete')
            sapi.key_list(fun='key.delete', match=delete_minion)

    key_status = sapi.key_list('key.list_all')['return']
    minions_accept = key_status[0]['data']['return']['minions']
    minions_denied = key_status[0]['data']['return']['minions_denied']
    minions_rejected = key_status[0]['data']['return']['minions_rejected']
    minions_pre = key_status[0]['data']['return']['minions_pre']
    # minion_down = sapi.key_list('manage.status', client='runner')['return']
    minions = minions_accept + minions_denied + minions_rejected + minions_pre
    insert = []
    for minion in minions_accept:
        try:
            m = Minions.objects.get(minion=minion)
            m.status = "Accepted"
            m.save()
        except:
            insert.append(
                Minions(minion=minion,
                        saltserver=salt_server,
                        status="Accepted"))
    for minion in minions_rejected:
        try:
            m = Minions.objects.get(minion=minion)
            m.status = "Rejected"
            m.save()
        except:
            insert.append(
                Minions(minion=minion,
                        saltserver=salt_server,
                        status="Rejected"))

    for minion in minions_pre:
        try:
            m = Minions.objects.get(minion=minion)
            m.status = "Unaccepted"
            m.save()
        except:
            insert.append(
                Minions(minion=minion,
                        saltserver=salt_server,
                        status="Unaccepted"))
    Minions.objects.bulk_create(insert)

    # if len(minion_down[0]['down']) > 0:
    #     minion_down = minion_down[0]['down']
    # else:
    #     minion_down = []
    context.update({
        'minions': minions,
        'minion_down': "",
        'minions_pre': minions_pre
    })
    return render(request, 'saltstack/key_list.html', context)
Exemplo n.º 3
0
def state_exec(request, server_id):
    ret = state = ''
    server_list = SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:  # id不存在时返回第一个
        salt_server = SaltServer.objects.all()
        if salt_server:
            salt_server = salt_server[0]
        else:
            return render(request, 'saltstack/state.html',
                          {'apiinfo': u'请先添加SaltServer API'})
    sapi = SaltAPI(url=salt_server.url,
                   username=salt_server.username,
                   password=salt_server.password)
    # envs = sapi.SaltRun(client='runner', fun='fileserver.envs')['return'][0]
    envs = glob_config("salt_api", "envs").split(',')
    minions = sapi.key_list(
        'key.list_all')['return'][0]['data']['return']['minions']
    env = envs[0]
    minion_group = MinionGroup.objects.all()
    context = {
        'minions': minions,
        "minion_group": minion_group,
        'ret': ret,
        'envs': envs,
        'env': env,
        'state': state,
        'salt_server': salt_server,
        'server_list': server_list,
        'url': 'state_exec'
    }
    if request.method == 'POST':
        try:
            if request.POST.get('tgt'):
                minion = request.POST.get('tgt')
            else:
                minion = minions[0]
            if request.POST.get('env'):
                env = request.POST.get('env')
                state = request.POST.get('state')
                if minion and state:
                    ret = sapi.SaltCmd(tgt=minion,
                                       fun='state.sls',
                                       client='local',
                                       arg=state,
                                       arg1='saltenv=%s' % env)['return'][0]
            roots = sapi.SaltRun(
                client='wheel',
                fun='file_roots.list_roots')['return'][0]['data']['return']
            dirs = roots[env][0]
            states = []
            for root, dirs in dirs.items(
            ):  # root="/srv/salt/prod/"  dirs={"init":{"epel.sls":"f",}}
                for dir, files in dirs.items(
                ):  # dir='init' or 'top.sls'    files={"epel.sls":"f",}
                    if dir == '.svn':
                        dir = '.svn'
                    elif files == "f" and dir.endswith('.sls'):
                        states.append(dir[0:-4])
                    elif isinstance(files, dict):
                        for sls, f in files.items():
                            if f == 'f' and sls.endswith('.sls'):
                                states.append('%s.%s' % (dir, sls[0:-4]))
            result = sorted(states)
            if result and not state:
                state = result[0]
            context.update({
                'minion': minion,
                'ret': ret,
                'states': result,
                'env': env,
                'state': state
            })
        except Exception as e:
            context.update({'error': e})
        fh.username = request.session.get('username')
        fh.active = u'state 编排'
        fh.active_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        fh.remote_server = ''
        fh.path = state
        fh.save()
    return render(request, 'saltstack/state.html', context)
Exemplo n.º 4
0
def cmd_exec(request, server_id):
    server_list = SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:  # id不存在时返回第一个
        salt_server = SaltServer.objects.all()
        if salt_server:
            salt_server = salt_server[0]
        else:
            return render(request, 'saltstack/command.html',
                          {'apiinfo': u'请先添加SaltServer API'})
    sapi = SaltAPI(url=salt_server.url,
                   username=salt_server.username,
                   password=salt_server.password)
    minion_group = MinionGroup.objects.all()
    minions = sapi.key_list(
        'key.list_all')['return'][0]['data']['return']['minions']
    # minions = MinionGroup.objects.minions.all()
    tgt = info = cmd_exec_result = minion_list = ''

    context = {
        'salt_server': salt_server,
        'server_list': server_list,
        'minions': minions,
        'url': 'cmd_exec'
    }
    exec_module = "cmd.run"
    if request.method == 'POST':
        try:
            ip_list = request.POST.get('minion')
            cmd_args = request.POST.get('arg')
            group = request.POST.get('group')
            if group:
                minions = MinionGroup.objects.get(
                    groupname=group).minions.all()
            else:
                minions = MinionGroup.objects.get(
                    groupname="All").minions.all()
            if not cmd_args:
                info = '请输入执行命令!'
            elif ip_list:
                tgt = ip_list
                cmd_exec_result = sapi.SaltCmd(tgt,
                                               exec_module,
                                               client='local',
                                               arg=cmd_args,
                                               expr_form='list')['return'][0]
            else:
                for i in minions.values('minion'):
                    minion_list += i['minion'] + ','
                tgt = minion_list.strip(',')
                cmd_exec_result = sapi.SaltCmd(tgt,
                                               exec_module,
                                               client='local',
                                               arg=cmd_args,
                                               expr_form='list')['return'][0]
            context.update({
                'cmd_exec_result': cmd_exec_result,
                'info': info,
                'arg': cmd_args,
                'tgt': tgt,
                'group': group,
                'minions': minions
            })
        except Exception as e:
            if request.POST.get('minion'):
                tgt = request.POST.get('minion')
            if request.POST.get('minions'):
                tgt = request.POST.get('minions')
            cmd_exec_result = e
            context.update({'error': e})
        ##添加审计记录
        fh.username = request.session.get('username')
        fh.active = 'exec command'
        fh.active_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        fh.remote_server = tgt
        fh.path = cmd_exec_result
        fh.save()
    context.update({'minion_group': minion_group})

    return render(request, 'saltstack/command.html', context)