2017年的上半年對我來說是極其難忘的一年,整個樂橙營運部的平台運維全靠我一個人,而且同時公司又新上了一個阿裡深圳區一個阿裡公有雲一個杭州公有雲三套環境外加一套示範環境。是以一直念叨的運維背景始終拖拖拉拉沒有兌現,現在公司社招來一個小弟給我打下手,使得我終于可以從麻煩的瑣事中脫身,有時間去把這個小心願完成,于是就有了這一系列文章,主要是給自己一個記錄也是為了友善後來人。
首先,先說一下我的環境,本人使用阿裡雲centos7.0,django的版本是1.10.3,python是2.7,django目錄就是/django。
首先在/django裡#django-admin startproject DahuaCloud,建立一個叫DahuaCloud的project,然後#cd /django/DahuaCloud,#django-admin startapp Online,建立了一個叫Online的app。
建立完畢之後我們發現,在DahuaCloud下多了一個叫Online的檔案夾,這個時候我們需要執行如下幾個步驟:
1)進入到DahuaCloud下的同名檔案夾,編輯settings.py檔案,把ALLOWED_HOSTS = [],裡面加上“*”,否則打不開網頁;
2)還是在settings.py檔案裡,在INSTALLED_APPS這一欄下面追加‘Online’;
3)繼續編輯settings.py檔案,在DATABASES這一欄裡面寫上自己的資料庫資訊,比如我的資訊就是這樣:
<a href="https://s4.51cto.com/wyfs02/M02/9B/96/wKioL1lku3rRaBcYAABQ9Qkl7yw356.png" target="_blank"></a>
可見我這個平台的所有資料都儲存到了本機的mysql裡面的dahuacloud這個database裡了。
4)進入mysql,#CREATE DATABASE `dahuacloud` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 這樣建立dahuacloud的database;
5)傳回到/django/DahuaCloud,執行#python manage.py makemigrations和#python manage.py migrate;
6)執行#python manage.py createsuperuser,建立一個超級使用者,這個使用者是可以登入網頁背景的;
7)執行#python manage.py runserver 0.0.0.0:8000,這樣就可以在浏覽器裡輸入這個伺服器的“外網位址:8000”看到一個簡易的背景界面,輸入上面剛剛建立的使用者名和密碼就可以進去了。
至此整個準備工作完成,下面是今天的重點工作。
公司目前的整個雲資源的情況如下,本人靈魂畫師,請大家領會精神:
可以看出,公司在阿裡雲裡面有四個業務方面的伺服器叢集,以及一組SLB和一組RDS。我們現在就要建立一個資料表來記錄這些雲資源的資訊。
首先進入到Online這個檔案夾裡,編輯models.py,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<code># -*- coding: UTF-8 -*-</code>
<code>from</code> <code>__future__ </code><code>import</code> <code>unicode_literals</code>
<code>from</code> <code>django.db </code><code>import</code> <code>models</code>
<code>class</code> <code>alionlineECS(models.Model): </code><code>#所有阿裡線上的伺服器取名叫alionlineECS</code>
<code> </code><code>#雲伺服器的用途選擇,作為ecs_type的選項 </code>
<code> </code><code>type</code> <code>=</code> <code>( </code>
<code> </code><code>(U</code><code>'HZ'</code><code>,</code><code>'樂橙杭州'</code><code>), </code>
<code> </code><code>(U</code><code>'SZ'</code><code>,</code><code>'樂橙深圳'</code><code>),</code>
<code> </code><code>(U</code><code>'OPEN'</code><code>,</code><code>'開放平台'</code><code>),</code>
<code> </code><code>(U</code><code>'PAAS'</code><code>,</code><code>'公有雲統一PAAS'</code><code>), </code>
<code> </code><code>)</code>
<code> </code><code>#verbose_name可以讓admin背景顯示自定義的中文名字,而非字段</code>
<code> </code><code>ecs_name </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'雲伺服器名稱'</code><code>,max_length</code><code>=</code><code>120</code><code>)</code>
<code> </code><code>#choices找到type元組,并調用相關内容</code>
<code> </code><code>ecs_type </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'雲伺服器類型'</code><code>,max_length</code><code>=</code><code>50</code><code>,choices</code><code>=</code><code>type</code><code>)</code>
<code> </code><code>#IPAddressField這個可以精确檢查是否輸入的是一個IPv4或者IPv6位址</code>
<code> </code><code>ecs_inip </code><code>=</code> <code>models.GenericIPAddressField(verbose_name</code><code>=</code><code>'雲伺服器内網位址'</code><code>)</code>
<code> </code><code>#blank為空,代表在form中可以允許不填</code>
<code> </code><code>ecs_outip </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'雲伺服器外網位址'</code><code>,max_length</code><code>=</code><code>20</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>ecs_ipwidth </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'雲伺服器外網帶寬'</code><code>,max_length</code><code>=</code><code>50</code><code>,default</code><code>=</code><code>'0M'</code><code>)</code>
<code> </code><code>#default表示預設值</code>
<code> </code><code>ecs_spec </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'雲伺服器配置'</code><code>,max_length</code><code>=</code><code>50</code><code>,default</code><code>=</code><code>'2H2G'</code><code>)</code>
<code> </code><code>ecs_remarks </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'備注'</code><code>,max_length</code><code>=</code><code>255</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>ecs_signer </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'登記人'</code><code>,max_length</code><code>=</code><code>50</code><code>,default</code><code>=</code><code>'陳男神'</code><code>) </code>
<code> </code><code>#登記時間設定為自動記錄,不會出現在選項中</code>
<code> </code><code>ecs_signtime </code><code>=</code> <code>models.DateField(auto_now_add</code><code>=</code><code>True</code><code>)</code>
<code> </code>
<code> </code><code>#傳回相應的值</code>
<code> </code><code>def</code> <code>__unicode__(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>self</code><code>.ecs_name</code>
然後在同檔案夾的admin.py編輯成如下樣子:
<code># -*- coding: UTF-8 -*- </code>
<code>from</code> <code>django.contrib </code><code>import</code> <code>admin</code>
<code>from</code> <code>.models </code><code>import</code> <code>alionlineECS </code><code>#對應剛剛建立的那個alionlineECS</code>
<code>class</code> <code>EcsAdmin(admin.ModelAdmin): </code><code>#這裡就直接寫EcsAdmin</code>
<code> </code><code>list_display </code><code>=</code> <code>(</code><code>'ecs_name'</code><code>,</code><code>'ecs_type'</code><code>,</code><code>'ecs_inip'</code><code>,</code><code>'ecs_outip'</code><code>,</code><code>'ecs_ipwidth'</code><code>,</code><code>'ecs_spec'</code><code>,</code><code>'ecs_remarks'</code><code>,</code><code>'ecs_signer'</code><code>)</code>
<code> </code><code>#在編輯、新增頁面上排除ecs_signer的選項 </code>
<code> </code><code>exclude </code><code>=</code> <code>[</code><code>'ecs_signer'</code><code>]</code>
<code> </code><code>#對儲存函數進行更改,将登入使用者設定為登記人 </code>
<code> </code><code>def</code> <code>save_model(</code><code>self</code><code>,request,obj,form,change):</code>
<code> </code><code>obj.ecs_signer </code><code>=</code> <code>str</code><code>(request.user)</code>
<code> </code><code>obj.save()</code>
<code>admin.site.register(alionlineECS,EcsAdmin)</code>
儲存退出之後,在/django/DahuaCloud裡重新執行#python manage.py makemigrations和#python manage.py migrate,然後#python manage.py runserver 0.0.0.0:8000啟動背景就會看到效果。
對于SLB和RDC都是同理,在model.py下接着編輯:
31
32
33
34
35
<code>#建立負載均衡資料表</code>
<code>class</code> <code>SLB(models.Model): </code>
<code> </code><code>env </code><code>=</code> <code>(</code>
<code> </code><code>(u</code><code>'online'</code><code>,</code><code>'線上環境'</code><code>),</code>
<code> </code><code>(u</code><code>'func'</code><code>,</code><code>'測試環境'</code><code>),</code>
<code> </code><code>type</code> <code>=</code> <code>(</code>
<code> </code><code>(</code><code>'in'</code><code>,</code><code>'私網'</code><code>),</code>
<code> </code><code>(</code><code>'out'</code><code>,</code><code>'公網'</code><code>),</code>
<code> </code><code>algorithm </code><code>=</code> <code>(</code>
<code> </code><code>(</code><code>'權重輪詢'</code><code>,</code><code>'權重輪詢'</code><code>),</code>
<code> </code><code>(</code><code>'最小連接配接數'</code><code>,</code><code>'最小連接配接數'</code><code>),</code>
<code> </code><code>(</code><code>'輪詢'</code><code>,</code><code>'輪詢'</code><code>),</code>
<code> </code><code>protocol </code><code>=</code> <code>(</code>
<code> </code><code>(</code><code>'tcp'</code><code>,</code><code>'tcp'</code><code>),</code>
<code> </code><code>(</code><code>'http'</code><code>,</code><code>'http'</code><code>),</code>
<code> </code><code>(</code><code>'https'</code><code>,</code><code>'https'</code><code>),</code>
<code> </code><code>slb_name </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'負載均衡名稱'</code><code>,max_length</code><code>=</code><code>100</code><code>)</code>
<code> </code><code>slb_type </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'網絡類型'</code><code>,max_length</code><code>=</code><code>30</code><code>,choices</code><code>=</code><code>type</code><code>,default</code><code>=</code><code>'公網'</code><code>)</code>
<code> </code><code>slb_algorithm </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'轉發規則'</code><code>,max_length</code><code>=</code><code>50</code><code>,choices</code><code>=</code><code>algorithm,default</code><code>=</code><code>'最小連接配接數'</code><code>)</code>
<code> </code><code>slb_ip </code><code>=</code> <code>models.GenericIPAddressField(verbose_name</code><code>=</code><code>'ip位址'</code><code>)</code>
<code> </code><code>slb_protocol </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'負載均衡協定'</code><code>,max_length</code><code>=</code><code>50</code><code>,choices</code><code>=</code><code>protocol) </code>
<code> </code><code>slb_fport </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'前端端口'</code><code>,max_length</code><code>=</code><code>10</code><code>)</code>
<code> </code><code>slb_bport </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'後段端口'</code><code>,max_length</code><code>=</code><code>10</code><code>)</code>
<code> </code><code>slb_protocol1 </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'負載均衡協定'</code><code>,max_length</code><code>=</code><code>50</code><code>,choices</code><code>=</code><code>protocol,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>slb_fport2 </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'前端端口'</code><code>,max_length</code><code>=</code><code>10</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>slb_bport2 </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'後段端口'</code><code>,max_length</code><code>=</code><code>10</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>slb_signer </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'登記人'</code><code>,max_length</code><code>=</code><code>30</code><code>,default</code><code>=</code><code>'陳男神'</code><code>)</code>
<code> </code><code>slb_signtime </code><code>=</code> <code>models.DateField(auto_now_add</code><code>=</code><code>True</code><code>) </code>
<code> </code><code>slb_remarks </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'備注'</code><code>,max_length</code><code>=</code><code>255</code><code>,blank</code><code>=</code><code>True</code><code>) </code>
<code> </code><code>def</code> <code>__unicode__(</code><code>self</code><code>): </code>
<code> </code><code>return</code> <code>self</code><code>.slb_name</code>
<code>#建立資料庫資訊表</code>
<code>class</code> <code>RDS(models.Model): </code>
<code> </code><code>#node = models.ForeignKey(Node, on_delete=models.PROTECT)</code>
<code> </code><code>mysql </code><code>=</code> <code>( </code>
<code> </code><code>(</code><code>'mysql5.7'</code><code>,</code><code>'mysql5.7'</code><code>),</code>
<code> </code><code>(</code><code>'mysql5.6'</code><code>,</code><code>'mysql5.6'</code><code>),</code>
<code> </code><code>(</code><code>'mysql5.5'</code><code>,</code><code>'mysql5.5'</code><code>),</code>
<code> </code><code>) </code>
<code> </code><code>spec </code><code>=</code> <code>(</code>
<code> </code><code>(</code><code>'1H1G'</code><code>,</code><code>'1H1G'</code><code>), </code>
<code> </code><code>(</code><code>'2H2G'</code><code>,</code><code>'2H2G'</code><code>),</code>
<code> </code><code>(</code><code>'2H4G'</code><code>,</code><code>'2H4G'</code><code>),</code>
<code> </code><code>(</code><code>'4H4G'</code><code>,</code><code>'4H4G'</code><code>),</code>
<code> </code><code>(</code><code>'4H8G'</code><code>,</code><code>'4H8G'</code><code>),</code>
<code> </code><code>(</code><code>'其他'</code><code>,</code><code>'其他'</code><code>)</code>
<code> </code><code>(</code><code>'正常執行個體'</code><code>,</code><code>'正常執行個體'</code><code>),</code>
<code> </code><code>(</code><code>'隻讀執行個體'</code><code>,</code><code>'隻讀執行個體'</code><code>),</code>
<code> </code><code>rds_name </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'資料庫名稱'</code><code>,max_length</code><code>=</code><code>100</code><code>)</code>
<code> </code><code>rds_type </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'資料庫類型'</code><code>,max_length</code><code>=</code><code>100</code><code>,choices</code><code>=</code><code>type</code><code>,default</code><code>=</code><code>'正常執行個體'</code><code>)</code>
<code> </code><code>rds_mysql </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'mysql版本'</code><code>,max_length</code><code>=</code><code>50</code><code>,choices</code><code>=</code><code>mysql,default</code><code>=</code><code>'mysql5.6'</code><code>)</code>
<code> </code><code>rds_spec </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'資料庫規格'</code><code>,max_length</code><code>=</code><code>50</code><code>,choices</code><code>=</code><code>spec,default</code><code>=</code><code>'1H1G'</code><code>)</code>
<code> </code><code>rds_remark </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'備注'</code><code>,max_length</code><code>=</code><code>255</code><code>,blank</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>rds_ip </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'資料庫位址'</code><code>,max_length</code><code>=</code><code>50</code><code>)</code>
<code> </code><code>rds_status </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'存儲空間'</code><code>,max_length</code><code>=</code><code>10</code><code>,default</code><code>=</code><code>'20G'</code><code>)</code>
<code> </code><code>rds_signer </code><code>=</code> <code>models.CharField(verbose_name</code><code>=</code><code>'登記人'</code><code>,max_length</code><code>=</code><code>30</code><code>,default</code><code>=</code><code>'system'</code><code>)</code>
<code> </code><code>rds_signtime </code><code>=</code> <code>models.DateField(auto_now_add</code><code>=</code><code>True</code><code>) </code>
<code> </code>
<code> </code><code>return</code> <code>self</code><code>.rds_name</code>
admin.py也要跟着在後面添加如下内容:
<code>class</code> <code>SLBAdmin(admin.ModelAdmin): </code>
<code> </code><code>list_display </code><code>=</code> <code>(</code><code>'slb_name'</code><code>,</code><code>'slb_type'</code><code>,</code><code>'slb_ip'</code><code>,</code><code>'slb_signer'</code><code>,</code><code>'slb_remarks'</code><code>)</code>
<code> </code><code>#在編輯、新增頁面上排除line_signer的選項 </code>
<code> </code><code>exclude </code><code>=</code> <code>[</code><code>'slb_signer'</code><code>] </code>
<code> </code><code>def</code> <code>save_model(</code><code>self</code><code>, request, obj, form, change): </code>
<code> </code><code>obj.slb_signer </code><code>=</code> <code>str</code><code>(request.user) </code>
<code> </code><code>obj.save() </code>
<code>class</code> <code>RDSAdmin(admin.ModelAdmin): </code>
<code> </code><code>#在編輯、新增頁面上排除device_signer的選項</code>
<code> </code><code>list_display </code><code>=</code> <code>(</code><code>'rds_name'</code><code>,</code><code>'rds_spec'</code><code>,</code><code>'rds_ip'</code><code>,</code><code>'rds_remark'</code><code>,</code><code>'rds_signer'</code><code>) </code>
<code> </code><code>exclude </code><code>=</code> <code>[</code><code>'rds_signer'</code><code>]</code>
<code> </code><code>def</code> <code>save_model(</code><code>self</code><code>, request, obj, form, change):</code>
<code> </code><code>obj.rds_signer </code><code>=</code> <code>str</code><code>(request.user) </code>
<code> </code><code>obj.save() </code>
<code> </code>
<code>admin.site.register(SLB,SLBAdmin)</code>
<code>admin.site.register(RDS,RDSAdmin)</code>
同步更新了資料庫并且打開了前端頁面,就會看到這樣的效果:
<a href="https://s4.51cto.com/wyfs02/M01/9B/98/wKiom1lkwprxn7iXAACMvwBCPnw204.png" target="_blank"></a>
這個時候我們就可以在網頁上添加具體的資訊了,比如說增加雲伺服器的資訊:
<a href="https://s5.51cto.com/wyfs02/M00/9B/A0/wKioL1llggrjscmMAABEeOQrE6E164.png" target="_blank"></a>
增加資訊之後,看到的效果就是:
<a href="https://s4.51cto.com/wyfs02/M00/9B/A1/wKiom1llgl6h4kz_AABmg32TS6A570.png" target="_blank"></a>
至此整個簡單增删改查的資料資訊庫就算完成了!
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1946427