您好,登錄后才能下訂單哦!
創建simplecmdb項目
一、創建項目simplecmdb,創建一個應用,startapp hostinfo,在setting中添加應用
[root@133 ]# cd /opt/python/django/ [root@133 django]# django-admin.py startproject simplecmdb [root@133 django]# cd simplecmdb/ [root@133 simplecmdb]# ls manage.py simplecmdb [root@133 simplecmdb]# python manage.py startapp hostinfo [root@133 simplecmdb]# cd simplecmdb/ [root@133 simplecmdb]# vim settings.py #添加app應用:hostinfo INSTALLED_APPS = ( 'hostinfo', ) #注釋這一行,允許使用第三方的中間鍵 MIDDLEWARE_CLASSES = ( #'django.middleware.csrf.CsrfViewMiddleware', ) #修改語言編碼和時區 LANGUAGE_CODE = 'zh-cn' TIME_ZONE = 'Asia/Shanghai' [root@133 django]# cd /opt/python/django/simplecmdb/ [root@133 simplecmdb]# ll 總用量 12 drwxr-xr-x 2 root root 4096 1月 4 11:13 hostinfo -rwxr-xr-x 1 root root 253 1月 4 11:12 manage.py drwxr-xr-x 2 root root 4096 1月 4 14:31 simplecmdb #啟動server [root@133 simplecmdb]# nohup python manage.py runserver 112.65.140.133:8080 &[root@133 simplecmdb]# python manage.py runserver 112.65.140.133:8080 Validating models... 0 errors found January 04, 2017 - 14:33:01 Django version 1.6.5, using settings 'simplecmdb.settings' Starting development server at http://112.65.140.133:8080/ Quit the server with CONTROL-C.
瀏覽器訪問ok:http://11.65.140.13:8080/
二、創建數據模型,在hostinfo中定義數據模型
[root@133 simplecmdb]# cd /opt/python/django/simplecmdb/hostinfo/ [root@133 hostinfo]# ll 總用量 28 -rw-r--r-- 1 root root 63 1月 4 11:13 admin.py -rw-r--r-- 1 root root 194 1月 4 14:33 admin.pyc -rw-r--r-- 1 root root 0 1月 4 11:13 __init__.py -rw-r--r-- 1 root root 137 1月 4 14:33 __init__.pyc -rw-r--r-- 1 root root 57 1月 4 11:13 models.py -rw-r--r-- 1 root root 191 1月 4 14:33 models.pyc -rw-r--r-- 1 root root 60 1月 4 11:13 tests.py -rw-r--r-- 1 root root 63 1月 4 11:13 views.py [root@133 hostinfo]# vim 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(max_length = 50) memory = models.CharField(max_length= 50) osver = models.CharField(max_length = 50)
初始化數據模型,即將數據模型保存到數據庫中
#檢查錯誤 [root@133 simplecmdb]# python manage.py validate 0 errors found #查看同步將會執行的sql [root@133 simplecmdb]# python manage.py sqlall hostinfo BEGIN; CREATE TABLE "hostinfo_host" ( "id" integer NOT NULL PRIMARY KEY, "hostname" varchar(50) NOT NULL, "ip" char(15) NOT NULL, "vendor" varchar(50) NOT NULL, "product" varchar(50) NOT NULL, "sn" varchar(50) NOT NULL, "cpu_model" varchar(50) NOT NULL, "cpu_num" integer NOT NULL, "memory" varchar(50) NOT NULL, "osver" varchar(50) NOT NULL ) ; COMMIT; #同步models到sql [root@133 simplecmdb]# python manage.py syncdb Creating tables ... Creating table django_admin_log Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_groups Creating table auth_user_user_permissions Creating table auth_user Creating table django_content_type Creating table django_session Creating table hostinfo_host You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use 'root'): root #用戶 Email address: david-dai@zamplus.com #郵箱 Password: #輸入密碼 Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s)
打開admin頁面,輸入用戶名和密碼登錄,但是看不到host頁面,
如果需要看到host頁面,需要注冊host class,把需要顯示的字段在admin.py中定義,并且在admin.site.register中注冊
[root@133 simplecmdb]# cd /opt/python/django/simplecmdb/hostinfo/ [root@133 hostinfo]# vim admin.py from django.contrib import admin from hostinfo.models import Host #導入hostinfo目錄下的models.py這個模塊 # Register your models here.#把需要顯示的字段定義好,才能在web頁面上顯示出來 class HostAdmin(admin.ModelAdmin): list_display = [ 'hostname', 'ip', 'cpu_model', 'cpu_num', 'memory', 'vendor', 'product', 'osver', 'sn' ] admin.site.register(Host, HostAdmin)
注冊之后,發現Host在頁面上顯示了
點擊添加host,增加了host的配置,然后點擊保存,即可顯示相關的信息。
錯誤記錄:
在定義models.py中定義字段的時候,vendor錯誤寫成了vender,導致后面頁面去數據庫取數據找不到vendor字段,報錯
解決辦法:
1、刪除db.sqlite3
2、修改models.py,vender修改為vendor,重新初始化sqlite3數據庫
三、定義url訪問路徑(mvc中的c,正則表達式,當用戶訪問/hostinfo/collect 這個url,讓hostinfo應用中的views中的collect函數處理
[root@133 simplecmdb]# vim urls.py from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'simplecmdb.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^hostinfo/collect/$','hostinfo.views.collect'),# )
四、views.py定義訪問的方法
[root@133 simplecmdb]# vim /opt/python/django/simplecmdb/hostinfo/views.py from django.shortcuts import render from django.http import HttpResponse from hostinfo.models import Host # Create your views here. def collect(req): if req.POST: hostname = req.POST.get('hostname') ip = req.POST.get('ip') osver = req.POST.get('osver') vendor = req.POST.get('vendor') product = req.POST.get('product') cpu_model = req.POST.get('cpu_model') cpu_num = req.POST.get('cpu_num') memory = req.POST.get('memory') sn = req.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') #使用curl方法,傳遞參數,用get得到參數 [root@133 hostinfo]# curl -d hostname='node02' -d ip='192.168.1.2' -d osver='Centos6.5' -d vendor='HP' -d product='BL 380' -d sn='##$$123' -d cpu_model='Intel' -d cpu_num=16 -d memory='32G' http://112.65.140.133:8080/hostinfo/collect/ OK
1、使用shell添加主機,shell腳本里面就是curl命令,查看頁面,結果顯示node03已經添加
[root@133 django]# cd /opt/python/django/ [root@133 django]# vim data.sh curl -d hostname='node03' -d ip='192.168.1.3' -d osver='Centos6.5' -d vendor='HP' -d product='BL 380' -d sn='##$$123' -d cpu_model='Intel' -d cpu_num=16 -d memory='32G' [root@133 django]# sh data.sh OK
2、python下urllib,urllib2,httplib方法傳遞數據 ,查看node04傳遞成功
[root@133 django]# ipython In [4]: import urllib, urllib2 In [5]: help(urllib2.urlopen) Help on function urlopen in module urllib2: urlopen(url, data=None, timeout=<object object>) In [7]: req = urllib2.urlopen('http://112.65.140.133:8080/hostinfo/collect') In [8]: req.read() Out[8]: 'no data' #直接返回no data #'123'格式不對,需要是post格式才可以 In [12]: req = urllib2.urlopen('http://112.65.140.133:8080/hostinfo/collect',‘123’) File "<ipython-input-12-eb17fa9ebc01>", line 1 req = urllib2.urlopen('http://112.65.140.133:8080/hostinfo/collect',‘123’) ^ SyntaxError: invalid syntax In [13]: help(urllib.urlencode) Help on function urlencode in module urllib: urlencode(query, doseq=0) Encode a sequence of two-element tuples or dictionary into a URL query string. If any values in the query arg are sequences and doseq is true, each sequence element is converted to a separate parameter. If the query arg is a sequence of two-element tuples, the order of the parameters in the output will match the order of parameters in the input. In [16]: urllib.urlencode({'hostname':'node05'}) Out[16]: 'hostname=node05' In [18]: urllib.urlencode({'hostname':'node05','ip':'192.168.1.5'}) Out[18]: 'ip=192.168.1.5&hostname=node05' In [19]: dic = {'hostname':'node04','ip':'192.168.1.4','osver':'CentOS6.5','vendor':'david','p ...: roduct':'BL 380','cpu_model':'Intel','cpu_num':'16','memory':'16G','sn':'12345'} In [25]: dic Out[25]: {'vendor': 'david', 'cpu_model': 'Intel', 'cpu_num': '16', 'hostname': 'node04', 'ip': '192.168.1.4', 'memory': '16G', 'osver': 'CentOS6.5', 'product': 'BL 380', 'sn': '12345'} In [20]: data = urllib.urlencode(dic) In [21]: data Out[21]: 'product=BL+380&vendor=david&osver=CentOS6.5&sn=12345&memory=16G&cpu_num=16&ip=192.168.1.4&hostname=node04&cpu_model=Intel' In [12]: req = urllib2.urlopen('http://112.65.140.133:8080/hostinfo/collect/',data) In [13]: req.read() Out[13]: 'OK'
3、修改python腳本,直接修改將收集到的系統信息發送到服務器
[root@133 django]# cat sysinformation.py #!/usr/bin/env python import urllib,urllib2 #導入urllib模塊 from subprocess import Popen,PIPE def getIfconfig(): p = Popen(['ifconfig'], stdout=PIPE) data = p.stdout.read() return data def getDmi(): p = Popen(['dmidecode'], stdout = PIPE) data = p.stdout.read() return data def parseData(data): parsed_data = [] new_line = '' data = [i for i in data.split('\n') if i ] for line in data: if line[0].strip(): parsed_data.append(new_line) new_line = line + '\n' else: new_line +=line + '\n' parsed_data.append(new_line) return parsed_data def parseIfconfig(parsed_data): dic = {} tuple_addr= ('lo','vir','vnet','em3','em4') parsed_data = [i for i in parsed_data if i and not i.startswith(tuple_addr)] for lines in parsed_data: line_list = lines.split('\n') devname = line_list[0].split()[0] macaddr = line_list[0].split()[-1] ipaddr = line_list[1].split()[1].split(':')[1] break dic['ip'] = devname,ipaddr,macaddr return dic def parseDmi(parsed_data): dic = {} parsed_data = [i for i in parsed_data if i.startswith('System Information')] parsed_data = [i for i in parsed_data[0].split('\n')[1:] if i] dmi_dic = dict ([i.strip().split(':') for i in parsed_data]) dic ['vendor'] = dmi_dic['Manufacturer'].strip() dic ['product'] = dmi_dic['Product Name'].strip() dic ['sn'] = dmi_dic['Serial Number'].strip() return dic def getHostname(f): with open(f) as fd: for line in fd: if line.startswith('HOSTNAME'): hostname = line.split('=')[1].strip() break return {'hostname':hostname} def getOSver(f): with open(f) as fd: for line in fd: osver = line.strip() break return {'osver':osver} def getCpu(f): num = 0 with open(f) as fd: for line in fd: if line.startswith('processor'): num +=1 if line.startswith('model name'): cpu_model = line.split(':')[1].split() cpu_model = cpu_model[0] + ' '+cpu_model[-1] return {'cpu_num':num, 'cpu_model':cpu_model} def getMemory(f): with open(f) as fd: for line in fd: if line.startswith('MemTotal'): mem = int(line.split()[1].strip()) break mem = "%s" % int(mem/1024.0)+'M' return {'memory':mem} if __name__ == "__main__": dic = {} data_ip = getIfconfig() parsed_data_ip = parseData(data_ip) ip = parseIfconfig(parsed_data_ip) data_dmi = getDmi() parsed_data_dmi = parseData(data_dmi) dmi = parseDmi(parsed_data_dmi) hostname = getHostname('/etc/sysconfig/network') osver = getOSver('/etc/issue') cpu = getCpu('/proc/cpuinfo') mem = getMemory('/proc/meminfo') dic.update(ip) dic.update(dmi) dic.update(hostname) dic.update(cpu) dic.update(mem) dic.update(osver) #將字典dic內容轉換為urlencode格式,并用urlopen打開網頁并傳遞數據,使用req.read()返回結果 d = urllib.urlencode(dic) req = urllib2.urlopen('http://112.65.140.133:8080/hostinfo/collect/',d) print req.read() [root@133 django]# python sysinformation.py OK
網頁查看,真實的系統信息已經收集到了
五、對收集的主機信息進行分組管理
創建HostGroup表,models.py
[root@133 simplecmdb]# cd /opt/python/django/simplecmdb/hostinfo/ [root@133 hostinfo]# ll 總用量 32 -rw-r--r-- 1 root root 405 1月 4 15:38 admin.py -rw-r--r-- 1 root root 669 1月 4 16:10 admin.pyc -rw-r--r-- 1 root root 0 1月 4 11:13 __init__.py -rw-r--r-- 1 root root 137 1月 4 14:33 __init__.pyc -rw-r--r-- 1 root root 498 1月 4 15:25 models.py -rw-r--r-- 1 root root 738 1月 4 15:25 models.pyc -rw-r--r-- 1 root root 60 1月 4 11:13 tests.py -rw-r--r-- 1 root root 1099 1月 4 17:17 views.py -rw-r--r-- 1 root root 1115 1月 4 17:17 views.pyc [root@133 hostinfo]# vim 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(max_length = 50) memory = models.CharField(max_length = 50) osver = models.CharField(max_length = 50) class HostGroup(models.Model): groupname = models.CharField(max_length = 50) members = models.ManyToManyField(Host) #同步數據庫,創建了2個表 [root@133 hostinfo]# cd .. [root@133 simplecmdb]# ll 總用量 60 -rw-r--r-- 1 root root 35840 1月 4 17:50 db.sqlite3 drwxr-xr-x 2 root root 4096 1月 4 20:10 hostinfo -rwxr-xr-x 1 root root 253 1月 4 11:12 manage.py -rw------- 1 root root 8640 1月 4 16:59 nohup.out drwxr-xr-x 2 root root 4096 1月 4 18:49 simplecmdb [root@133 simplecmdb]# python manage.py syncdb Creating tables ... Creating table hostinfo_hostgroup_members Creating table hostinfo_hostgroup Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s) [root@133 simplecmdb]# ll 總用量 68 -rw-r--r-- 1 root root 41984 1月 4 20:10 db.sqlite3 drwxr-xr-x 2 root root 4096 1月 4 20:10 hostinfo -rwxr-xr-x 1 root root 253 1月 4 11:12 manage.py -rw------- 1 root root 8640 1月 4 16:59 nohup.out drwxr-xr-x 2 root root 4096 1月 4 18:49 simplecmdb [root@133 simplecmdb]# sqlite3 db.sqlite3 SQLite version 3.6.20 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables auth_group django_admin_log auth_group_permissions django_content_type auth_permission django_session auth_user hostinfo_host auth_user_groups hostinfo_hostgroup auth_user_user_permissions hostinfo_hostgroup_members sqlite> .schema hostinfo_hostgroup CREATE TABLE "hostinfo_hostgroup" ( "id" integer NOT NULL PRIMARY KEY, "groupname" varchar(50) NOT NULL ); sqlite> .schema hostinfo_hostgroup_members CREATE TABLE "hostinfo_hostgroup_members" ( "id" integer NOT NULL PRIMARY KEY, "hostgroup_id" integer NOT NULL, "host_id" integer NOT NULL REFERENCES "hostinfo_host" ("id"), UNIQUE ("hostgroup_id", "host_id") ); CREATE INDEX "hostinfo_hostgroup_members_27f00f5d" ON "hostinfo_hostgroup_members" ("host_id"); CREATE INDEX "hostinfo_hostgroup_members_521bb4b0" ON "hostinfo_hostgroup_members" ("hostgroup_id"); sqlite> sqlite> .exit
注冊數據庫,admin.py
[root@133 hostinfo]# vim /opt/python/django/simplecmdb/hostinfo/admin.py from django.contrib import admin from hostinfo.models import Host,HostGroup # Register your models here. class HostAdmin(admin.ModelAdmin): list_display = [ 'hostname', 'ip', 'cpu_model', 'cpu_num', 'memory', 'vendor', 'product', 'osver', 'sn' ] class HostGroupAdmin(admin.ModelAdmin): list_display = ['groupname'] admin.site.register(Host, HostAdmin) admin.site.register(HostGroup,HostGroupAdmin)
可以看到Host groups組
如果需要分組的時候顯示主機名hostname,需要在modles中繼承并重寫self方法
[root@133 hostinfo]# vim /opt/python/django/simplecmdb/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(max_length = 50) memory = models.CharField(max_length = 50) osver = models.CharField(max_length = 50) #這里指定使用hostname顯示 def __unicode__(self): return self.hostname class HostGroup(models.Model): groupname = models.CharField(max_length = 50) members = models.ManyToManyField(Host)
問題:關于def __unicode__(self): 他的作用是什么是啊,這return hostname 可是怎么和下邊的函數HostGroup 關聯起來的呢?
主機與主機組是通過members = models.ManyToManyField(Host)這個字段關聯起來的。
def __unicode__(self)它的作用與在類里重寫__str__()這個方法是一樣的。讓類返回一個字節串,否則members顯示的是對象。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。