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))
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)
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)