溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

創(chuàng)建simplecmdb項(xiàng)目

發(fā)布時(shí)間:2020-07-20 21:00:03 來源:網(wǎng)絡(luò) 閱讀:647 作者:1350368559 欄目:數(shù)據(jù)庫

創(chuàng)建simplecmdb項(xiàng)目


一、創(chuàng)建項(xiàng)目simplecmdb,創(chuàng)建一個(gè)應(yīng)用,startapp hostinfo,在setting中添加應(yīng)用

[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應(yīng)用:hostinfo
INSTALLED_APPS = (
    'hostinfo',
)
#注釋這一行,允許使用第三方的中間鍵
MIDDLEWARE_CLASSES = (
    #'django.middleware.csrf.CsrfViewMiddleware',
)

#修改語言編碼和時(shí)區(qū)
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

#啟動(dòng)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/

創(chuàng)建simplecmdb項(xiàng)目


二、創(chuàng)建數(shù)據(jù)模型,在hostinfo中定義數(shù)據(jù)模型

[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)

初始化數(shù)據(jù)模型,即將數(shù)據(jù)模型保存到數(shù)據(jù)庫中

#檢查錯(cuò)誤
[root@133 simplecmdb]# python manage.py validate
0 errors found

#查看同步將會(huì)執(zhí)行的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中注冊

創(chuàng)建simplecmdb項(xiàng)目

[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  #導(dǎo)入hostinfo目錄下的models.py這個(gè)模塊

# 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)

注冊之后,發(fā)現(xiàn)Host在頁面上顯示了

創(chuàng)建simplecmdb項(xiàng)目

點(diǎn)擊添加host,增加了host的配置,然后點(diǎn)擊保存,即可顯示相關(guān)的信息。

創(chuàng)建simplecmdb項(xiàng)目

創(chuàng)建simplecmdb項(xiàng)目


錯(cuò)誤記錄:

在定義models.py中定義字段的時(shí)候,vendor錯(cuò)誤寫成了vender,導(dǎo)致后面頁面去數(shù)據(jù)庫取數(shù)據(jù)找不到vendor字段,報(bào)錯(cuò)

解決辦法:

1、刪除db.sqlite3

2、修改models.py,vender修改為vendor,重新初始化sqlite3數(shù)據(jù)庫



三、定義url訪問路徑(mvc中的c,正則表達(dá)式,當(dāng)用戶訪問/hostinfo/collect 這個(gè)url,讓hostinfo應(yīng)用中的views中的collect函數(shù)處理

[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方法,傳遞參數(shù),用get得到參數(shù)      
[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

創(chuàng)建simplecmdb項(xiàng)目

創(chuàng)建simplecmdb項(xiàng)目


1、使用shell添加主機(jī),shell腳本里面就是curl命令,查看頁面,結(jié)果顯示node03已經(jīng)添加

[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

創(chuàng)建simplecmdb項(xiàng)目

2、python下urllib,urllib2,httplib方法傳遞數(shù)據(jù) ,查看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'

創(chuàng)建simplecmdb項(xiàng)目



3、修改python腳本,直接修改將收集到的系統(tǒng)信息發(fā)送到服務(wù)器

[root@133 django]# cat sysinformation.py 
#!/usr/bin/env python
import urllib,urllib2  #導(dǎo)入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內(nèi)容轉(zhuǎn)換為urlencode格式,并用urlopen打開網(wǎng)頁并傳遞數(shù)據(jù),使用req.read()返回結(jié)果
    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

網(wǎng)頁查看,真實(shí)的系統(tǒng)信息已經(jīng)收集到了

創(chuàng)建simplecmdb項(xiàng)目


五、對收集的主機(jī)信息進(jìn)行分組管理

創(chuàng)建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)
    
#同步數(shù)據(jù)庫,創(chuàng)建了2個(gè)表
[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

注冊數(shù)據(jù)庫,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組

創(chuàng)建simplecmdb項(xiàng)目

如果需要分組的時(shí)候顯示主機(jī)名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)

創(chuàng)建simplecmdb項(xiàng)目


問題:關(guān)于def __unicode__(self): 他的作用是什么是啊,這return hostname 可是怎么和下邊的函數(shù)HostGroup 關(guān)聯(lián)起來的呢?

主機(jī)與主機(jī)組是通過members = models.ManyToManyField(Host)這個(gè)字段關(guān)聯(lián)起來的。
def __unicode__(self)它的作用與在類里重寫__str__()這個(gè)方法是一樣的。讓類返回一個(gè)字節(jié)串,否則members顯示的是對象。





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI