Skip to content

Commit 4e57bec

Browse files
committed
添加资产使用详情展示
1 parent 1b9eb2b commit 4e57bec

File tree

10 files changed

+513
-138
lines changed

10 files changed

+513
-138
lines changed

assets/urls.py

+2
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@
1818
re_path(r'guacamole/(?P<pk>[0-9]+)/', views.guacamole_terminal, name='guacamole_terminal'),
1919
path(r'login_record/', views.login_record, name='login_record'),
2020
re_path(r'admin_play/(?P<pk>[0-9]+)/', views.admin_play, name='admin_play'),
21+
re_path(r'monitor/(?P<pk>[0-9]+)/', views.monitor, name='monitor'),
22+
re_path(r'get_top_data/(?P<pk>[0-9]+)/', views.get_top_data, name='get_top_data'),
2123
]

assets/views.py

+136-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import datetime
33
import json
44
import os
5+
import re
56
import xlrd
67
import xlwt
78
import logging
@@ -159,7 +160,7 @@ def server_facts(request):
159160
for data in ans.get_module_results:
160161
if module == 'setup':
161162
if 'success' in data:
162-
server_info, server_model, nks = ans.handle_setup_data(data)
163+
server_info, server_model, nks = handle_setup_data(data)
163164
Assets.objects.filter(id=server_obj.assets_id).update(
164165
asset_model=server_model
165166
)
@@ -175,7 +176,7 @@ def server_facts(request):
175176
return JsonResponse({'code': 500, 'msg': '收集失败!{}'.format(data[data.index('>>') + 1:])})
176177
elif module == 'get_mem':
177178
if 'success' in data:
178-
mem_infos = ans.handle_mem_data(data)
179+
mem_infos = handle_mem_data(data)
179180

