django 實現linux運維管理平臺

概述

使用django實現一個linux運維管理平臺,能夠實現註冊登陸,機器管理 ,服務器批量操做,服務器性能監控。

詳細

 

1、準備工做

一、須要準備什麼環境html

我是在本身的雲服務上編寫和運行的,centos7.2的環境,python是系統自帶的python2.7.5,django安裝的1.8.5版本的。數據庫使用的mysql5.6版本的,rrdtool版本是rrdtool-1.4.8。前端

二、本例子實現什麼功能python

①、用戶管理mysql

②、資產信息添加和展現linux

③、服務器性能監控nginx

④、服務器批量管理web

⑤、日誌管理sql

⑥、經驗總結編輯和展現數據庫

 

三、django工做原理圖:django

原理圖.png

 

四、運維管理平臺的功能模塊圖:

功能模塊圖.png

五、功能模塊介紹:

(1)用戶登陸註冊模塊

用戶登陸註冊模塊包含註冊、登陸和註銷登陸的功用。這個模塊主要是負責用戶註冊和登陸運維管理系統,用戶經過點擊註冊按鈕,頁面會跳轉到註冊頁面上,用戶按照頁面的輸入提示框,輸入相應的信息完成註冊,當用戶輸入的用戶已經被註冊了,那麼這個時候系統會作出判斷,而且給出用戶提示,若是註冊的用戶,以前並無註冊,那麼這個時候能夠成功註冊,而且會有提示給用戶。這個時候,用戶可以點擊登陸按鈕跳轉到登陸頁面,使用註冊成功的帳號和密碼完成登陸操做。

(2)Web頁面執行Linux命令

WEBSSH功能模塊是實如今web系統上操做Linux服務器。用戶在首頁面上點擊WEBSSH按鈕頁面會跳轉到WEBSSH命令執行頁面,用戶在命令輸入提示框中輸入格式正確的Linux命令,系統會對用戶給出的命令在服務器上執行,而且把執行輸出時間和執行結果展現出來。這樣方便對Linux服務器進行一些常規操做。

(3)服務器資產信息管理功能

服務器資產信息管理有兩個小的子功能:服務器資產信息後臺編輯,用戶能夠在後臺編輯頁面上對服務器資產信息進行增長修改和刪除操做。服務器信息前端展現,經過把前面經過後臺編輯頁面寫入到數據庫裏面的信息,再把數據從數據庫裏面取出來並格式化輸出給用戶看。

(4)服務器性能監控模塊

服務器性能監控模塊是利用RRDTOOL開源軟件,針對我本身寫的自定義監控腳本,把磁盤、內存、cpu的性能指標數據存入RRDTOOL文件中,而後利用RRDTOOL自身的繪圖功能把性能指標的數據生成圖片,用戶經過訪問相應的按鈕,在後端會執行相應的操做,實時的把1分鐘、3分鐘、5分鐘的數據展現出來。這樣用戶能夠查看實時的性能指標。

(5)產品上線模塊

產品上線模塊是針對運維常作的操做而實現的,經過點擊測試環境或者正式環境的發佈能夠進行程序的更新和回滾操做。這樣能夠簡化平常運維工做人員的操做負責性。

(6)服務器批量管理模塊

服務器批量管理模塊能夠實現文件的批量同步和程序的批量管理。文件批量同步的話,爲了保持大量的服務器的關鍵文件的一致性,因此咱們須要的是在一臺有主控性的服務器上修改文件,再把文件同步到後端的大批量的服務器上。這樣管理十臺、100臺、1000臺相同業務的服務器的話,事實上跟管理一臺服務器是同樣的。再來講一下程序的批量管理,其實和上面的思想相同,前面的文件是爲了程序服務的,再者說程序也是文件,當咱們把一些文件修改之後進行同步這個時候實際上是爲了程序作支持工做。咱們經過項目來決定不一樣的主機組而後針對這個主機組作統一的程序管理。

(7)生產經驗總結模塊

生產經驗總結模塊能夠分爲三部分:文章內容的後臺編輯、疑難問題展現、心得體會展現。文章後臺編輯的話我真的疑難問題和心得體會各建立一個數據庫表,這樣的話,不論是我針對文章的編輯仍是前端 頁面的展現的話都會相對來更好實現和管理。用戶能夠把本身在工做中遇到的問題和本身的一些總結針對不一樣的數據庫表進行編輯,而後經過前端的頁面,把它們展現出來。這樣的話,咱們在工做中碰到必定問題的時候能夠先從運維管理系統上查一下,看看以前是否是已經有人碰到過這種狀況。並且經過別人的總結咱們能夠學習到更多寶貴的經驗。

(8)日誌管理模塊

日誌管理模塊針對Linux系統產生的日誌和應用程序自身產生的日誌進行過濾加工處理操做,由於對咱們來講日誌包含不少寶貴的信息,咱們能夠針對咱們想要了解的對於海量的日誌作處理操做,而後只獲取咱們想要的,經過頁面把咱們後臺處理之後的日誌信息展現出來,

2、程序實現

一、用戶登陸

模板(templates)

<body id="login">
  <div class="login-logo">
    <!--a href="index.html">linux 運維管理平臺<!--img src="{% static "images/logo.png" %}" alt=""/--></a-->
  </div>
  <h2 class="form-heading"><font size="15" face="Cicle">Linux運維管理平臺登陸頁面</font></h2>
  <div class="app-cam">
          {{ nopass  }}{{ deltxt }} 
	  <form action="/login/"  method="post"> {% csrf_token %}
		<input type="text" class="text" value="username" name="username" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'username';}">
		<input type="password" value="password" name="password" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'password';}">
		<div class="submit"><input type="submit" onclick="myFunction()" value="登陸"></div>
		<div class="login-social-link">
          <a href="/login/" class="facebook">
             登陸取消
          </a>
          <a href="/register/" class="twitter">
              用戶註冊
          </a>
        </div>
		<!--ul class="new">
			<li class="new_left"><p><a href="#">忘記密碼</a></p></li>
			<li class="new_right"><p><a href="/register/"> 註冊</a></p></li>
			<div class="clearfix"></div>
		</ul-->
	</form>
  </div>
   <div class="copy_layout login">
      <p>Copyright &copy; 付煒超Linux運維管理系統登陸界面 </p>
   </div>
</body>

視圖(views)

def login(request):
    if request.method == 'POST':
        username = request.POST.get("username","")
        password = request.POST.get("password","")
        user = User.objects.filter(username__exact = username,password__exact = password)
        if user:                                           #若是用戶匹配成功
            response = HttpResponseRedirect('/index/')              #重定向到index
            response.set_cookie('cookie_username',username,36)    #設置cookie 
            return response                                         #把index頁面輸出   
        else:
            nopass="用戶名或者密碼輸入錯誤"                        #沒有匹配成功  
            return render(request,'login.html',{'nopass':nopass})
        return HttpResponse('yes')
    return render(request,'login.html')

模型(models)

class User(models.Model):
    username = models.CharField(max_length=30)
    password = models.CharField(max_length=30)

    def __unicode__(self):
        return self.username

路由(url)

url(r'^login/$', 'monitor.views.login'),

二、用戶註冊

模板(templates)

<body id="login">
  <div class="login-logo">
    <!--a href="index.html"><img src="{%static "images/logo.png"%}" alt=""/></a-->
  </div>
  <h2 class="form-heading"><font size="15" face="Cicle">Linux運維管理平臺註冊頁面</font> </h2>
  <form class="form-signin app-cam" action="/register/" method="post">{% csrf_token %}
       <p> {{ registusername }} {{ registered }}</p>
       <p> {{ registAdd }} {{ Registered }}</p>
       <p> 請輸入您的想要註冊的帳號和密碼</p>
      <input type="text" class="form-control1" placeholder="username" name="username" autofocus="">
      <input type="password" class="form-control1" placeholder="password" name="password" >
      <label class="checkbox-custom check-success">
      </label>
      <button class="btn btn-lg btn-success1 btn-block" type="submit">Submit</button>
      <div class="registration">
          Already Registered.
          <a class="" href="/login/">
              Login
          </a>
      </div>
  </form>
   <div class="copy_layout login register">
      <p>Copyright &copy; 付煒超運維管理系統的註冊頁 </p>
   </div>
</body>

視圖(views)

def register(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        try:
             registusername = User.objects.filter(username=username).get().username
             registered="已經註冊了"
             return render(request,'register.html',{'registusername':registusername,'registered':registered})
        except:
            registAdd = User.objects.create(username=username,password=password)
            Registered="註冊成功!!!"
            return render(request,'register.html',{'registAdd':registAdd,'Registered':Registered})
    else:
        return render(request,'register.html')
    return render(request,'register.html')

三、用戶註銷

視圖(views)

def logout(request):
    return render(request,'login.html')
    response.delete_cookie('cookie_username')                            #刪除cookie_username對應的用戶的cookie 
    return  response

四、服務器資產信息

視圖(templates)

def infor(request):
    infor_list = Information.objects.all()
    return render_to_response('information.html',{'infor_list':infor_list})

模型(models)

from django.db import models
class Information(models.Model):
    name = models.CharField(max_length=30)
    privateip = models.GenericIPAddressField()
    publicip = models.GenericIPAddressField()
    use = models.TextField()
    zoneid = models.CharField(max_length=30)
    cpu = models.CharField(max_length=50)
    memory = models.CharField(max_length=50)
    datadisk = models.CharField(max_length=30)
    time = models.DateTimeField()

    def __unicode__(self):
        return self.name

admin

class InformationAdmin(admin.ModelAdmin):
    list_display = ('name','privateip','publicip','use','zoneid','cpu','memory','datadisk')
    
admin.site.register(Information,InformationAdmin)

模板(templates)

{% block content %}
<table border="1">
<tr>
<th>服務器主機名</th>
<th>服務器內網ip</th>
<th>服務器公網ip</th>
<th>服務器zoneid</th>
<th>服務器cpu個數</th>
<th>服務器內存大小</th>
<th>服務器數據盤大小</th>
<th>服務器信息記錄時間</th>
<th>服務器用途</th>
</tr>

{% for infor in infor_list %}
<tr>
<td>{{ infor.name }}</td> 
<td>{{ infor.privateip}} </td>  
<td>{{ infor.publicip}} </td>  
<td>{{ infor.zoneid}} </td>  
<td>{{ infor.cpu}} </td>  
<td>{{ infor.memory}} </td>  
<td>{{ infor.datadisk}} </td>  
<td>{{ infor.time}} </td>  
<td> {{ infor.use}}</td>

</tr>

{% endfor %}
{% endblock %}

五、服務器性能監控

視圖(views)

def servers(request):
    if request.method == 'POST':
        hostgroup = request.POST.get("hostgroup","")
        model = request.POST.get("model","")
        user = request.POST.get("user","")
        command = request.POST.get("command","")
        os.environ['hostgroup']=str(hostgroup)
        os.environ['model']=str(model)
        os.environ['user']=str(user)
        os.environ['command']=str(command)
        output = commands.getoutput("sh /home/zqxt_form2/monitor/ansible.sh $hostgroup $model $user $command")
        return render(request,'servers.html',{'output':output})
    return render(request,'servers.html')

模板(templates)

<section id="content">
	<div class="zerogrid">
		<div class="row block">
			<div class="main-content">
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/cpu1.jpg" %}"/>   
							<h2><a href="#">cpu 1 分鐘的性能圖</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/cpu3.jpg" %}"/>
							<h2><a href="#">cpu 3 分鐘的性能圖</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/cpu5.jpg" %}"/>
							<h2><a href="#">cpu 5 分鐘的性能圖</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/memory1.jpg" %}"/>
							<h2><a href="#">內存 1 分鐘的使用圖</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/memory3.jpg" %}"/>
							<h2><a href="#">內存 3 分鐘的使用圖</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/memory5.jpg" %}"/>
							<h2><a href="#">內存 5 分鐘的使用圖</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/disk1.jpg" %}"/>
							<h2><a href="#">磁盤 1 分鐘的空閒量</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/disk3.jpg" %}"/>
							<h2><a href="#">磁盤 3 分鐘的空閒量</a></h2>
						</div>
						
					</div>
				</article>
				<article class="col-1-3">
					<div class="wrap">
						<div class="heading">
							<img src="{% static "jpg/monitor/disk5.jpg" %}"/>
							<h2><a href="#">磁盤 5 分鐘的空閒量</a></h2>
						</div>
						
					</div>
				</article>
			</div>
			
		</div>
	</div>
</section>

rrdtool.sh

#!/bin/bash
#rrdtool create cpu.rrd --step 5 DS:cpuds:GAUGE:8:0:U   RRA:AVERAGE:0.5:1:17280  RRA:MIN:0.5:1:17280  RRA:MAX:0.5:1:17280 RRA:AVERAGE:0.5:10:3456 RRA:MIN:0.5:10:3456 RRA:MAX:0.5:10:3456  RRA:AVERAGE:0.5:100:1210  RRA:MIN:0.5:100:1210 RRA:MAX:0.5:100:1210
while true;do 
    cpu=`vmstat 1 1 |tail -n 1 |awk  '{print $15}'`
    memory=`free -m |grep "Mem" |awk '{print $4+$6}'`
    disk=`df -h |head -n 2 |tail -n 1 |awk '{print $5}'|awk -F '%' '{print $1}'`
    rrdtool update ./cpu.rrd N:${cpu}
    rrdtool update ./memory.rrd N:${memory}
    rrdtool update ./disk.rrd N:${disk}
    sleep 5
done

#1minute=`date --date '1 minute ago ' +%s`
#3minute=`date --date '3 minute ago ' +%s`
#5minute=`date --date '5 minute ago ' +%s`

#rrdtool graph cpu1.jpg --step 5 -s ${1minute} -t "cpu  1 minute monitor" -v cpu DEF:cpu=./cpu.rrd:cpuds:AVERAGE LINE1:cpu#FF0000:'cpu avg'
#rrdtool graph cpu3.jpg --step 5 -s ${3minute} -t "cpu  3 minute monitor" -v cpu DEF:cpu=./cpu.rrd:cpuds:AVERAGE LINE1:cpu#FF0000:'cpu avg'
#rrdtool graph cpu5.jpg --step 5 -s ${5minute} -t "cpu  5 minute monitor" -v cpu DEF:cpu=./cpu.rrd:cpuds:AVERAGE LINE1:cpu#FF0000:'cpu avg'

6、服務器批量管理

視圖(models)

def servers(request):
    if request.method == 'POST':
        hostgroup = request.POST.get("hostgroup","")
        model = request.POST.get("model","")
        user = request.POST.get("user","")
        command = request.POST.get("command","")
        os.environ['hostgroup']=str(hostgroup)
        os.environ['model']=str(model)
        os.environ['user']=str(user)
        os.environ['command']=str(command)
        output = commands.getoutput("sh /home/zqxt_form2/monitor/ansible.sh $hostgroup $model $user $command")
        return render(request,'servers.html',{'output':output})
    return render(request,'servers.html')

模板(templates)

	<h1>批量管理頁面</h1>
	<div class="login-01">
			<form action="/servers/"  method="post"> {% csrf_token %}
				<ul>
				<li class="first">
					<a href="#" class=" icon email"></a><input type="text" class="text" value="主機組" name="hostgroup"  onFocus="this.value = '';" onBlur="if (this.value == '') {this.value = '主機組';}" >
					<div class="clear"></div>
				</li>
                                <li class="first">
                                        <a href="#" class=" icon email"></a><input type="text" class="text" value="模塊名" name="model" onFocus="this.value = '';" onBlur="if (this.value == '') {this.value = '模塊名';}" >
                                        <div class="clear"></div>
                                </li>

				<li class="first">
					<a href="#" class=" icon email"></a><input type="text" class="text" value="用戶" name="user" onFocus="this.value = '';" onBlur="if (this.value == '') {this.value = '用戶';}" >
					<div class="clear"></div>
				</li>
				<li class="first">
					<a href="#" class=" icon phone"></a><input type="text" class="text" value="命令" name="command" onFocus="this.value = '';" onBlur="if (this.value == '') {this.value = '命令';}" >
					<div class="clear"></div>
				</li>
				<!--li class="second">
				<a href="#" class=" icon msg"></a><textarea value="Message" onFocus="this.value = '';" onBlur="if (this.value == '') {this.value = 'Comments';}">{{ output}}/textarea>
				<div class="clear"></div>
				</li-->
			</ul>
			<input type="submit" onClick="myFunction()" value="Submit" >
			<div class="clear"></div>
		</form>
   </div>   
   <div class="login-01">
         <form>
		     <li class="second">
				<a href="#" class=" icon phone"></a><textarea value="Message" onFocus="this.value = '';" onBlur="if (this.value == '') {this.value = '命令輸出結果';}">{{ output }}</textarea>
				<div class="clear"></div>
		     </li>
		 </form>
	</div>

ansible.sh

#!/bin/bash
ansible  $1 -m $2  -a "sudo su - '$3' -c '$4'"

 

 

3、運行效果

程序運行:python manage.py runserver 0.0.0.0:8080

訪問:http:/你服務器的ip:8080/

效果圖展現:

註冊頁面:

註冊.png

登陸:登陸.png

首頁面:

首頁01.png

首頁02.png資產編輯:

資產編輯.png

監控頁面:

監控頁面.png

 

服務器批量管理:

批量管理.png

4、文件截圖

blob.png

 

5、其餘補充

一、用於生產環境有哪些須要改善的地方

django須要配置nginx和uwsgi進行部署

 

 

注:本文著做權歸做者,由demo大師發表,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索