def host_grains(tgt): ''' Salt API得到grains信息,进行格式化输出 ''' sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_noarg_execution(tgt,'grains.items') return ret
def remote_execution(request): """ remote command execution """ ret = '' tgtcheck = '' danger = ('rm', 'reboot', 'init ', 'shutdown') user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'exec': tgt = request.POST.get('tgt') arg = request.POST.get('arg') tgtcheck = HostList.objects.filter(hostname=tgt) argcheck = arg not in danger if tgtcheck and argcheck: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_execution(tgt, 'cmd.run', arg) elif not tgtcheck: ret = '亲,目标主机不正确,请重新输入' elif not argcheck: ret = '亲,命令很危险, 你这样子老大会不开森' Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret': ret}, context_instance=RequestContext(request))
def code_deploy(request): """ Pull code for building, pushed to the server """ ret = '' host = {'ga': 'test-01', 'beta': 'localhost.localdomain'} user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'push': pro = request.POST.get('project') url = request.POST.get('url') ver = request.POST.get('version') env = request.POST.get('env') capi = Code_Work(pro=pro,url=url,ver=ver) data = {pro:{'ver':ver}} obj = capi.work() #构建rpm包 if obj['comment'][0]['result'] and obj['comment'][1]['result'] and obj['comment'][2]['result']: json_api = BuildJson() json_api.build_data(host[env],data) #刷新pillar数据,通过deploy下发SLS执行代码发布 sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) if env == 'beta': jid = sapi.target_deploy('beta','deploy.'+pro) elif env == 'ga': jid = sapi.target_deploy('tg','deploy.'+pro) else: jid = sapi.target_deploy('beta','deploy.'+pro) time.sleep(8) db = db_operate() sql = 'select returns from salt_returns where jid=%s' ret=db.select_table(settings.RETURNS_MYSQL,sql,str(jid)) #通过jid获取执行结果 return render_to_response('code_deploy.html', {'ret': ret},context_instance=RequestContext(request))
def salt_delete_key(request): """ delete salt minions key """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] user = request.user node_name = request.GET.get('node_name') sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.delete_key(node_name) id_list = HostList.objects.filter(hostname=node_name) if id_list: for i in id_list: host_list = get_object_or_404(HostList, pk=i.id) host_list.delete() Message.objects.create(type='hostlist', action='delete', action_ip=ip, username=user, content='delete %s' % (node_name)) Message.objects.create(type='salt-key', action='delete', action_ip=ip, username=user, content='delete %s salt-key' % (node_name)) return HttpResponseRedirect(reverse('key_list'))
def salt_accept_key(request): """ accept salt minions key """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] user = request.user node_name = request.GET.get('node_name') what = request.GET.get('what') sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) if what == "accept": ret = sapi.accept_key(node_name) HostList.objects.create(hostname=node_name) if what == "reject": ret = sapi.reject_key(node_name) Message.objects.create(type='salt-key', action=what, action_ip=ip, username=user, content='saltstack accept %s key' % (node_name)) return HttpResponseRedirect(reverse('key_list'))
def remote_execution(request): """ remote command execution """ ret = '' tgtcheck = '' danger = ('rm','reboot','init ','shutdown') user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'exec': tgt = request.POST.get('tgt') arg = request.POST.get('arg') tgtcheck = HostList.objects.filter(hostname=tgt) argcheck = arg not in danger if tgtcheck and argcheck: sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_execution(tgt,'cmd.run',arg) elif not tgtcheck: ret = '亲,目标主机不正确,请重新输入' elif not argcheck: ret = '亲,命令很危险, 你这样子老大会不开森' Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret': ret},context_instance=RequestContext(request))
def targeting_execution(request,arg=''): """ remote command execution """ ret = '' ret2= '' arg2= "salt-ssh '*' -r '" tgtcheck = '' danger = ('rm', 'reboot', 'init ', 'shutdown', 'll') user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'exec': #tgt = request.POST.get('tgt') arg = request.POST.get('arg') #tgtcheck = HostList.objects.filter(ip=tgt) #目标主机名为以ip搜索, 改ip为hostname以hostname搜索 argcheck = arg not in danger #if tgtcheck and argcheck: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) #ret = sapi.remote_execution(tgt, 'cmd.run', arg) arg2=arg2+arg+"'" #ret2=arg2 ret= sapi.remote_ssh('cmd.run',arg2) #elif not tgtcheck: # ret = '亲,目标主机不正确,请重新输入' #elif not argcheck: # ret = '亲,命令很危险, 你这样子老大会不开森' Message.objects.create(type='salt-ssh', action='targeting', action_ip='*', content='saltstack execution command: %s ' % (arg)) return render(request, 'targeting_execution.html', {'ret': ret,'arg':arg})
def host_grains(tgt): ''' Salt API得到grains信息,进行格式化输出 ''' sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_noarg_execution(tgt, 'grains.items') return ret
def salt_file_download(request): def file_iterator(file_name, chunk_size=512): with open(file_name) as f: while True: c = f.read(chunk_size) if c: yield c else: break if request.method == 'POST': tgt_select = request.POST.get('tgt_select', None) remote_file = request.POST.get('remote_file', None) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret_bak = sapi.file_bak(tgt_select, 'cp.push', remote_file, 'list') if tgt_select == 'localhost': return render(request, 'redirect.html', {}) remote_path = remote_file.replace(remote_file.split('/')[-1], '') dl_path = './media/salt/filedownload/user_%s/%s%s' % ( request.user.id, tgt_select, remote_path) dl_file = '%s%s' % (dl_path, remote_file.split('/')[-1]) if not os.path.exists(dl_path): os.makedirs(dl_path) try: shutil.copy( '/var/cache/salt/master/minions/%s/files/%s' % (tgt_select, remote_file), dl_file) tar_file = make_tar(dl_file, '/tmp') dl_filename = 'attachment;filename="{0}"'.format( tar_file.replace('/tmp/', '%s%s' % (tgt_select, remote_path))) ret = u'主机:%s\n结果:远程文件 %s 下载成功!' % (tgt_select, remote_file) Message.objects.create(type=u'文件管理', user=request.user, action=u'文件下载', action_ip=UserIP(request), content=u'下载文件 \n%s' % ret) response = StreamingHttpResponse(file_iterator(tar_file)) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = dl_filename return response except: print 'No such file or dirctory' ret = u'主机:%s\n结果:远程文件 %s 下载失败,请确认文件是否存在!' % (tgt_select, remote_file) Message.objects.create(type=u'文件管理', user=request.user, action=u'文件下载', action_ip=UserIP(request), content=u'下载文件 \n%s' % ret) return render(request, 'salt_file_download.html', {'ret': ret}) return render(request, 'salt_file_download.html', {})
def salt_key_list(request): """ list all key """ user = request.user sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) minions,minions_pre = sapi.list_all_key() return render_to_response('salt_key_list.html', {'all_minions': minions, 'all_minions_pre': minions_pre})
def salt_delete_key(request): """ delete salt minions key """ node_name = request.GET.get('node_name') sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.delete_key(node_name) Message.objects.create(type='salt', action='key', action_ip=node_name, content='saltstack delete node key') return HttpResponseRedirect(reverse('key_list'))
def salt_key_list(request): """ list all key """ #user = request.user sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) minions, minions_pre = sapi.list_all_key() return render(request, 'salt_key_list.html', {'all_minions': minions, 'all_minions_pre': minions_pre})
def salt_delete_key(request): """ delete salt minions key """ node_name = request.GET.get('node_name') sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.delete_key(node_name) Message.objects.create(type='salt', action='key', action_ip=node_name, content='saltstack delete node key') return HttpResponseRedirect(reverse('key_list'))
def salt_key_list(request): """ list all key """ user = request.user sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) minions,minions_pre,minions_rej = sapi.list_all_key() minions_count = len(minions) minions_pre_count = len(minions_pre) minions_rej_count = len(minions_rej) return render_to_response('salt_key_list.html', {'all_minions': minions, 'all_minions_pre': minions_pre,'all_minions_rej': minions_rej,'minions_count':minions_count,'minions_pre_count':minions_pre_count,'minions_rej_count':minions_rej_count,'request':request})
def module_deploy(request): """ deploy (nginx/php/mysql..etc) module """ ret = [] jid = [] user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'deploy': tgt = request.POST.get('tgt') arg = request.POST.getlist('module') tgtcheck = HostList.objects.filter(hostname=tgt) if tgtcheck: Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg)) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) db = db_operate() if 'sysinit' in arg: obj = sapi.async_deploy(tgt, arg[-1]) # 先执行初始化模块,其他任意 sysinit 在最后的模块 sql = "insert INTO salt_returns VALUES(%s) " % obj print (sql) jid.append(obj) arg.remove('sysinit') if arg: for i in arg: obj = sapi.async_deploy(tgt, i) jid.append(obj) else: for i in arg: obj = sapi.async_deploy(tgt, i) sql = "insert INTO salt_returns VALUES(%s) " % obj db.mysql_command(settings.OMS_MYSQL, sql) jid.append(obj) msg = '%s deploy %s module success,jid is %s' % (tgt, i, obj) ret.append(msg) # db = db_operate() # for i in jid: # # time.sleep(10) # sql = 'select returns from salt_returns where returns=%s' # result=db.select_table(settings.OMS_MYSQL,sql,str(i)) #通过jid获取执行结果 # print result # ret.extend(result) # sapi.async_deploy('test-01','zabbix.api') #调用zabbix.api执行模块监控 else: ret = '亲,目标主机不对,请重新输入' return render(request, 'salt_module_deploy.html', {'ret': ret})
def AjaxResult(jid, check_type): ''' 定义ajax查询结果函数 ''' true = True sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.salt_runner(jid) if check_type == 'deploy': rst = ret['data'] rst_all = '' for k in rst: r_str = '' for k1 in rst[k]: if 'cmd_' in k1: v1 = rst[k][k1] if v1['result']: result = u'成功' else: result = u'失败' try: stderr = v1['changes']['stderr'] except: stderr = '' v_str = u'运行结果:' + result + u'\n错误:' + stderr + u'\n内容:' + v1[ 'comment'] + u'\n命令:' + v1['name'] + u'\n开始时间:' + v1[ 'start_time'] + u'\n耗时:' + str( v1['duration']) + '\n' r_str = u'主机:' + k + '\n' + v_str + '-' * 80 + '\n' rst_all = rst_all + r_str else: rst_all = '' for k in ret: r_str = u'主机:' + k + u'\n运行结果:\n' + ret[k] + '\n' + '-' * 80 + '\n' rst_all = rst_all + r_str try: # 记录查询操作日志 message = get_object_or_404(Message, action=jid) m = re.search('\[([^:]*)\]', message.content) module = m.groups()[0] message.content = '[%s]\n----\n%s' % (module, rst_all) message.save() except: print 'Err' pass return rst_all
def module_deploy(request): """ deploy (nginx/php/mysql..etc) module """ ret = [] jid = [] user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'deploy': tgt = request.POST.get('tgt') arg = request.POST.getlist('module') tgtcheck = HostList.objects.filter(hostname=tgt) if tgtcheck: Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg)) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) if 'sysinit' in arg: obj = sapi.async_deploy(tgt, arg[-1]) #先执行初始化模块,其他任意 jid.append(obj) arg.remove('sysinit') if arg: for i in arg: obj = sapi.async_deploy(tgt, i) jid.append(obj) else: for i in arg: obj = sapi.async_deploy(tgt, i) jid.append(obj) db = db_operate() for i in jid: time.sleep(10) sql = 'select returns from salt_returns where jid=%s' result = db.select_table(settings.RETURNS_MYSQL, sql, str(i)) #通过jid获取执行结果 ret.append(result) #sapi.async_deploy('test-01','zabbix.api') #调用zabbix.api执行模块监控 else: ret = '亲,目标主机不对,请重新输入' return render_to_response('salt_module_deploy.html', {'ret': ret}, context_instance=RequestContext(request))
def get_server_asset_info(tgt): ''' Salt API得到资产信息,进行格式化输出 ''' global asset_info info = [] sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_noarg_execution(tgt, 'grains.items') manufacturer = ret['manufacturer'] info.append(manufacturer) productname = ret['productname'] info.append(productname) serialnumber = ret['serialnumber'] info.append(serialnumber) cpu_model = ret['cpu_model'] info.append(cpu_model) num_cpus = int(ret['num_cpus']) info.append(num_cpus) num_gpus = int(ret['num_gpus']) info.append(num_gpus) mem_total = str(round(int(ret['mem_total']) / 1024.0, ))[:-2] + 'G' info.append(mem_total) #disk_size = ret['disk_size'] disk_size = 10 info.append(disk_size) #raidlevel = ret['raidlevel'] raidlevel = 5 info.append(raidlevel) id = ret['id'] info.append(id) #lan_ip = ret['lan_ip'][0] lan_ip = ret['fqdn_ip4'] info.append(lan_ip) #lan_mac = ret['hwaddr_interfaces'][0] lan_mac = 'mac' info.append(lan_mac) sys_ver = ret['os'] + ret['osrelease'] + '-' + ret['osarch'] info.append(sys_ver) virtual = ret['virtual'] info.append(virtual) #idc_name = ret['idc_name'] idc_name = 'testidc' info.append(idc_name) asset_info.append(info)
def GetAssetInfo(tgt): ''' Salt API获取主机信息并进行格式化输出 ''' info = {} sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_server_info(tgt, 'grains.items') info['sn'] = GetInfo(ret, 'serialnumber') info['hostname'] = GetInfo(ret, 'fqdn') info['nodename'] = tgt info['os'] = GetInfo(ret, 'os') + GetInfo( ret, 'osrelease') + ' ' + GetInfo(ret, 'osarch') info['manufacturer'] = GetInfo(ret, 'manufacturer') info['cpu_model'] = GetInfo(ret, 'cpu_model') info['productname'] = GetInfo(ret, 'productname') info['cpu_nums'] = GetInfo(ret, 'num_cpus') info['disk'] = str(DISKINFO[0]) + "GB" info['network'] = GetInfo(ret, 'PublicIp') info['kernel'] = GetInfo(ret, 'kernel') + GetInfo(ret, 'kernelrelease') info['zmqversion'] = GetInfo(ret, 'zmqversion') info['shell'] = GetInfo(ret, 'shell') info['saltversion'] = GetInfo(ret, 'saltversion') info['locale'] = GetInfoDict(ret, 'locale_info') info['selinux'] = GetInfoDict(ret, 'selinux') info['networkarea'] = GetInfo(ret, 'netRegion') if 'virtual_subtype' in ret: virtual = GetInfo(ret, 'virtual') + '-' + GetInfo( ret, 'virtual_subtype') else: virtual = GetInfo(ret, 'virtual') info['virtual'] = virtual mem = GetInfo(ret, 'mem_total') if mem > 1000: mem = int(mem) / 1000.0 memory = ('%.1f' % mem) + 'G' else: memory = str(mem) + 'M' info['memory'] = memory return info
def salt_key_manage(request, hostname=None): ''' 接受或拒绝salt主机,同时更新数据库 ''' if request.user.is_superuser: if request.method == 'GET': sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) hostname = request.GET.get('hostname') salthost = SaltHost.objects.get(hostname=hostname) action = '' if request.GET.has_key('add'): ret = sapi.accept_key(hostname) if ret: salthost.status = True salthost.save() action = u'添加主机' if request.GET.has_key('delete'): ret = sapi.delete_key(hostname) if ret: salthost.status = False salthost.save() action = u'删除主机' if request.GET.has_key('flush'): ret = sapi.salt_alive(hostname) try: alive = ret[hostname] alive = True except: alive = False salthost.alive = alive salthost.save() action = u'刷新主机' if action: Message.objects.create(type=u'部署管理', user=request.user, action=action, action_ip=UserIP(request), content=u'%s %s' % (action, salthost.hostname)) return redirect('key_list') else: raise Http404
def get_server_asset_info(tgt): ''' Salt API得到资产信息,进行格式化输出 ''' global asset_info info = [] sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_noarg_execution(tgt,'grains.items') manufacturer = ret['manufacturer'] info.append(manufacturer) productname = ret['productname'] info.append(productname) serialnumber = ret['serialnumber'] info.append(serialnumber) cpu_model = ret['cpu_model'] info.append(cpu_model) num_cpus = int(ret['num_cpus']) info.append(num_cpus) num_gpus = int(ret['num_gpus']) info.append(num_gpus) mem_total = str(round(int(ret['mem_total'])/1024.0,))[:-2] + 'G' info.append(mem_total) #disk_size = ret['disk_size'] disk_size = 10 info.append(disk_size) #raidlevel = ret['raidlevel'] raidlevel = 5 info.append(raidlevel) id = ret['id'] info.append(id) #lan_ip = ret['lan_ip'][0] lan_ip = ret['fqdn_ip4'] info.append(lan_ip) #lan_mac = ret['hwaddr_interfaces'][0] lan_mac = 'mac' info.append(lan_mac) sys_ver = ret['os'] + ret['osrelease'] + '-' + ret['osarch'] info.append(sys_ver) virtual = ret['virtual'] info.append(virtual) #idc_name = ret['idc_name'] idc_name = 'testidc' info.append(idc_name) asset_info.append(info)
def salt_accept_key(request): """ accept salt minions key """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] user = request.user node_name = request.GET.get('node_name') what = request.GET.get('what') sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) if what == "accept": ret = sapi.accept_key(node_name) HostList.objects.create(hostname=node_name) if what == "reject": ret = sapi.reject_key(node_name) Message.objects.create(type='salt-key', action=what, action_ip=ip, username=user,content='saltstack accept %s key'%(node_name)) return HttpResponseRedirect(reverse('key_list'))
def salt_delete_key(request): """ delete salt minions key """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] user = request.user node_name = request.GET.get('node_name') sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.delete_key(node_name) id_list = HostList.objects.filter(hostname=node_name) if id_list: for i in id_list: host_list = get_object_or_404(HostList, pk=i.id) host_list.delete() Message.objects.create(type='hostlist', action='delete', action_ip=ip, username=user,content='delete %s' %(node_name)) Message.objects.create(type='salt-key', action='delete', action_ip=ip, username=user, content='delete %s salt-key' %(node_name)) return HttpResponseRedirect(reverse('key_list'))
def autoget_host_info(tgt): ''' Salt API得到资产信息,进行格式化输出 ''' global host_info info = {} grains_ret = False #ver_info = [] sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) try: ret = sapi.remote_noarg_execution(tgt, 'test.ping') except Exception as e: ret = False if ret: try: grains_ret = sapi.remote_noarg_execution(tgt, 'grains.items') except Exception as e: grains_ret = False if grains_ret: info['ip'] = grains_ret['ip'].split('/')[0] info['version'] = grains_ret['saltversioninfo'] info['cpu_model'] = grains_ret['cpu_model'] info['mem'] = grains_ret['mem_total'] info['os_ver'] = grains_ret['os'] + '_' + grains_ret[ 'osrelease'] + '_' + grains_ret['osarch'] info['manufacturer'] = grains_ret['manufacturer'] info['productname'] = grains_ret['productname'] else: info['ip'] = '' info['version'] = '' info['cpu_model'] = '' info['mem'] = '' info['os_ver'] = '' info['manufacturer'] = '' info['productname'] = '' info['hostname'] = tgt info['status'] = ret host_info[info['hostname']] = info
def salt_key_import(request): ''' 导入salt主机 ''' if request.user.is_superuser: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) minions, minions_pre = sapi.list_all_key() alive = False ret_alive = sapi.salt_alive('*') for node_name in minions: try: alive = ret_alive[node_name] alive = True except: alive = False try: SaltHost.objects.create(hostname=node_name, alive=alive, status=True) except: salthost = SaltHost.objects.get(hostname=node_name) now = datetime.datetime.now() alive_old = SaltHost.objects.get(hostname=node_name).alive if alive != alive_old: salthost.alive_time_last = now salthost.alive = alive salthost.alive_time_now = now salthost.save() for node_name in minions_pre: try: SaltHost.objects.get_or_create(hostname=node_name, alive=alive, status=False) except: print 'not create' return redirect('key_list') else: raise Http404
def module_deploy(request): """ deploy (nginx/php/mysql..etc) module """ ret = [] jid = [] user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'deploy': tgt = request.POST.get('tgt') arg = request.POST.getlist('module') tgtcheck = HostList.objects.filter(hostname=tgt) if tgtcheck: Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg)) sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) if 'sysinit' in arg: obj = sapi.async_deploy(tgt,arg[-1]) #先执行初始化模块,其他任意 jid.append(obj) arg.remove('sysinit') if arg: for i in arg: obj = sapi.async_deploy(tgt,i) jid.append(obj) else: for i in arg: obj = sapi.async_deploy(tgt,i) jid.append(obj) db = db_operate() for i in jid: time.sleep(10) sql = 'select returns from salt_returns where jid=%s' result=db.select_table(settings.RETURNS_MYSQL,sql,str(i)) #通过jid获取执行结果 ret.append(result) #sapi.async_deploy('test-01','zabbix.api') #调用zabbix.api执行模块监控 else: ret = '亲,目标主机不对,请重新输入' return render_to_response('salt_module_deploy.html', {'ret': ret},context_instance=RequestContext(request))
def deploy_init_status(request): """ List all waiting for the host operating system is installed """ user = request.user if request.META.has_key('HTTP_X_FORWARDED_FOR'): userip = request.META['HTTP_X_FORWARDED_FOR'] else: userip = request.META['REMOTE_ADDR'] #获取待初始化的信息,从数据库中查询是否存在,未存在的插入到列表 all_system_list = SystemInstall.objects.filter(status='99') sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) minions = sapi.list_all_key() for tgt in all_system_list: if tgt.hostname not in minions[0]: sapi.accept_key(tgt.hostname) Message.objects.create(type='salt', action='initkey', action_ip=userip, username=user, content='%s accept key' % (tgt.hostname)) if tgt.hostname in sapi.list_all_key()[0]: ret = HostList.objects.filter(hostname=tgt.hostname) if ret: print "already in database" #SystemInstall.objects.filter(hostname=h).delete() Message.objects.create(type='sql', action='init', action_ip=tgt.hostname, username=user, content='已经存在') else: HostList.objects.create(hostname=tgt.hostname) #SystemInstall.objects.filter(hostname=h).delete() #安装后,装机列表此IP信息删除,转让到安装记录里供审计 #Message.objects.create(type='sql', action='add', action_ip=tgt.hostname, username=user, content='添加主机') Message.objects.create(type='asstes', action='create', action_ip=userip, username=user, content='add %s in hostlist' % (tgt.hostname)) paginator = Paginator(all_system_list,15) try: page = int(request.GET.get('page','1')) except ValueError: page = 1 try: all_system_list = paginator.page(page) except : all_system_list = paginator.page(paginator.num_pages) return render_to_response('deploy_init_status.html', {'all_system_list': all_system_list, 'page': page, 'paginator':paginator,'request':request},context_instance=RequestContext(request))
def autoget_host_info(tgt): ''' Salt API得到资产信息,进行格式化输出 ''' global host_info info = {} grains_ret = False #ver_info = [] sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) try: ret = sapi.remote_noarg_execution(tgt,'test.ping') except Exception as e: ret = False if ret: try: grains_ret = sapi.remote_noarg_execution(tgt,'grains.items') except Exception as e: grains_ret = False if grains_ret: info['ip'] = grains_ret['ip'].split('/')[0] info['version'] = grains_ret['saltversioninfo'] info['cpu_model'] = grains_ret['cpu_model'] info['mem'] = grains_ret['mem_total'] info['os_ver'] = grains_ret['os']+'_'+grains_ret['osrelease']+'_'+grains_ret['osarch'] info['manufacturer'] = grains_ret['manufacturer'] info['productname'] = grains_ret['productname'] else: info['ip'] = '' info['version'] = '' info['cpu_model'] = '' info['mem'] = '' info['os_ver'] = '' info['manufacturer'] = '' info['productname'] = '' info['hostname'] = tgt info['status'] = ret host_info[info['hostname']] = info
def code_deploy(request): """ Pull code for building, pushed to the server """ ret = '' host = {'ga': 'test-01', 'beta': 'localhost.localdomain'} user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'push': pro = request.POST.get('project') url = request.POST.get('url') ver = request.POST.get('version') env = request.POST.get('env') capi = Code_Work(pro=pro, url=url, ver=ver) data = {pro: {'ver': ver}} obj = capi.work() #构建rpm包 if obj['comment'][0]['result'] and obj['comment'][1][ 'result'] and obj['comment'][2]['result']: json_api = BuildJson() json_api.build_data(host[env], data) #刷新pillar数据,通过deploy下发SLS执行代码发布 sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) if env == 'beta': jid = sapi.target_deploy('beta', 'deploy.' + pro) elif env == 'ga': jid = sapi.target_deploy('tg', 'deploy.' + pro) else: jid = sapi.target_deploy('beta', 'deploy.' + pro) time.sleep(8) db = db_operate() sql = 'select returns from salt_returns where jid=%s' ret = db.select_table(settings.RETURNS_MYSQL, sql, str(jid)) #通过jid获取执行结果 return render_to_response('code_deploy.html', {'ret': ret}, context_instance=RequestContext(request))
def remote_execution(request): """ remote command execution """ ret = '' tgtcheck = '' danger = ('rm','reboot','init ','shutdown') user = request.user if request.method == 'POST': action = request.get_full_path().split('=')[1] if action == 'exec': if request.POST.has_key('Dstart'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh start datanode' elif request.POST.has_key('Dstop'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh stop datanode' elif request.POST.has_key('Dstatus'): arg = 'sudo -u hadoop -s -H /home/hadoop/java/bin/jps' elif request.POST.has_key('Tstart'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh start tasktracker' elif request.POST.has_key('Tstop'): arg = 'sudo -u hadoop -s -H /home/hadoop/hadoop/bin/hadoop-daemon.sh stop tasktracker' elif request.POST.has_key('Tstatus'): arg = 'sudo -u hadoop -s -H /home/hadoop/java/bin/jps' tgt = request.POST.get('tgt') tgtcheck = HostList_yz1.objects.filter(ip=tgt) argcheck = arg.split()[0] not in danger if tgtcheck and argcheck: sapi = SaltAPI(url=settings_local.SALT_API['url'],username=settings_local.SALT_API['user'],password=settings_local.SALT_API['password']) ret = sapi.remote_execution(tgt,'cmd.run',arg) elif not tgtcheck: ret = '亲,目标主机不正确,请重新输入' elif not argcheck: ret = '亲,命令很危险, 你这样子老大会不开森' Message.objects.create(type='salt', action='execution', action_ip=tgt, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret': ret},context_instance=RequestContext(request))
def salt_key_list(request): """ list all key """ user = request.user sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) minions, minions_pre, minions_rej = sapi.list_all_key() minions_count = len(minions) minions_pre_count = len(minions_pre) minions_rej_count = len(minions_rej) return render_to_response( 'salt_key_list.html', { 'all_minions': minions, 'all_minions_pre': minions_pre, 'all_minions_rej': minions_rej, 'minions_count': minions_count, 'minions_pre_count': minions_pre_count, 'minions_rej_count': minions_rej_count, 'request': request })
def remote_execution(request): """ remote command execution """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] tgtcheck = '' ret_cmd_msg = [] hosts = [] node = '' danger = ('rm','reboot','init ','shutdown') user = request.user ret_err = '' ret = 'none' tgt = 'none' hostlists = HostList.objects.all() if request.method == 'POST': action = request.POST.get('action') tgt = request.POST.getlist('tgt') arg = request.POST.get('arg') if action != '' and len(tgt) != 0 and arg !='': if action == 'exec':#远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_execution(node,'cmd.run',arg) cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+str(ret) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt-run', action='cmd_run', action_ip=ip, username=user, content='%s cmd.run %s' % (node,arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' if action == 'grains':#远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: ret_str_msg = "" argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_execution(node,'grains.item',arg) if type(ret[arg]) == dict: for k, v in ret[arg].items(): ret_str_msg = str(k)+": "+ str(v)+"\n"+ret_str_msg cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+ret_str_msg else: cmd_msg="\n"+str(node)+":\n"+"="*24+"\n"+str(ret[arg]) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt', action='grains', action_ip=ip, username=user, content='%s grains.item %s' % (node,arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' elif len(tgt) == 0: ret_err = "目标主机不能为空" elif arg == '': ret_err = "命令不能为空" #Message.objects.create(type='salt', action='execution', action_ip=ip, username=user, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', {'ret':ret,'ret_err': ret_err,'ret_cmd_msg':ret_cmd_msg,'hostlists':hostlists,'request':request},context_instance=RequestContext(request))
def salt_group_manage(request, id=None): ''' salt主机分组管理,同时更新salt-master配置文件 ''' action = '' page_name = '' if id: group = get_object_or_404(SaltGroup, pk=id) action = 'edit' page_name = '编辑分组' else: group = SaltGroup() action = 'add' page_name = '新增分组' if request.method == 'GET': if request.GET.has_key('delete'): id = request.GET.get('id') group = get_object_or_404(SaltGroup, pk=id) group.delete() Message.objects.create(type=u'部署管理', user=request.user, action=u'删除分组', action_ip=UserIP(request), content='删除分组 %s' % group.nickname) with open('./saltconfig/nodegroup.conf', 'r') as f: with open('./nodegroup', 'w') as g: for line in f.readlines(): if group.groupname not in line: g.write(line) shutil.move('./nodegroup', './saltconfig/nodegroup.conf') return redirect('group_list') if request.method == 'POST': form = SaltGroupForm(request.POST, instance=group) if form.is_valid(): minions = request.POST.getlist('minions') # 前台分组以别名显示,组名不变 if action == 'add': group = form.save(commit=False) group.groupname = form.cleaned_data['nickname'] else: try: group.minions.clear() except: pass form.save group.save() for m in minions: group.minions.add(m) Message.objects.create(type=u'部署管理', user=request.user, action=page_name, action_ip=UserIP(request), content='%s %s' % (page_name, group.nickname)) minions_l = [] for m in group.minions.values('hostname'): minions_l.append(m['hostname']) minions_str = ','.join(minions_l) try: with open('./saltconfig/nodegroup.conf', 'r') as f: with open('./nodegroup', 'w') as g: for line in f.readlines(): if group.groupname not in line: g.write(line) g.write(" %s: 'L@%s'\n" % (group.groupname, minions_str)) shutil.move('./nodegroup', './saltconfig/nodegroup.conf') except: with open('./saltconfig/nodegroup.conf', 'w') as g: g.write("nodegroups:\n %s: 'L@%s'\n" % (group.groupname, minions_str)) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) jid = sapi.local_run('cmd.run', 'systemctl restart salt-api') return redirect('group_list') else: form = SaltGroupForm(instance=group) return render(request, 'salt_group_manage.html', { 'form': form, 'action': action, 'page_name': page_name })
# Import salt modules import salt.config import salt.utils.event from lion import settings # Import third party libs import MySQLdb from deploy.saltapi import SaltAPI # Create MySQL connect conn = MySQLdb.connect(host="localhost", user="******", passwd="chenpiao", db="salt") cursor = conn.cursor() sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) node_name = [] cpu_mode = [] items = sapi.remote_noarg_execution('Django','grains.items') CPU = items.get('cpu_model','none') HOSTNAME = items.get('host','none') MAC = items.get('hwaddr_interfaces','none').get('eth0','none') IP = items.get('ip4_interfaces','none').get('eth0','none')[0] OS = items.get('osfullname','none') + '_' + items.get('osrelease','none') + '_' + items.get('osarch','none') MEM = items.get('mem_total','none') sql = "insert ignore into info(host,ip_addr,cpu_mode,mem_total,os,mac) values(%s,%s,%s,%s,%s,%s)" param = (HOSTNAME,IP,CPU,MEM,OS,MAC) n = cursor.execute(sql,param) print 'insert',n conn.commit()
def UploadFile(request, form, group=False): ''' 定义文件上传函数 ''' danger = [] check = False is_group = False rst = '' ret = '' jid = '' fileupload = FileUpload() if request.method == 'POST': form = SaltFileForm(request.POST, request.FILES, instance=fileupload) remote_path = request.POST.get('remote_path') for i in UserDirectory.objects.filter(name='ENGINEDEV_PATH'): danger = i.directory.split(',') if len(danger) == 0: danger = ['/etc', '/boot'] if remote_path not in danger or request.user.is_superuser: if form.is_valid and request.is_ajax(): cur_name = request.FILES['file_path'].name if request.POST.get('check_type') == 'panel-group': grp = request.POST.get('tgt_select') tgt_list = SaltGroup.objects.get(nickname=grp).groupname expr_form = 'nodegroup' is_group = True tgt_select = [tgt_list] else: tgt_select = request.POST.getlist('tgt_select') tgt_list = ','.join(tgt_select) expr_form = 'list' for tgt in tgt_select: fileupload = form.save(commit=False) fileupload.user = request.user fileupload.target = tgt fileupload.file_tag = '%s-%s-%s' % ( cur_name, request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S')) fileupload.save() # 替换路径为<salt://>形式,详细可查看salt上传文件命令 local_path = str(fileupload.file_path).replace( 'salt/fileupload', 'salt://fileupload') remote_path = '%s/%s' % (fileupload.remote_path, cur_name) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) # 备份远程文件 ret_bak = sapi.file_bak(tgt_list, 'cp.push', remote_path, expr_form) # 上传文件到远程 ret = sapi.file_copy(tgt_list, 'cp.get_file', local_path, remote_path, expr_form) # 分组上传文件时,只需从其中一台salt主机备份文件,备份完成后设置group_forloop为false group_forloop = True for k in ret: if request.POST.get('check_type') == 'panel-group': bakup_path = './media/salt/filebakup/user_%s/%s' % ( request.user.id, tgt_list) else: bakup_path = './media/salt/filebakup/user_%s/%s' % ( request.user.id, k) if not os.path.exists( '%s%s' % (bakup_path, fileupload.remote_path)): os.makedirs('%s%s' % (bakup_path, fileupload.remote_path)) if ret[k]: rst = rst + u'主机:' + k + '\n上传结果:\n' + ret[k] + '\n' if ret_bak[k]: bak_file = '%s%s/%s' % (bakup_path, fileupload.remote_path, fileupload.file_tag) # 替换路径为<salt://>形式,以便文件回滚 bak_path = bak_file.replace( './media/salt', 'salt:/') if request.POST.get( 'check_type' ) == 'panel-group' and group_forloop: shutil.copy( '/var/cache/salt/master/minions/%s/files/%s' % (k, remote_path), bak_file) try: FileRollback.objects.get_or_create( user=request.user, target=tgt_list, cur_path=remote_path, bak_path=bak_path, file_tag=fileupload.file_tag, remark=fileupload.remark, is_group=True) except: print 'not create' group_forloop = False else: try: shutil.copy( '/var/cache/salt/master/minions/%s/files/%s' % (k, remote_path), bak_file) except: print 'No such file or dirctory' try: FileRollback.objects.get_or_create( user=request.user, target=k, cur_path=remote_path, bak_path=bak_path, file_tag=fileupload.file_tag, remark=fileupload.remark) except: print 'not create' rst = rst + u'远程文件%s备份成功...' % remote_path + '\n' + '-' * 80 + '\n' else: rst = rst + u'远程文件%s不存在,备份失败...' % remote_path + '\n' + '-' * 80 + '\n' else: rst = rst + u'主机:' + k + '\n上传结果:\n失败\n' + '-' * 80 + '\n' else: rst = u'无权限更改此目录' return {'ret': rst, 'check': check, 'is_group': is_group}
def RemoteExec(request, fun, group=False): ''' 定义远程命令函数 ''' danger = [] for i in UserCommand.objects.filter(name='ENGINEDEV'): danger = i.command.split(',') if len(danger) == 0: danger = ['reboot', 'shutdown'] check = False is_group = False ret = '' jid = '' arg = '' if request.method == 'POST': if request.is_ajax(): if request.POST.get('check_type') == 'panel-group': grp = request.POST.get('tgt_select') tgt_list = SaltGroup.objects.get(nickname=grp).groupname expr_form = 'nodegroup' is_group = True else: tgt_select = request.POST.getlist('tgt_select[]') if not tgt_select: tgt_list = request.POST.get('tgt_select') else: tgt_list = ','.join(tgt_select) expr_form = 'list' if fun == 'cmd.run': arg = request.POST.get('arg') else: arg = request.POST.get('module_list') arg = 'module.user_%s.%s' % (request.user.id, arg) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) if arg not in danger or request.user.is_superuser: try: if fun == 'cmd.run': jid = sapi.remote_execution(tgt_list, fun, arg + ';echo ":::"$?', expr_form) if is_group: s = SaltGroup.objects.get(groupname=tgt_list) s_len = s.minions.all().count() else: s = tgt_list.split(',') s_len = len(s) rst = {} while (len(rst) < s_len): rst = sapi.salt_runner(jid) #time.sleep(1) for k in rst: ret = ret + u'主机:' + k + '\n运行结果:\n%s\n' % rst[k] r = rst[k].split(':::')[-1].strip() if r != '0': ret = ret + '%s 执行失败!\n' % arg + '-' * 80 + '\n' else: ret = ret + '%s 执行成功!\n' % arg + '-' * 80 + '\n' else: jid = sapi.remote_execution(tgt_list, fun, arg, expr_form) rst = sapi.salt_runner(jid) rst = ret['data'] rst_all = '' for k in rst: r_str = '' for k1 in rst[k]: if 'cmd_' in k1: v1 = rst[k][k1] if v1['result']: result = u'成功' else: result = u'失败' try: stderr = v1['changes']['stderr'] except: stderr = '' v_str = u'运行结果:' + result + u'\n错误:' + stderr + u'\n内容:' + v1[ 'comment'] + u'\n命令:' + v1[ 'name'] + u'\n开始时间:' + v1[ 'start_time'] + u'\n耗时:' + str( v1['duration']) + '\n' r_str = u'主机:' + k + '\n' + v_str + '-' * 80 + '\n' rst_all = rst_all + r_str ret = rst_all except: pass if not arg or not tgt_list: ret = u'未选择主机或未输入命令...' if ret: ret = ret + '\nJobs NO. %s' % jid else: check = True ret = u'命令执行中,请稍候查询结果...\nJobs NO. %s' % jid else: ret = u'无权限执行此命令!' return { 'ret': ret, 'arg': arg, 'jid': jid, 'check': check, 'is_group': is_group }
def deploy_init_status(request): """ List all waiting for the host operating system is installed """ user = request.user if request.META.has_key('HTTP_X_FORWARDED_FOR'): userip = request.META['HTTP_X_FORWARDED_FOR'] else: userip = request.META['REMOTE_ADDR'] #获取待初始化的信息,从数据库中查询是否存在,未存在的插入到列表 all_system_list = SystemInstall.objects.filter(status='99') sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) minions = sapi.list_all_key() for tgt in all_system_list: if tgt.hostname not in minions[0]: sapi.accept_key(tgt.hostname) Message.objects.create(type='salt', action='initkey', action_ip=userip, username=user, content='%s accept key' % (tgt.hostname)) if tgt.hostname in sapi.list_all_key()[0]: ret = HostList.objects.filter(hostname=tgt.hostname) if ret: print "already in database" #SystemInstall.objects.filter(hostname=h).delete() Message.objects.create(type='sql', action='init', action_ip=tgt.hostname, username=user, content='已经存在') else: HostList.objects.create(hostname=tgt.hostname) #SystemInstall.objects.filter(hostname=h).delete() #安装后,装机列表此IP信息删除,转让到安装记录里供审计 #Message.objects.create(type='sql', action='add', action_ip=tgt.hostname, username=user, content='添加主机') Message.objects.create(type='asstes', action='create', action_ip=userip, username=user, content='add %s in hostlist' % (tgt.hostname)) paginator = Paginator(all_system_list, 15) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: all_system_list = paginator.page(page) except: all_system_list = paginator.page(paginator.num_pages) return render_to_response('deploy_init_status.html', { 'all_system_list': all_system_list, 'page': page, 'paginator': paginator, 'request': request }, context_instance=RequestContext(request))
def salt_ajax_file_rollback(request): ''' 执行文件回滚 ''' true = True if request.method == 'POST': if request.is_ajax(): r_list = [] if request.POST.get('check_type') == 'rollback_file': if request.POST.get('get_type') == 'panel-group': grp = request.POST.get('tgt_select') tgt_select = SaltGroup.objects.get(nickname=grp).groupname else: tgt_select = request.POST.get('tgt_select') rollback_list = FileRollback.objects.filter(target=tgt_select) r_list = [] for r in rollback_list: r_list.append(r.cur_path) func = lambda x, y: x if y in x else x + [y] r_list = reduce(func, [ [], ] + r_list) return HttpResponse(json.dumps(r_list)) if request.POST.get('check_type') == 'rollback_history_list': if request.POST.get('get_type') == 'panel-group': grp = request.POST.get('tgt_select') tgt_select = SaltGroup.objects.get(nickname=grp).groupname else: tgt_select = request.POST.get('tgt_select') cur_path = request.POST.get('rollback_list', None) rollback_history_list = FileRollback.objects.filter( cur_path=cur_path).filter(target=tgt_select) for r in rollback_history_list: r_list.append(r.bak_path) return HttpResponse(json.dumps(r_list)) if request.POST.get('check_type') == 'rollback_history_remark': if request.POST.get('get_type') == 'panel-group': grp = request.POST.get('tgt_select') tgt_select = SaltGroup.objects.get(nickname=grp).groupname else: tgt_select = request.POST.get('tgt_select') bak_path = request.POST.get('rollback_remark', None) rollback_history_remark = FileRollback.objects.filter( bak_path=bak_path).filter(target=tgt_select) for r in rollback_history_remark: r_list.append(r.remark) return HttpResponse(json.dumps(r_list)) else: if request.POST.get('check_type') == 'panel-group': grp = request.POST.get('tgt_select') tgt_select = SaltGroup.objects.get(nickname=grp).groupname expr_form = 'nodegroup' else: tgt_select = request.POST.get('tgt_select') expr_form = 'list' remote_path = request.POST.get('remote_path') history_version = request.POST.get('history_version') sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.file_copy(tgt_select, 'cp.get_file', history_version, remote_path, expr_form) rst = '' for k in ret: rst = rst + u'主机:' + k + '\n回滚结果:\n' + ret[ k] + '\n' + '-' * 80 + '\n' Message.objects.create(type=u'文件管理', user=request.user, action=u'文件回滚', action_ip=UserIP(request), content=u'文件回滚 %s' % rst) return HttpResponse(json.dumps(rst))
def GetAssetInfo(tgt): ''' Salt API获取主机信息并进行格式化输出 ''' global asset_info info = {} sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_server_info(tgt, 'grains.items') info['sn'] = GetInfo(ret, 'serialnumber') info['hostname'] = GetInfo(ret, 'fqdn') info['nodename'] = tgt info['os'] = GetInfo(ret, 'os') + GetInfo( ret, 'osrelease') + ' ' + GetInfo(ret, 'osarch') info['manufacturer'] = GetInfo(ret, 'manufacturer') info['cpu_model'] = GetInfo(ret, 'cpu_model') info['productname'] = GetInfo(ret, 'productname') info['cpu_nums'] = GetInfo(ret, 'num_cpus') info['disk'] = str(DISKINFO[0]) + "GB" info['network'] = GetInfo(ret, 'PublicIp') info['kernel'] = GetInfo(ret, 'kernel') + GetInfo(ret, 'kernelrelease') info['zmqversion'] = GetInfo(ret, 'zmqversion') info['shell'] = GetInfo(ret, 'shell') info['saltversion'] = GetInfo(ret, 'saltversion') info['locale'] = GetInfoDict(ret, 'locale_info') info['selinux'] = GetInfoDict(ret, 'selinux') info['networkarea'] = GetInfo(ret, 'netRegion') if 'virtual_subtype' in ret: virtual = GetInfo(ret, 'virtual') + '-' + GetInfo( ret, 'virtual_subtype') else: virtual = GetInfo(ret, 'virtual') info['virtual'] = virtual # try: # hwaddr = ret['hwaddr_interfaces'] # ipaddr = ret['ip4_interfaces'] # hwaddr.pop('lo') # ipaddr.pop('lo') # network = '' # for i in ipaddr: # ip = '' # for j in ipaddr[i]: # ip = ip + j + '/' # network = network + i + ': ' + ip.strip('/') + '-' + hwaddr[i] + '\n' # info['network'] = network # except: # info['network'] = 'Nan' # mem = GetInfo(ret, 'mem_total') if mem > 1000: mem = int(mem) / 1000.0 memory = ('%.1f' % mem) + 'G' else: memory = str(mem) + 'M' info['memory'] = memory # ret = sapi.remote_server_info(tgt, 'disk.usage') # disk = '' # for i in ret: # r = int(ret[i]['1K-blocks'])/1000 # if r > 1000: # r = r/1000 # s = str(r) + 'G' # if r > 1000: # r = r/1000.0 # s = ('%.1f'%r) + 'T' # else: # s = str(r) + 'M' # disk = disk + i + ': ' + s + '\n' # info['disk'] = disk asset_info.append(info)
def module_deploy(request): ret = [] ret_err = '' jid = [] if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] user = request.user hostlists = HostList.objects.all() if request.method == 'POST': action = request.get_full_path().split('=')[1] tgt = request.POST.getlist('tgt') if len(tgt) == 0: ret_err = "目标主机不能为空" else: ret_err ="" if action == 'deploy': arg = request.POST.getlist('module') #Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg)) sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) for host in tgt: if 'sysinit' in arg: obj = sapi.async_deploy(host,arg[-1]) #先执行初始化模块,其他任意 jid.append(obj) joblist.objects.create(fun='sysinit',tgt=host,status='2',jid=obj) Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s sysinit_jid %s' % (host,obj)) arg.remove('sysinit') if arg: for i in arg: obj = sapi.async_deploy(host,i) jid.append(obj) joblist.objects.create (fun=i,tgt=host,status='2',jid=obj) Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj)) else: if arg: for i in arg: obj = sapi.async_deploy(host,i) jid.append(obj) joblist.objects.create (fun=i,tgt=host,status='2',jid=obj) Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj)) #return HttpResponseRedirect(reverse('job_list')) elif action == 'sysinit': #tgt = request.POST.getlist('tgt') arg = 'sysinit' #tgtcheck = HostList.objects.filter(hostname=tgt) sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) for h in tgt: #Message.objects.create(type='salt-module', action='os_init', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj)) sapi.accept_key(h) #sapi.remote_noarg_execution(h,'test.ping') install_ret = SystemInstall.objects.filter(hostname=h) for each_ret in install_ret: sroom_id = each_ret.sroom_id if sroom_id: arg = "sysinit_"+str(sroom_id) obj = sapi.async_deploy(h,arg) SystemInstall.objects.filter(hostname=h).delete() #安装后,装机列表此IP信息删除,转让到安装记录里供审计 Message.objects.create(type='installed', action='os_init', action_ip=ip, username=user, content='%s acceptkey_%s_del_sysinstall' % (h,arg)) #Message.objects.create(type='salt', action=arg, action_ip=h, content='已经初始化') #time.sleep(5) #obj = sapi.async_deploy(h,arg) #先执行初始化模块,其他任意 #jid.append(obj) joblist.objects.create (fun=arg,tgt=h,status='2',jid=obj) return HttpResponseRedirect(reverse('job_list')) return render_to_response('salt_module_deploy.html',{'ret': ret,'hostlists': hostlists,'ret_err':ret_err,'jid':jid,'request':request},context_instance=RequestContext(request))
def salt_advanced_manage(request): ret = '' if request.method == 'POST': if request.is_ajax(): tgt_selects = request.POST.getlist('tgt_select', None) args = request.POST.getlist('arg', None) checkgrp = request.POST.getlist('ifcheck', None) check_type = request.POST.get('check_type', None) if check_type == 'panel-group': expr_form = 'nodegroup' else: expr_form = 'list' s = '::'.join(str(i) for i in checkgrp) checkgrp = s.replace('0::1', '1').split('::') sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) for i in range(0, len(tgt_selects)): try: jid = sapi.remote_execution(tgt_selects[i], 'cmd.run', args[i] + ';echo ":::"$?', expr_form) if check_type == 'panel-group': s = SaltGroup.objects.get(groupname=tgt_selects[i]) s_len = s.minions.all().count() else: s = tgt_selects[i].split(',') s_len = len(s) rst = {} while (len(rst) < s_len): rst = sapi.salt_runner(jid) #time.sleep(1) j = 0 for k in rst: ret = ret + u'L%s-%s 主机:' % ( i, j) + k + '\n运行结果:\n' + rst[k] + '\n' j = j + 1 r = rst[k].split(':::')[-1].strip() if r != '0': ret = ret + '%s 执行失败!\nJobs NO. %s\n' % ( args[i], jid) + '-' * 80 + '\n' if checkgrp[i] == '0': try: Message.objects.create( type=u'部署管理', user=request.user, action=jid, action_ip=UserIP(request), content=u'高级管理 %s' % ret) except: print 'Log Err' return HttpResponse(json.dumps(ret)) else: continue else: ret = ret + '%s 执行成功!\nJobs NO. %s\n' % ( args[i], jid) + '-' * 80 + '\n' except: print 'Err' try: Message.objects.create(type=u'部署管理', user=request.user, action=jid, action_ip=UserIP(request), content=u'高级管理 %s' % ret) except: print 'Log Err' return HttpResponse(json.dumps(ret)) return render(request, 'salt_remote_exec_advance.html', {'ret': ret})
def GetAssetInfo(tgt): ''' Salt API获取主机信息并进行格式化输出 ''' global asset_info info = {} sapi = SaltAPI(url=settings.SALT_API['url'],username=settings.SALT_API['user'],password=settings.SALT_API['password']) ret = sapi.remote_server_info(tgt, 'grains.items') info['sn']=GetInfo(ret,'serialnumber') info['hostname']=GetInfo(ret,'fqdn') info['nodename']=tgt info['os']=GetInfo(ret,'os')+GetInfo(ret,'osrelease')+' '+GetInfo(ret,'osarch') info['manufacturer']=GetInfo(ret,'manufacturer') info['cpu_model']=GetInfo(ret,'cpu_model') info['productname']=GetInfo(ret,'productname') info['cpu_nums']=GetInfo(ret,'num_cpus') info['kernel'] = GetInfo(ret,'kernel') + GetInfo(ret,'kernelrelease') info['zmqversion'] = GetInfo(ret,'zmqversion') info['shell'] = GetInfo(ret,'shell') info['saltversion'] = GetInfo(ret,'saltversion') info['locale'] = GetInfoDict(ret, 'locale_info') info['selinux'] = GetInfoDict(ret, 'selinux') if 'virtual_subtype' in ret: virtual = GetInfo(ret,'virtual') + '-' + GetInfo(ret,'virtual_subtype') else: virtual=GetInfo(ret,'virtual') info['virtual'] = virtual try: hwaddr = ret['hwaddr_interfaces'] ipaddr = ret['ip4_interfaces'] hwaddr.pop('lo') ipaddr.pop('lo') network = '' for i in ipaddr: ip = '' for j in ipaddr[i]: ip = ip + j + '/' network = network + i + ': ' + ip.strip('/') + '-' + hwaddr[i] + '\n' info['network'] = network except: info['network'] = 'Nan' mem=GetInfo(ret,'mem_total') if mem > 1000: mem = int(mem)/1000.0 memory = ('%.1f'%mem) + 'G' else: memory = str(mem) + 'M' info['memory'] = memory ret = sapi.remote_server_info(tgt, 'disk.usage') disk = '' for i in ret: r = int(ret[i]['1K-blocks'])/1000 if r > 1000: r = r/1000 s = str(r) + 'G' if r > 1000: r = r/1000.0 s = ('%.1f'%r) + 'T' else: s = str(r) + 'M' disk = disk + i + ': ' + s + '\n' info['disk'] = disk asset_info.append(info)
def module_deploy(request): ret = [] ret_err = '' jid = [] if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] user = request.user hostlists = HostList.objects.all() if request.method == 'POST': action = request.get_full_path().split('=')[1] tgt = request.POST.getlist('tgt') if len(tgt) == 0: ret_err = "目标主机不能为空" else: ret_err = "" if action == 'deploy': arg = request.POST.getlist('module') #Message.objects.create(type='salt', action='deploy', action_ip=tgt, content='saltstack %s module depoy' % (arg)) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) for host in tgt: if 'sysinit' in arg: obj = sapi.async_deploy(host, arg[-1]) #先执行初始化模块,其他任意 jid.append(obj) joblist.objects.create(fun='sysinit', tgt=host, status='2', jid=obj) Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s sysinit_jid %s' % (host, obj)) arg.remove('sysinit') if arg: for i in arg: obj = sapi.async_deploy(host, i) jid.append(obj) joblist.objects.create(fun=i, tgt=host, status='2', jid=obj) Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s %s_jid %s' % (host, i, obj)) else: if arg: for i in arg: obj = sapi.async_deploy(host, i) jid.append(obj) joblist.objects.create(fun=i, tgt=host, status='2', jid=obj) Message.objects.create(type='salt-module', action='deploy', action_ip=ip, username=user, content='%s %s_jid %s' % (host, i, obj)) #return HttpResponseRedirect(reverse('job_list')) elif action == 'sysinit': #tgt = request.POST.getlist('tgt') arg = 'sysinit' #tgtcheck = HostList.objects.filter(hostname=tgt) sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) for h in tgt: #Message.objects.create(type='salt-module', action='os_init', action_ip=ip, username=user, content='%s %s_jid %s' % (host,i,obj)) sapi.accept_key(h) #sapi.remote_noarg_execution(h,'test.ping') install_ret = SystemInstall.objects.filter(hostname=h) for each_ret in install_ret: sroom_id = each_ret.sroom_id if sroom_id: arg = "sysinit_" + str(sroom_id) obj = sapi.async_deploy(h, arg) SystemInstall.objects.filter( hostname=h).delete() #安装后,装机列表此IP信息删除,转让到安装记录里供审计 Message.objects.create( type='installed', action='os_init', action_ip=ip, username=user, content='%s acceptkey_%s_del_sysinstall' % (h, arg)) #Message.objects.create(type='salt', action=arg, action_ip=h, content='已经初始化') #time.sleep(5) #obj = sapi.async_deploy(h,arg) #先执行初始化模块,其他任意 #jid.append(obj) joblist.objects.create(fun=arg, tgt=h, status='2', jid=obj) return HttpResponseRedirect(reverse('job_list')) return render_to_response('salt_module_deploy.html', { 'ret': ret, 'hostlists': hostlists, 'ret_err': ret_err, 'jid': jid, 'request': request }, context_instance=RequestContext(request))
def GetAssetInfo(tgt): ''' Salt API获取主机信息并进行格式化输出 ''' global asset_info info = {} sapi = SaltAPI() ret = sapi.remote_server_info(tgt, 'grains.items') info['sn'] = GetInfo(ret, 'serialnumber') info['hostname'] = GetInfo(ret, 'fqdn') info['nodename'] = tgt info['os'] = GetInfo(ret, 'os') + GetInfo( ret, 'osrelease') + ' ' + GetInfo(ret, 'osarch') info['manufacturer'] = GetInfo(ret, 'manufacturer') info['cpu_model'] = GetInfo(ret, 'cpu_model') info['productname'] = GetInfo(ret, 'productname') info['cpu_nums'] = GetInfo(ret, 'num_cpus') info['kernel'] = GetInfo(ret, 'kernel') + GetInfo(ret, 'kernelrelease') info['zmqversion'] = GetInfo(ret, 'zmqversion') info['shell'] = GetInfo(ret, 'shell') info['saltversion'] = GetInfo(ret, 'saltversion') info['locale'] = GetInfoDict(ret, 'locale_info') info['selinux'] = GetInfoDict(ret, 'selinux') if 'virtual_subtype' in ret: virtual = GetInfo(ret, 'virtual') + '-' + GetInfo( ret, 'virtual_subtype') else: virtual = GetInfo(ret, 'virtual') info['virtual'] = virtual try: hwaddr = ret['hwaddr_interfaces'] ipaddr = ret['ip4_interfaces'] hwaddr.pop('lo') ipaddr.pop('lo') network = '' for i in ipaddr: ip = '' for j in ipaddr[i]: ip = ip + j + '/' network = network + i + ': ' + ip.strip( '/') + '-' + hwaddr[i] + '\n' info['network'] = network except: info['network'] = 'Nan' mem = GetInfo(ret, 'mem_total') if mem > 1000: mem = int(mem) / 1000.0 memory = ('%.1f' % mem) + 'G' else: memory = str(mem) + 'M' info['memory'] = memory ret = sapi.remote_server_info(tgt, 'disk.usage') disk = '' for i in ret: r = int(ret[i]['1K-blocks']) / 1000 if r > 1000: r = r / 1000 s = str(r) + 'G' if r > 1000: r = r / 1000.0 s = ('%.1f' % r) + 'T' else: s = str(r) + 'M' disk = disk + i + ': ' + s + '\n' info['disk'] = disk asset_info.append(info)
def remote_execution(request): """ remote command execution """ if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] tgtcheck = '' ret_cmd_msg = [] hosts = [] node = '' danger = ('rm', 'reboot', 'init ', 'shutdown') user = request.user ret_err = '' ret = 'none' tgt = 'none' hostlists = HostList.objects.all() if request.method == 'POST': action = request.POST.get('action') tgt = request.POST.getlist('tgt') arg = request.POST.get('arg') if action != '' and len(tgt) != 0 and arg != '': if action == 'exec': #远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_execution(node, 'cmd.run', arg) cmd_msg = "\n" + str( node) + ":\n" + "=" * 24 + "\n" + str(ret) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt-run', action='cmd_run', action_ip=ip, username=user, content='%s cmd.run %s' % (node, arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' if action == 'grains': #远程命令执行 arg1 = arg.split()[0] print arg1 hosts = tgt for node in hosts: ret_str_msg = "" argcheck = arg1 not in danger if argcheck: sapi = SaltAPI(url=settings.SALT_API['url'], username=settings.SALT_API['user'], password=settings.SALT_API['password']) ret = sapi.remote_execution(node, 'grains.item', arg) if type(ret[arg]) == dict: for k, v in ret[arg].items(): ret_str_msg = str(k) + ": " + str( v) + "\n" + ret_str_msg cmd_msg = "\n" + str( node) + ":\n" + "=" * 24 + "\n" + ret_str_msg else: cmd_msg = "\n" + str( node) + ":\n" + "=" * 24 + "\n" + str(ret[arg]) #print node,ret[node] ret_cmd_msg.append(cmd_msg) ret_err = '' Message.objects.create(type='salt', action='grains', action_ip=ip, username=user, content='%s grains.item %s' % (node, arg)) elif not argcheck: ret_err = '命令很危险, 你这样子老大会不开森' elif len(tgt) == 0: ret_err = "目标主机不能为空" elif arg == '': ret_err = "命令不能为空" #Message.objects.create(type='salt', action='execution', action_ip=ip, username=user, content='saltstack execution command: %s ' % (arg)) return render_to_response('salt_remote_execution.html', { 'ret': ret, 'ret_err': ret_err, 'ret_cmd_msg': ret_cmd_msg, 'hostlists': hostlists, 'request': request }, context_instance=RequestContext(request))