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!')
Django SimpleCMDB 项目的更多相关文章
- Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 ...
- Django SimpleCMDB WSGI
一.WSGI 介绍 (1) 在前面的学习中,我们是通过 python manage.py runserver 0.0.0.0:8000 来启动并访问开发服务器的:(2) 但在实际中我们是通过直接访问 ...
- django创建项目
django创建项目 安装django pip install django==1.9 Note: C:\Python34\Scripts\pip.exe 创建项目 django-admin star ...
- Django练习项目之搭建博客
背景:自从今年回家过年后,来到公司给我转了试用,我的学习效率感觉不如从前,而且刚步入社会我总是想要怎么想明白想清楚一些事,这通常会花掉,消耗我大量的精力,因为我想把我的生活管理规划好了,而在it技术学 ...
- Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示
基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...
- Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据
基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...
- Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面
1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...
- nginx + uwsgi 部署 Django+Vue项目
nginx + uwsgi 部署 Django+Vue项目 windows 本地 DNS 解析 文件路径 C:\Windows\System32\drivers\etc 单机本地测试运行方式,调用dj ...
- Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid
Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...
随机推荐
- JQuery之拖拽插件
一直以来,都对JS获取元素的位置感到非常的困惑:一会client.一会offset.一会scroll. 再加上各大浏览器之间的不兼容,唉,搞得哥晕晕乎乎的. 而很多页面效果都要用到这些位置.不得已,得 ...
- RootKit
类型0:藏在人群中,干扰人工肉眼检查 类型1 2:篡改系统内部的数据结构和调用表,破坏自动化检测工具,这项数据结构和调用表是检测工具和KootKit共用的 类型3:跳出束缚,由rootkit实现本该宿 ...
- 在C++中调用DLL中的函数(3)
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- c数组
一维数组 有三种赋值方式 1.原始的赋值 2. 初始化赋值 3.动态赋值 数组的花式玩法 void main() { ] = {, , , , , , , , , }; test(a); putcha ...
- 转载: PHP错误:Warning: Cannot modify header information - headers already sent by ...
如果在执行php程序时看到这条警告:"Warning: Cannot modify header information - headers already sent by ....&quo ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- JDBC删除数据实例
在本教程将演示如何在JDBC应用程序中,删除数据库表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中删除数据记录. 要执行以下示例,需要用 ...
- Native Code
Native Code — 本机代码,即已被编译为运行于特定处理器机器码的代码. 本地代码(native code)是计算机编程(代码),编译用来运行一个特殊的处理器(如英特尔x86级的 ...
- YII2 搭建redis拓展(教程)
安装redis扩展: 1.通过composer进行安装,到项目根目录cmd运行(推荐) php composer.phar require --prefer-dist yiisoft/yii2-red ...
- 50.EasyGank妹纸App
50.EasyGank妹纸App 前言 基于MVP模式下 , RxJava+RxAndroid+Retrofit的组合 . RxJava RxAndroid Retrofit Okhttp Gson ...