180181
asset = Assets.objects.get(id=server_obj.assets_id)
181182
for mem_info in mem_infos:
@@ -413,3 +414,136 @@ def update_pwd(request):
413414
return JsonResponse({'code': 200, 'msg': '更新完毕!'})
414415
except Exception as e:
415416
return JsonResponse({'code': 500, 'msg': '更新失败:{}'.format(e)})
417+
418+
419+
@admin_auth
420+
def monitor(request, pk):
421+
return render(request, 'assets/monitor.html', {'pk': pk})
422+
423+
424+
@admin_auth
425+
def get_top_data(request, pk):
426+
server_obj = ServerAssets.objects.select_related('assets').get(id=pk)
427+
resource = [{"ip": server_obj.assets.asset_management_ip, "port": int(server_obj.port),
428+
"username": server_obj.username,
429+
"password": CryptPwd().decrypt_pwd(server_obj.password)}]
430+
431+
ans = ANSRunner(resource, become='yes', become_method='sudo', become_user='root')
432+
ans.run_module(host_list=[server_obj.assets.asset_management_ip], module_name='shell',
433+
module_args='export COLUMNS\=400 && top -bcn 1 && df -h -t ext3 -t ext4 -t xfs')
434+
result = ans.get_module_results[0]
435+
if 'success' in result:
436+
load, tasks, cpu, mem, swap, heads, body, disk = handle_top_data(result)
437+
return JsonResponse({'code': 200, 'data': {'load': load, 'tasks': tasks, 'cpu': cpu, 'mem': mem, 'swap': swap,
438+
'heads': heads, 'body': body, 'disk': disk}, 'msg': '收集成功!'})
439+
else:
440+
return JsonResponse({'code': 500, 'msg': '收集失败!{}'.format(result[result.index('>>') + 1:])})
441+
442+
443+
def handle_setup_data(data):
444+
"""处理setup模块数据,用于收集服务器信息功能"""
445+
server_info = {}
446+
result = json.loads(data[data.index('{'): data.rindex('}') + 1])
447+
facts = result['ansible_facts']
448+
server_info['hostname'] = facts['ansible_hostname']
449+
server_info['cpu_model'] = facts['ansible_processor'][-1]
450+
server_info['cpu_number'] = int(facts['ansible_processor_count'])
451+
server_info['vcpu_number'] = int(facts['ansible_processor_vcpus'])
452+
server_info['disk_total'], disk_size = 0, 0
453+
for k, v in facts['ansible_devices'].items():
454+
if k[0:2] in ['sd', 'hd', 'ss', 'vd']:
455+
if 'G' in v['size']:
456+
disk_size = float(v['size'][0: v['size'].rindex('G') - 1])
457+
elif 'T' in v['size']:
458+
disk_size = float(v['size'][0: v['size'].rindex('T') - 1]) * 1024
459+
server_info['disk_total'] += round(disk_size, 2)
460+
server_info['ram_total'] = round(int(facts['ansible_memtotal_mb']) / 1024)
461+
server_info['kernel'] = facts['ansible_kernel']
462+
server_info['system'] = '{} {} {}'.format(facts['ansible_distribution'],
463+
facts['ansible_distribution_version'],
464+
facts['ansible_userspace_bits'])
465+
server_model = facts['ansible_product_name']
466+
467+
# 获取网卡信息
468+
nks = []
469+
for nk in facts.keys():
470+
networkcard_facts = {}
471+
if re.match(r"^ansible_(eth|bind|eno|ens|em)\d+?", nk):
472+
networkcard_facts['network_card_name'] = facts.get(nk).get('device')
473+
networkcard_facts['network_card_mac'] = facts.get(nk).get('macaddress')
474+
networkcard_facts['network_card_ip'] = facts.get(nk).get('ipv4').get('address') if 'ipv4' in facts.get(
475+
nk) else 'unknown'
476+
networkcard_facts['network_card_model'] = facts.get(nk).get('type')
477+
networkcard_facts['network_card_mtu'] = facts.get(nk).get('mtu')
478+
networkcard_facts['network_card_status'] = 1 if facts.get(nk).get('active') else 0
479+
nks.append(networkcard_facts)
480+
return server_info, server_model, nks
481+
482+
483+
def handle_mem_data(data):
484+
"""
485+
处理获取的内存信息
486+
:param data: 通过ansible获取的内存信息
487+
:return:
488+
"""
489+
result = json.loads(data[data.index('{'): data.rindex('}') + 1])
490+
facts = result['ansible_facts']
491+
return facts['mem_info']
492+
493+
494+
def handle_top_data(data):
495+
"""
496+
处理获取的top命令信息
497+
:param data: 通过ansible获取的top命令信息
498+
:return:
499+
"""
500+
result = data[data.index('top'): data.index('</code>')]
501+
r = [i for i in result.split('\n') if len(i) > 0]
502+
503+
load = [i.strip() for i in r[0].split('load average:')[1].split(',')]
504+
505+
t = r[1].split(':')[1]
506+
tasks = ((n for n in m.split()) for m in t.split(','))
507+
tasks = dict((y, x) for x, y in tasks)
508+
509+
c = r[2].split(':')[1]
510+
cpu = ((n for n in m.replace('%', ' ').split()) for m in c.split(','))
511+
cpu = dict((y, x) for x, y in cpu)
512+
513+
m = r[3].split(':')[1]
514+
mem = ((n for n in re.sub('k', '', i).split()) for i in m.split(','))
515+
mem = dict((y, x) for x, y in mem)
516+
517+
s = re.sub('avail Mem', 'availableMem', r[4].split(':')[1])
518+
swap = ((n for n in re.sub('k', '', i).split()) for i in re.sub(r'\.', ',', s).split(','))
519+
swap = dict((y, x) for x, y in swap)
520+
521+
heads = None
522+
for i in r:
523+
if i.lstrip().startswith('P'):
524+
heads = [h for h in i.split()]
525+
break
526+
527+
p = [d.strip() for d in r if d.lstrip()[0].isdigit() and d.rstrip()[-1] != ']']
528+
body = [[n for n in x.split()[:len(heads) - 1] + [' '.join(x.split()[len(heads) - 1:])]] for x in p]
529+
530+
d = [i for i in r if i.lstrip().startswith('/') and 'boot' not in i]
531+
disk = [['disk', '总容量', '已用', '可用']]
532+
for i in d:
533+
# disk = [f'{i.split()[0]}({(i.split()[-1])})'].extend(i.split()[1:-2])
534+
temp = [format_size(n) for n in i.split()[1:-2]]
535+
temp.insert(0, f'{i.split()[0]}({(i.split()[-1])})')
536+
disk.append(temp)
537+
538+
return load, tasks, cpu, mem, swap, heads, body, disk
539+
540+
541+
def format_size(size):
542+
if size.endswith('M'):
543+
size = round(int(size[:-1]) / 1024, 2)
544+
elif size.endswith('T'):
545+
size = int(size[:-1]) * 1024
546+
else:
547+
size = float(size[:-1])
548+
549+
return size

logs/all.log

+6-67
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,6 @@
1-
INFO 2019-11-04 15:59:52 _log Connected (version 2.0, client OpenSSH_5.3)
2-
INFO 2019-11-04 15:59:52 _log Authentication (publickey) successful!
3-
INFO 2019-11-04 16:06:41 _log Connected (version 2.0, client OpenSSH_5.3)
4-
INFO 2019-11-04 16:06:41 _log Authentication (publickey) successful!
5-
INFO 2019-11-04 16:13:24 _log Connected (version 2.0, client OpenSSH_5.3)
6-
INFO 2019-11-04 16:13:24 _log Authentication (publickey) successful!
7-
INFO 2019-11-04 16:22:01 _log Connected (version 2.0, client OpenSSH_5.3)
8-
INFO 2019-11-04 16:22:01 _log Authentication (publickey) successful!
9-
INFO 2019-11-04 16:25:24 _log Connected (version 2.0, client OpenSSH_5.3)
10-
INFO 2019-11-04 16:25:24 _log Authentication (publickey) successful!
11-
INFO 2019-11-04 16:50:01 _log Connected (version 2.0, client OpenSSH_5.3)
12-
INFO 2019-11-04 16:50:01 _log Authentication (publickey) successful!
13-
INFO 2019-11-04 16:59:59 _log Connected (version 2.0, client OpenSSH_5.3)
14-
INFO 2019-11-04 16:59:59 _log Authentication (publickey) successful!
15-
INFO 2019-11-04 17:17:15 _log Connected (version 2.0, client OpenSSH_5.3)
16-
INFO 2019-11-04 17:17:16 _log Authentication (publickey) successful!
17-
INFO 2019-11-04 17:19:10 _log Connected (version 2.0, client OpenSSH_5.3)
18-
INFO 2019-11-04 17:19:11 _log Authentication (publickey) successful!
19-
INFO 2019-11-04 17:27:14 _log Connected (version 2.0, client OpenSSH_5.3)
20-
INFO 2019-11-04 17:27:14 _log Authentication (publickey) successful!
21-
INFO 2019-11-04 17:29:38 _log Connected (version 2.0, client OpenSSH_5.3)
22-
INFO 2019-11-04 17:29:39 _log Authentication (publickey) successful!
23-
INFO 2019-11-04 17:42:24 _log Connected (version 2.0, client OpenSSH_5.3)
24-
INFO 2019-11-04 17:42:24 _log Authentication (publickey) successful!
25-
INFO 2019-11-04 17:45:19 _log Connected (version 2.0, client OpenSSH_5.3)
26-
INFO 2019-11-04 17:45:19 _log Authentication (publickey) successful!
27-
INFO 2019-11-04 17:51:09 _log Connected (version 2.0, client OpenSSH_5.3)
28-
INFO 2019-11-04 17:51:09 _log Authentication (publickey) successful!
29-
INFO 2019-11-05 09:51:23 _log Connected (version 2.0, client OpenSSH_5.3)
30-
INFO 2019-11-05 09:51:23 _log Authentication (publickey) successful!
31-
INFO 2019-11-05 10:22:51 _log Connected (version 2.0, client OpenSSH_5.3)
32-
INFO 2019-11-05 10:22:51 _log Authentication (publickey) successful!
33-
INFO 2019-11-05 10:24:44 _log Connected (version 2.0, client OpenSSH_5.3)
34-
INFO 2019-11-05 10:24:44 _log Authentication (publickey) failed.
35-
INFO 2019-11-05 10:24:44 _log Authentication (password) successful!
36-
INFO 2019-11-05 10:36:07 _log Connected (version 2.0, client OpenSSH_5.3)
37-
INFO 2019-11-05 10:36:07 _log Authentication (publickey) successful!
38-
INFO 2019-11-05 10:40:35 _log Connected (version 2.0, client OpenSSH_5.3)
39-
INFO 2019-11-05 10:40:35 _log Authentication (publickey) failed.
40-
INFO 2019-11-05 10:40:35 _log Authentication (password) successful!
41-
INFO 2019-11-05 10:57:00 _log Connected (version 2.0, client OpenSSH_5.3)
42-
INFO 2019-11-05 10:57:01 _log Authentication (publickey) successful!
43-
INFO 2019-11-05 10:57:40 _log Connected (version 2.0, client OpenSSH_5.3)
44-
INFO 2019-11-05 10:57:40 _log Authentication (publickey) failed.
45-
INFO 2019-11-05 10:57:40 _log Authentication (password) successful!
46-
INFO 2019-11-05 11:00:22 _log Connected (version 2.0, client OpenSSH_5.3)
47-
INFO 2019-11-05 11:00:22 _log Authentication (publickey) successful!
48-
INFO 2019-11-05 11:05:55 _log Connected (version 2.0, client OpenSSH_5.3)
49-
INFO 2019-11-05 11:05:55 _log Authentication (publickey) failed.
50-
INFO 2019-11-05 11:05:55 _log Authentication (password) successful!
51-
ERROR 2019-11-05 14:25:21 run 连接超时!
52-
INFO 2019-11-05 15:09:23 _log Connected (version 2.0, client OpenSSH_7.4)
53-
INFO 2019-11-05 15:09:23 _log Authentication (publickey) successful!
54-
INFO 2019-11-05 15:14:14 _log Connected (version 2.0, client OpenSSH_7.4)
55-
INFO 2019-11-05 15:14:14 _log Authentication (publickey) successful!
56-
INFO 2019-11-05 15:14:15 _log [chan 2] Opened sftp connection (server version 3)
57-
INFO 2019-11-05 15:14:16 _log [chan 2] sftp session closed.
58-
INFO 2019-11-05 17:12:52 _log Connected (version 2.0, client OpenSSH_5.3)
59-
INFO 2019-11-05 17:12:52 _log Authentication (publickey) successful!
60-
INFO 2019-11-05 17:14:54 _log Connected (version 2.0, client OpenSSH_5.3)
61-
INFO 2019-11-05 17:14:54 _log Authentication (publickey) successful!
62-
INFO 2019-11-05 17:18:51 _log Connected (version 2.0, client OpenSSH_5.3)
63-
INFO 2019-11-05 17:18:51 _log Authentication (publickey) successful!
64-
INFO 2019-11-05 17:22:18 _log Connected (version 2.0, client OpenSSH_5.3)
65-
INFO 2019-11-05 17:22:18 _log Authentication (publickey) successful!
66-
INFO 2019-11-05 17:37:00 _log Connected (version 2.0, client OpenSSH_5.3)
67-
INFO 2019-11-05 17:37:00 _log Authentication (publickey) successful!
1+
INFO 2019-11-25 14:34:29 _log Connected (version 2.0, client OpenSSH_7.4)
2+
INFO 2019-11-25 14:34:34 _log Authentication (publickey) successful!
3+
INFO 2019-11-25 14:34:41 _log Connected (version 2.0, client OpenSSH_7.4)
4+
INFO 2019-11-25 14:34:47 _log Authentication (publickey) successful!
5+
INFO 2019-11-25 14:34:47 _log [chan 2] Opened sftp connection (server version 3)
6+
INFO 2019-11-25 14:34:48 _log [chan 2] sftp session closed.

pri.pem

-15
This file was deleted.

screenshots/monitor.png

63.1 KB
Loading

task/utils/ansible_api_v2.py

-52
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
-------------------------------------------------
1212
"""
1313
import json
14-
import re
1514
from ansible import constants as C
1615
from collections import namedtuple
1716
from ansible.parsing.dataloader import DataLoader
@@ -324,54 +323,3 @@ def get_module_results(self):
324323
@property
325324
def get_playbook_results(self):
326325
return self.callback.playbook_results
327-
328-
@staticmethod
329-
def handle_setup_data(data):
330-
"""处理setup模块数据,用于收集服务器信息功能"""
331-
server_facts = {}
332-
result = json.loads(data[data.index('{'): data.rindex('}') + 1])
333-
facts = result['ansible_facts']
334-
server_facts['hostname'] = facts['ansible_hostname']
335-
server_facts['cpu_model'] = facts['ansible_processor'][-1]
336-
server_facts['cpu_number'] = int(facts['ansible_processor_count'])
337-
server_facts['vcpu_number'] = int(facts['ansible_processor_vcpus'])
338-
server_facts['disk_total'], disk_size = 0, 0
339-
for k, v in facts['ansible_devices'].items():
340-
if k[0:2] in ['sd', 'hd', 'ss', 'vd']:
341-
if 'G' in v['size']:
342-
disk_size = float(v['size'][0: v['size'].rindex('G') - 1])
343-
elif 'T' in v['size']:
344-
disk_size = float(v['size'][0: v['size'].rindex('T') - 1]) * 1024
345-
server_facts['disk_total'] += round(disk_size, 2)
346-
server_facts['ram_total'] = round(int(facts['ansible_memtotal_mb']) / 1024)
347-
server_facts['kernel'] = facts['ansible_kernel']
348-
server_facts['system'] = '{} {} {}'.format(facts['ansible_distribution'],
349-
facts['ansible_distribution_version'],
350-
facts['ansible_userspace_bits'])
351-
server_model = facts['ansible_product_name']
352-
353-
# 获取网卡信息
354-
nks = []
355-
for nk in facts.keys():
356-
networkcard_facts = {}
357-
if re.match(r"^ansible_(eth|bind|eno|ens|em)\d+?", nk):
358-
networkcard_facts['network_card_name'] = facts.get(nk).get('device')
359-
networkcard_facts['network_card_mac'] = facts.get(nk).get('macaddress')
360-
networkcard_facts['network_card_ip'] = facts.get(nk).get('ipv4').get('address') if 'ipv4' in facts.get(
361-
nk) else 'unknown'
362-
networkcard_facts['network_card_model'] = facts.get(nk).get('type')
363-
networkcard_facts['network_card_mtu'] = facts.get(nk).get('mtu')
364-
networkcard_facts['network_card_status'] = 1 if facts.get(nk).get('active') else 0
365-
nks.append(networkcard_facts)
366-
return server_facts, server_model, nks
367-
368-
@staticmethod
369-
def handle_mem_data(data):
370-
"""
371-
处理获取的内存信息
372-
:param data: 通过ansible获取的内存信息
373-
:return:
374-
"""
375-
result = json.loads(data[data.index('{'): data.rindex('}') + 1])
376-
facts = result['ansible_facts']
377-
return facts['mem_info']

templates/assets/assets_list.html

+3
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ <h4 class="modal-title" id="myModalLabel">Excel文件批量导入资产</h4>
265265
<button type="button" class="btn btn-info btn-xs"><i
266266
class="fa fa-fw fa-terminal"></i></button>
267267
</a>
268+
<a href="{% url 'monitor' asset.serverassets.id %}" target="_blank">
269+
<button type="button" class="btn btn-warning btn-xs">监控</button>
270+
</a>
268271
{% endif %}
269272
{% endif %}
270273
<button type="button" class="btn btn-danger btn-xs delete" data-id="{{ asset.id }}">

0 commit comments

Comments
 (0)