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

 

 

 

 

 

 

 

 

 

 

      

posted @ 2019-01-31 16:22  孔雀东南飞  阅读(394)  评论(0编辑  收藏  举报