Exemplo n.º 1
0
def state_fun(request, server_id):
    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)
    try:
        env = request.GET.get('env')
        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)
    except Exception as e:
        result = e
    return HttpResponse(json.dumps(result))
Exemplo n.º 2
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.º 3
0
def checkout(request, server_id):
    server_list = SaltServer.objects.all()
    try:
        salt_server = SaltServer.objects.get(id=server_id)
    except:  # id不存在时返回第一个
        salt_server = SaltServer.objects.all()[0]
    try:
        project_id = request.GET.get('project_id')
    except:
        project_id = ''
    project_list = SvnProject.objects.filter(
        salt_server=salt_server).order_by('host')
    contexts = {
        'server_list': server_list,
        'salt_server': salt_server,
        'project_list': project_list
    }
    if project_list and project_id:
        try:
            sapi = SaltAPI(url=salt_server.url,
                           username=salt_server.username,
                           password=salt_server.password)
            result = sapi.SaltRun(client='runner', fun='manage.status')
            contexts['minions_up'] = result['return'][0]['up']
            #刷新页面检测并更新项目状态
            project = SvnProject.objects.filter(id=project_id)[0]

            path = project.path + '/' + project.target

            svn_info = sapi.SaltCmd(
                client='local',
                tgt=project.host,
                fun='svn.info',
                arg=path,
                arg1='fmt=dict')['return'][0][project.host][0]

            if isinstance(svn_info, dict):
                if project.url == svn_info['URL']:
                    project.status = u"已发布"
                    project.info = u"最近修改时间:%s\n最近修改版本:%s\n最新版本:%s" % (
                        svn_info["Last Changed Date"][0:20],
                        svn_info["Last Changed Rev"], svn_info["Revision"])
                else:
                    project.status = u"冲突"
                    project.info = u"SVN路径不匹配:\n本地SVN为'%s'\n项目SVN为'%s'" % (
                        svn_info['URL'], project.url)
            else:
                #根路径不存在时创建
                if not sapi.SaltCmd(
                        client='local',
                        tgt=project.host,
                        fun='file.directory_exists',
                        arg=project.path)['return'][0][project.host]:
                    sapi.SaltCmd(client='local',
                                 tgt=project.host,
                                 fun='file.mkdir',
                                 arg=project.path)
                #目录未被版本控制,可能SVN未安装
                if not sapi.SaltCmd(
                        client='local',
                        tgt=project.host,
                        fun='pkg.version',
                        arg='subversion')['return'][0][project.host]:
                    sapi.SaltCmd(client='local',
                                 tgt=project.host,
                                 fun='pkg.install',
                                 arg='subversion')
                #签出项目、获取信息并存入库
                sapi.SaltCmd(client='local',
                             tgt=project.host,
                             fun='svn.checkout',
                             arg=project.path,
                             arg0='target=%s' % project.target,
                             arg1='remote=%s' % project.url,
                             arg2='username=%s' % project.username,
                             arg3='password=%s' % project.password)

                #签出项目后更新项目状态
                svn_info = sapi.SaltCmd(
                    client='local',
                    tgt=project.host,
                    fun='svn.info',
                    arg=path,
                    arg1='fmt=dict')['return'][0][project.host][0]
                project.status = u"已发布"
                project.info = u"最近修改时间:%s\n最近修改版本:%s\n最新版本:%s" % (
                    svn_info["Last Changed Date"][0:20],
                    svn_info["Last Changed Rev"], svn_info["Revision"])
            project.save()
            result = {'ret': True, 'msg': u'检出成功'}

        except Exception as error:
            result = {'ret': False, 'msg': u'错误:项目目录冲突'}
        fh = files_history()
        fh.username = request.session.get('username')
        fh.active = 'svn checkout'
        fh.active_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        fh.remote_server = SvnProject.objects.filter(id=project_id)[0].host
        fh.path = result['msg']
        fh.save()
        return JsonResponse(result, safe=False)