def download_file(request,server_id): username = request.session.get('username') 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: # id不存在时返回第一个 salt_server = SaltServer.objects.all()[0] if not salt_server: contexts.update({'error': u'请先添加SaltServer API'}) except Exception as e: return render(request,'deploy/download_file.html',contexts) contexts.update({'salt_server': salt_server}) sapi = SaltAPI(url=salt_server.url, username=salt_server.username, password=salt_server.password) server = '' try: if request.method == 'POST': server = request.POST.get("server", None) dest = request.POST.get('dest') dir_result = sapi.SaltCmd(client='local', tgt=server, fun='file.directory_exists', arg=dest)['return'][0][server] file_result = sapi.SaltCmd(client='local', tgt=server, fun='file.file_exists', arg=dest)['return'][0][server] if not server: contexts.update({'error': u'目标主机不能为空!!'}) action_result = u'目标主机不能为空!!' elif not dest: contexts.update({'error': u'下载文件不能为空!!'}) action_result = u'下载文件不能为空!!' elif not dir_result and not file_result : contexts.update({'error': u'%s 文件或目录不存在' % dest}) action_result = u'%s 文件或目录不存在' % dest else: ##检索目录或者文件 arg = 'ls %s' % dest files_list = sapi.SaltCmd(tgt=server, fun="cmd.run", expr_form='list', arg=arg)['return'][0][server] nginx_url = 'http://' + glob_config('nginx', 'host') + ':' + glob_config('nginx','port') + '/' + upload_dir + '/' contexts.update({'files_list': files_list.split(), 'nginx_url': nginx_url, 'server': server, 'dest': dest}) action_result = arg fh = files_history() fh.username = username fh.active = 'download list' fh.path = action_result fh.remote_server = server fh.active_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) fh.save() except Exception as e: contexts.update({'error':u'目标主机和目标路径不能为空!!'}) return render(request,'deploy/download_file.html',contexts)
def download_fun(request,server_id): username = request.session.get('username') server_list = SaltServer.objects.all() contexts = {'server_list': server_list, 'server_id': server_id} try: salt_server = SaltServer.objects.get(id=server_id) except: # id不存在时返回第一个 salt_server = SaltServer.objects.all()[0] if not salt_server: contexts.update({'error': u'请先添加SaltServer API'}) contexts.update({'salt_server': salt_server}) sapi = SaltAPI(url=salt_server.url, username=salt_server.username, password=salt_server.password) try: files = request.POST.get('myfile') server = request.POST.get("server", None) dest = request.POST.get('dest') file_path=dest + '/' + files dir_result = sapi.SaltCmd(client='local', tgt=server, fun='file.directory_exists', arg=file_path)['return'][0][server] if dir_result: arg = 'ls %s' % file_path files_list = sapi.SaltCmd(tgt=server, fun="cmd.run", expr_form='list', arg=arg)['return'][0][server] contexts.update({'files_list': files_list.split(), 'server': server, 'dest': file_path}) action_result = arg else: ftp_url = 'http://' + glob_config('ftp', 'host') + ':' + glob_config('ftp','port') command = 'python /tmp/ftp_client.py %s %s' % (ftp_url,file_path) code = sapi.SaltCmd(tgt=server, fun='cmd.run', expr_form='list', arg=command)['return'][0][server] if int(code) == 200: contexts.update({'code':code}) nginx_url = 'http://' + glob_config('nginx', 'host') + ':' + glob_config('nginx','port') + '/' + upload_dir + '/' contexts.update({'files':files,'nginx_url': nginx_url, 'server': server, 'dest': dest}) action_result = file_path # os.remove(upload_dir + '/' + files) fh = files_history() fh.username = username fh.active = 'download' fh.path = action_result fh.remote_server = server fh.active_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) fh.save() except Exception as e: contexts.update({'error': e}) return render(request, 'deploy/download_file.html', contexts)
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)
#coding:utf-8 from django.shortcuts import render, HttpResponse, render_to_response from EmpAuth.decorators import login_required from saltstack.saltapi import SaltAPI from saltstack.models import SaltServer import time, json from deploy.models import files_history from SaltRuler.glob_config import glob_config from saltstack.models import * # Create your views here. saltmaster = glob_config('salt_api', 'master') fh = files_history() @login_required 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)
#coding:utf-8 from saltstack.saltapi import SaltAPI from SaltRuler.glob_config import glob_config url = glob_config('salt_api', 'url') username = glob_config('salt_api', 'username') password = glob_config('salt_api', 'password') device0 = glob_config('server', 'dervice0') def saltinfo(tgt): sapi = SaltAPI(url, username, password) grains = sapi.SaltCmd(tgt=tgt, fun='grains.items', client='local')['return'][0] disk = sapi.SaltCmd(tgt=tgt, fun='disk.usage', client='local')['return'][0] info = sapi.SaltCmd(tgt=tgt, fun='cmd.run', client='local', arg='uptime')['return'][0] hostname = grains[tgt]['host'] ip = grains[tgt]['ip4_interfaces'][device0][0] OS = grains[tgt]['os'] + ' ' + grains[tgt]['osrelease'] + '.' + grains[ tgt]['osarch'] disk_all = float(disk[tgt]['/']['1K-blocks']) / 1000 / 1000 disk_free = float(disk[tgt]['/']['available']) / 1000 / 1000 disk_used = float(disk[tgt]['/']['used']) / 1000 / 1000 disk_used_p = disk[tgt]['/']['capacity'] Manufacturer = grains[tgt]['manufacturer'] saltstack_version = grains[tgt]['saltversion'] mem_total = grains[tgt]['mem_total'] cpu_logical_cores = grains[tgt]['num_cpus'] cpu_model = grains[tgt]['cpu_model']
#!/usr/bin/env python #coding:utf-8 import time from django.shortcuts import render, HttpResponseRedirect from Cobblerd.cobbler_api import CobblerAPI from EmpAuth.decorators import login_required from SaltRuler.glob_config import glob_config c_url = glob_config("cobbler_api", "url") c_username = glob_config("cobbler_api", "username") c_password = glob_config("cobbler_api", "password") s_url = glob_config("salt_api", "url") s_username = glob_config("salt_api", "username") s_password = glob_config("salt_api", "password") #capi = CobblerAPI(c_url, c_username, c_password) @login_required def distros(request): try: contexts = {"distros": []} distros = capi.get_distro() for i in distros: ctime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(i['ctime']))
def upload_file(request,server_id): username = request.session.get('username') server_list = SaltServer.objects.all() contexts = {'server_list': server_list, 'server_id': server_id} try: try: salt_server = SaltServer.objects.get(id=server_id) print salt_server except Exception as e: # id不存在时返回第一个 salt_server = SaltServer.objects.all()[0] if not salt_server: contexts.update({'error':u'请先添加SaltServer API'}) except Exception as e: return render(request, 'deploy/uploadfile.html', contexts) contexts.update({'salt_server': salt_server}) try: if request.method == "POST": # 请求方法为GET时,进行处理 myFile =request.FILES.get("myfile", None) # 获取上传的文件,如果没有文件,则默认为None server = request.POST.get("server",None) dest = request.POST.get('dest','/tmp/') mdir = request.POST.get('mdir',None) mtime = request.POST.get('mtime',None) nginx_path = '' sapi = SaltAPI(url=salt_server.url, username=salt_server.username, password=salt_server.password) minions = sapi.key_list('manage.status', client='runner')['return'][0] for s in server.split(','): if s not in minions['up']: contexts.update({'error': u'目标主机 %s不存在或者已离线' % s}) action_result = contexts['error'] ###将操作过程写入数据库 fh = files_history() fh.username = username fh.active = 'upload' fh.path = action_result fh.remote_server = server fh.active_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) fh.url = nginx_path fh.save() return render(request, 'deploy/uploadfile.html', contexts) dir_result = sapi.SaltCmd(client='local', tgt=server, fun='file.directory_exists', arg=dest, expr_form='list')['return'][0] if not myFile: contexts.update({'error':u'请选择上传文件!'}) action_result = u'请选择上传文件!' elif not server: contexts.update({'error': u'目标主机不能为空!!'}) action_result = u'目标主机不能为空!!' elif not dir_result[s]: contexts.update({'error': u'目标主机 %s 目录不存在,请选择创建目录!!' % s}) action_result = contexts['error'] else: ##将文件上传到平台所在服务器 destination = open(os.path.join(upload_dir,myFile.name),'wb+') # 打开特定的文件进行二进制的写操作 for chunk in myFile.chunks(): # 分块写入文件 destination.write(chunk) destination.close() ##调用saltstack cp.get_url模块进行文件分发 nginx_url = 'http://'+ glob_config('nginx','host') +':' + glob_config('nginx','port') + '/' + upload_dir + '/' ##文件上传后静态服务地址 nginx_path = u'%s%s'% (nginx_url ,myFile.name) ##目标存放绝对路径 dest_path = u'dest=/%s/%s' % (dest.strip('/'), myFile.name) ##备份文件 if mtime: file_path =u'/%s/%s' % (dest.strip('/'),myFile.name) file_result = sapi.SaltCmd(client='local', tgt=server, fun='file.file_exists', arg=file_path,expr_form='list')['return'][0][server.split(',')[0]] if file_result: command = 'mv %s %s%s' % (file_path,file_path,time.strftime("%Y%m%d%H%M%S", time.localtime())) sapi.SaltCmd(tgt=server, fun="cmd.run", expr_form='list', arg=command) if mdir: command = 'mkdir -p %s' % dest sapi.SaltCmd(tgt=server, fun="cmd.run", expr_form='list', arg=command) upload_results = sapi.SaltCmd(tgt=server, fun="cp.get_url", arg=nginx_path, arg1=dest_path,expr_form='list')['return'][0] #curl - k https: // 192.168.62.200:8000 - H "Accept: application/x-yaml" - H "X-Auth-Token: 69ce7566d2f6680f420cf673ab0d3dc8639ce7aa" - d client = 'local' - d tgt = '192.168.62.200,192.168.62.201' - d fun = 'cp.get_url' - d arg = 'http://192.168.62.1/upload/along_logo.png' - d arg = '/tmp/along_logo.png' # upload_results = {'return': [{'192.168.62.200': '/tmp/along_logo.png', '192.168.62.201': '/tmp/along_logo.png'}]}['return'][0] contexts.update({'success': u'%s 上传成功!' % upload_results}) action_result = contexts['success'] os.remove('%s/%s' % (upload_dir,myFile.name)) print "移除后 : %s" % os.listdir(upload_dir) ###将操作过程写入数据库 fh=files_history() fh.username=username fh.active='upload' fh.path=action_result fh.remote_server = server fh.active_time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) fh.url = nginx_path fh.save() except Exception as e: print e contexts.update({'error':e}) return render(request, 'deploy/uploadfile.html', contexts)
#coding:utf-8 import os import time from django.shortcuts import render from EmpAuth.decorators import login_required from SaltRuler.glob_config import glob_config from deploy.models import files_history from saltstack.models import SaltServer from saltstack.saltapi import * # Create your views here. upload_dir = glob_config('nginx','upload_dir') master = glob_config('salt_api','master') @login_required def upload_file(request,server_id): username = request.session.get('username') server_list = SaltServer.objects.all() contexts = {'server_list': server_list, 'server_id': server_id} try: try: salt_server = SaltServer.objects.get(id=server_id) print salt_server except Exception as e: # id不存在时返回第一个 salt_server = SaltServer.objects.all()[0] if not salt_server: contexts.update({'error':u'请先添加SaltServer API'}) except Exception as e: return render(request, 'deploy/uploadfile.html', contexts) contexts.update({'salt_server': salt_server}) try: