Django SimpleCMDB 项目
创建 SimpleCMDB 项目:
[root@localhost ~]$ django-admin.py startproject SimpleCMDB
创建应用,收集主机信息:
[root@localhost ~]$ cd SimpleCMDB/
[root@localhost SimpleCMDB]$ python manage.py startapp hostinfo
修改配置:
[root@localhost SimpleCMDB]$ cat SimpleCMDB/settings.py INSTALLED_APPS = ( # 添加应用 ...... 'hostinfo', ) MIDDLEWARE_CLASSES = ( # 禁用CSRF,使得可以使用POST传递数据 ...... #'django.middleware.csrf.CsrfViewMiddleware', ) LANGUAGE_CODE = 'zh-cn' # 修改语言 TIME_ZONE = 'Asia/Shanghai' # 修改时区
启动开发服务器:
[root@localhost SimpleCMDB]$ python manage.py runserver 0.0.0.0:8000
定义数据模型:
[root@localhost SimpleCMDB]$ cat hostinfo/models.py from django.db import models # Create your models here. class Host(models.Model): hostname = models.CharField(max_length=50) ip = models.IPAddressField() vendor = models.CharField(max_length=50) product = models.CharField(max_length=50) sn = models.CharField(max_length=50) cpu_model = models.CharField(max_length=50) cpu_num = models.IntegerField() memory = models.CharField(max_length=50) osver = models.CharField(max_length=50)
同步到数据库:
[root@localhost SimpleCMDB]$ python manage.py validate
[root@localhost SimpleCMDB]$ python manage.py syncdb
将数据模型注册到管理后台:
[root@localhost SimpleCMDB]$ cat hostinfo/admin.py from django.contrib import admin from hostinfo.models import Host # Register your models here. class HostAdmin(admin.ModelAdmin): list_display = [ 'hostname', 'ip', 'cpu_model', 'cpu_num', 'memory', 'vendor', 'product', 'osver', 'sn', ] admin.site.register(Host, HostAdmin)
通过 POST 方法收集主机信息到 SimpleCMDB:
[root@localhost SimpleCMDB]$ cat SimpleCMDB/urls.py .... urlpatterns = patterns('', .... url(r'^hostinfo/collect/$', 'hostinfo.views.collect'), )
[root@localhost SimpleCMDB]$ cat hostinfo/views.py from django.shortcuts import render from django.http import HttpResponse from hostinfo.models import Host # Create your views here. def collect(request): if request.POST: hostname = request.POST.get('hostname') ip = request.POST.get('ip') osver = request.POST.get('osver') vendor = request.POST.get('vendor') product = request.POST.get('product') cpu_model = request.POST.get('cpu_model') cpu_num = request.POST.get('cpu_num') memory = request.POST.get('memory') sn = request.POST.get('sn') host = Host() host.hostname = hostname host.ip = ip host.osver = osver host.vendor = vendor host.product = product host.cpu_model = cpu_model host.cpu_num = cpu_num host.memory = memory host.sn = sn host.save() return HttpResponse('OK') else: return HttpResponse('No Data!')
[root@localhost ~]$ cat /data/script/getHostInfo.py #!/usr/bin/env python #-*- coding:utf-8 -*- import urllib, urllib2 from subprocess import Popen, PIPE # 获取IP地址 def getIP(): p = Popen('ifconfig', stdout=PIPE, shell=True) data = p.stdout.read().split('\n\n') for lines in data: if lines.startswith('lo'): continue if lines: ip = lines.split('\n')[1].split()[1].split(':')[1] break return ip # 获取主机名 def getHostname(): p = Popen('hostname', stdout=PIPE, shell=True) hostname = p.stdout.read().strip() return hostname # 获取操作系统版本 def getOSVersion(): with open('/etc/issue') as fd: data = fd.read().split('\n')[0] osVer = data.split()[0] + ' ' + data.split()[2] return osVer # 获取服务器硬件信息 def getHardwareInfo(name): cmd = ''' dmidecode --type system | grep "%s" ''' % name p = Popen(cmd, stdout=PIPE, shell=True) hardwareInfo = p.stdout.read().split(':')[1].strip() return hardwareInfo # 获取CPU型号 def getCPUModel(): with open('/proc/cpuinfo') as fd: for line in fd.readlines(): if line.startswith('model name'): cpuModel = line.split()[3].split('(')[0] break return cpuModel # 获取CPU核数 def getCPUNum(): with open('/proc/cpuinfo') as fd: for line in fd.readlines(): if line.startswith('cpu cores'): cpuNum = line.split()[3] break return cpuNum # 获取物理内存大小 def getMemorySize(): with open('/proc/meminfo') as fd: memTotal = fd.readline().split()[1] memSize = str(int(memTotal)/1024) + 'M' return memSize if __name__ == '__main__': hostInfo = {} hostInfo['ip'] = getIP() hostInfo['hostname'] = getHostname() hostInfo['osver'] = getOSVersion() hostInfo['vendor'] = getHardwareInfo('Manufacturer') hostInfo['product'] = getHardwareInfo('Product Name') hostInfo['sn'] = getHardwareInfo('Serial Number') hostInfo['cpu_model'] = getCPUModel() hostInfo['cpu_num'] = getCPUNum() hostInfo['memory'] = getMemorySize() data = urllib.urlencode(hostInfo) # 通过POST方法传递数据 request = urllib2.urlopen('http://192.168.216.128:8000/hostinfo/collect/', data) print(request.read())
[root@localhost ~]$ python /data/script/getHostInfo.py # 如果想收集其他主机信息,直接在其他主机跑这个脚本即可
OK
主机分组管理:
[root@localhost SimpleCMDB]$ cat hostinfo/models.py # 创建模型,添加一张主机组的表 from django.db import models .... class HostGroup(models.Model): group_name = models.CharField(max_length=50) # 组名,使用的字段类型是CharField group_members = models.ManyToManyField(Host) # 组成员,注意使用的字段及字段参数
[root@localhost SimpleCMDB]$ python manage.py validate
[root@localhost SimpleCMDB]$ python manage.py syncdb
[root@localhost SimpleCMDB]$ cat hostinfo/models.py # 注册模型 from django.db import models # Create your models here. class Host(models.Model): hostname = models.CharField(max_length=50) ip = models.IPAddressField() vendor = models.CharField(max_length=50) product = models.CharField(max_length=50) sn = models.CharField(max_length=50) cpu_model = models.CharField(max_length=50) cpu_num = models.IntegerField() memory = models.CharField(max_length=50) osver = models.CharField(max_length=50) def __str__(self): return self.ip class HostGroup(models.Model): group_name = models.CharField(max_length=50) group_members = models.ManyToManyField(Host)
如下,当我们多次使用指定脚本收集主机信息时,如果数据库里有记录了,它还是会添加一条相同的记录:
因此我们需要修改一下视图函数,加个判断:
[root@localhost SimpleCMDB]$ cat hostinfo/views.py from django.shortcuts import render from django.http import HttpResponse from hostinfo.models import Host # Create your views here. def collect(request): if request.POST: hostname = request.POST.get('hostname') ip = request.POST.get('ip') osver = request.POST.get('osver') vendor = request.POST.get('vendor') product = request.POST.get('product') cpu_model = request.POST.get('cpu_model') cpu_num = request.POST.get('cpu_num') memory = request.POST.get('memory') sn = request.POST.get('sn') try: host = Host.objects.get(sn=sn) # 查询数据库,查看是否有记录,如果有就重写记录,没有就添加记录 except: host = Host() host.hostname = hostname host.ip = ip host.osver = osver host.vendor = vendor host.product = product host.cpu_model = cpu_model host.cpu_num = cpu_num host.memory = memory host.sn = sn host.save() return HttpResponse('OK') else: return HttpResponse('No Data!')