項目簡介:
項目介紹:自動化運維是未來的趨勢,最近學了不少東西,正好通過這個小項目把這些學的東西串起來,練練手。
基礎架構:
- 服務器端:web框架-Django
- 前端:html css jQuery bootstrap
- 腳本:shell
- 適用系統:redhat5.8/redhat6.6
平台已實現功能:
- 中間件和數據庫軟件的啟停和狀態檢查 (tomcat,nginx,apache,oracle,mysql)
完整功能設計圖:
效果圖:
架構圖(簡要):
項目源碼:https://github.com/SwimBalance/autoops4
shell腳本
1 #!/bin/sh 2 #Filename:starttomcat.sh 3 #需要傳入參數:$1 $2 $3 4 # $1:tomcat的home目錄 5 # $2:端口號 6 # $3:啟動tomcat超時時長 7 #輸出結果說明: 8 # 101:啟動成功 9 # 104:啟動超時 10 11 #寫日志函數 12 log(){ 13 echo `date +"%F %T"`" "$* >> /logs/tomcat.log 14 } 15 16 #開啟tomcat函數 17 starttomcat(){ 18 log "[command]:"$0" [parameters]:"$* 19 #啟動tomcat前需要調用checktomcat獲取tomcat狀態 20 status=`. /operation/tomcat/checktomcat.sh $1 $2` 21 #如果tomcat處於運行狀態,就不必再啟動,把狀態信息返回前端 22 if [ $status -eq 101 ];then 23 echo 101 24 #如果tomcat未運行,執行啟動操作 25 else 26 su - tomcat -c $1/bin/startup.sh >/dev/null 2>&1 27 #設置count計時 28 count=0 29 #每5秒檢查一次tomcat狀態,直到檢查到tomcat成功啟動或者超時 30 status=`. /operation/tomcat/checktomcat.sh $1 $2` 31 until [ $status -eq 101 ] || [ $count -ge $3 ] 32 do 33 sleep 5 34 let count=$count+5 35 status=`. /operation/tomcat/checktomcat.sh $1 $2` 36 done 37 #如果檢測到tomcat正常,判斷為啟動成功,返回狀態信息 38 if [ $status -eq 101 ];then 39 echo 101 40 #如果超時還未啟動成功,則判斷為啟動超時,返回啟動超時代號104 41 else 42 echo 104 43 fi 44 fi 45 } 46 47 starttomcat $1 $2 $3
views.py:tomcat操作響應函數
1 # 針對tomcat服務器的操作: 2 # 1.首先通過前台獲得ID 和 操作 3 # 2.通過ID 豐富信息 4 # 3.形成完整的操作SQL 5 # 4.執行SQL,返回結果 6 # 5.將操作信息及結果寫入操作記錄表,並將結果返回前台 7 # 6.前台收到信息更新tomcat現在運行狀態 8 def operation(request): 9 # 獲得前台信息 10 tomcat_id = request.GET.get('id') 11 tomcat_action = request.GET.get('action') 12 oper = request.COOKIES.get('loginname') 13 # 根據ID和action 獲得任務信息,並形成完整的操作SQL,都存入taskinfo中 14 taskinfo = get_taskinfo(tomcat_id, tomcat_action, oper) 15 # 傳入taskinfo,執行SQL操作,返回目標服務器控制台的結果 16 mytask = Task(taskinfo) 17 result = mytask.execute() 18 if result.isdigit(): 19 taskinfo['resulut'] = result 20 else: 21 taskinfo['resulut'] = '102' 22 # 將操作記錄寫入記錄表中,同時更新tomcatdata表中的狀態字段 23 genrecords_updatestatus(taskinfo) 24 # 將結果傳到前台 25 message = { 26 '101': 'Tomcat正常運行.', 27 '102': 'Tomcat異常,請人工檢查.', 28 '103': 'Tomcat服務關閉.', 29 '104': 'Tomcat啟動超時.', 30 '105': 'Tomcat關閉超時.', 31 } 32 return JsonResponse({ 33 'status': taskinfo['resulut'], 34 'message': message[taskinfo['resulut']], 35 }) 36 37 # 根據ID生成taskinfo 38 def get_taskinfo(tomcat_id, tomcat_action, oper): 39 with connection.cursor() as cursor: 40 cursor.execute( 41 'SELECT id, tomcatport, tomcathome, ipaddress, startwait, stopwait FROM tomcatdata WHERE id = %s' % tomcat_id 42 ) 43 tomcater = dictfetchall(cursor)[0] 44 serverip = tomcater['ipaddress'] 45 cursor.execute( 46 "SELECT user1,password1 FROM machine_pwd WHERE ipaddress = '%s'" % serverip 47 ) 48 userinfo = dictfetchall(cursor)[0] 49 if tomcat_action == 'check_tomcat': 50 tomcat_home = tomcater['tomcathome'] 51 tomcat_port = tomcater['tomcatport'] 52 command = 'sh /operation/tomcat/checktomcat.sh %s %s ' % (tomcat_home, tomcat_port) 53 elif tomcat_action == 'start_tomcat': 54 # 需要傳入三個參數 home目錄/端口號/啟動超時時長 55 tomcat_home = tomcater['tomcathome'] 56 tomcat_port = tomcater['tomcatport'] 57 start_wait = tomcater['startwait'] 58 # sh_dir = '/operation/tomcat/starttomcat.sh' 59 command = 'sh /operation/tomcat/starttomcat.sh %s %s %s ' % (tomcat_home, tomcat_port, start_wait) 60 elif tomcat_action == 'stop_tomcat': 61 # 需要傳入三個參數 home目錄/端口號/啟動超時時長 62 tomcat_home = tomcater['tomcathome'] 63 tomcat_port = tomcater['tomcatport'] 64 stop_wait = tomcater['stopwait'] 65 # sh_dir = '/operation/tomcat/starttomcat.sh' 66 command = 'sh /operation/tomcat/stoptomcat.sh %s %s %s ' % (tomcat_home, tomcat_port, stop_wait) 67 task_info = { 68 'id': tomcat_id, 69 'action': tomcat_action, 70 'oper': oper, 71 'ip': tomcater['ipaddress'], 72 'user': userinfo['user1'], 73 'pwd': userinfo['password1'], 74 'cmd': command, 75 'result': '' 76 } 77 return task_info 78 79 80 # 寫入操作記錄並更新tomcat狀態 81 def genrecords_updatestatus(taskinfo): 82 with connection.cursor() as cursor: 83 sqlstatement1 = "insert into audit_log (oper_user, oper_command, oper_message) VALUES ('%s', '%s', '%s')" % ( 84 taskinfo['oper'], taskinfo['cmd'], taskinfo['resulut']) 85 sqlstatement2 = "update tomcatdata set status = %d where id = %r" % (int(taskinfo['resulut']), taskinfo['id']) 86 cursor.execute(sqlstatement1) 87 cursor.execute(sqlstatement2)
Task類
1 import paramiko 2 3 4 class Task(object): 5 def __init__(self, task_info): 6 self.task_info = task_info 7 8 def create_connect(self): 9 # 創建SSH對象 10 connectObj = paramiko.SSHClient() 11 # 把要連接的機器添加到known_hosts文件中 12 connectObj.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 13 # 連接服務器 14 connectObj.connect( 15 hostname=self.task_info['ip'], 16 username=self.task_info['user'], 17 password=self.task_info['pwd'], 18 port=22, 19 timeout=10 20 ) 21 # 判斷是否連接成功 22 ################### 23 return connectObj 24 25 def execute(self): 26 try: 27 connectObj = self.create_connect() 28 except: 29 return '102' 30 cmd = self.task_info['cmd'] 31 stdin, stdout, stderr = connectObj.exec_command(cmd) 32 result = stdout.read() 33 connectObj.close() 34 if not result: 35 result = stderr.read().strip() 36 return result.decode().strip()
js文件
1 $(function () { 2 $("ul[id='servicemgr'] li").click(function () { 3 <!-- 導入workPage--> 4 if (this.id == 'toms') { 5 $("#workpage").empty().load("/static/maintenance/html/workpage.html #tom_workpage"); 6 $.ajax({ 7 type: "GET", 8 url: "./../tomcatData/", 9 datatype: 'json', 10 data: {page: 1}, 11 success: function (datas) { 12 loadtomcatdata(datas) 13 } 14 }); 15 } else if (this.id == 'oras') { 16 $("#workpage").empty().load("/static/maintenance/html/workpage.html #ora_workpage"); 17 $.ajax({ 18 type: "GET", 19 url: "./../oracleData/", 20 datatype: 'json', 21 success: function (datas) { 22 loadoracledata(datas) 23 } 24 }) 25 } 26 }); 27 }); 28 29 // 針對tomcat服務器的操作 30 function opt_tomcat(obj) { 31 var tomcat_mes = $("#tomcat_mes"); 32 tomcat_mes.empty().append("正在玩命操作,請等待…"); 33 var id = obj.id; 34 var action = obj.name; 35 $.ajax({ 36 type: 'Get', 37 url: './../operation', 38 data: {'id': id, 'action': action}, 39 success: function (data) { 40 tomcat_mes.empty().append(data['message']); 41 //更新狀態 42 if (data['status'] == '101') { 43 $(obj).parent().prevAll('.status').children('span').attr('class', 'glyphicon glyphicon-ok-sign') 44 } else if (data['status'] == '102' || data['status'] == '104' || data['status'] == '105') { 45 $(obj).parent().prevAll('.status').children('span').attr('class', 'glyphicon glyphicon-exclamation-sign') 46 } else if (data['status'] == '103') { 47 $(obj).parent().prevAll('.status').children('span').attr('class', 'glyphicon glyphicon-remove-sign') 48 } 49 } 50 }) 51 } 52 // 分頁 53 function page(obj) { 54 var page_number = $(obj).text(); 55 $.ajax({ 56 type: "GET", 57 url: "./../tomcatData/", 58 datatype: 'json', 59 data: {page: page_number}, 60 success: function (datas) { 61 loadtomcatdata(datas) 62 } 63 }); 64 } 65 //導入tomcat數據 66 function loadtomcatdata(datas) { 67 var text = $('.text'); 68 text.empty(); 69 var html = ''; 70 for (var i = 0; i < datas.length; i++) { 71 var id = datas[i]['id']; 72 var ip = datas[i]['ipaddress']; 73 var host = datas[i]['machine']; 74 var dec = datas[i]['description']; 75 var status = datas[i]['status']; 76 html += '<tr>'; 77 html += '<td>' + id + '</td>'; 78 html += '<td>' + ip + '</td>'; 79 html += '<td>' + host + '</td>'; 80 html += '<td>' + dec + '</td>'; 81 // html += '<td class="status">' + status + '</td>'; 82 //更新狀態 83 if (status == '101') { 84 html += '<td class="status"><span class="glyphicon glyphicon-ok-sign" aria-hidden="true"></span></td>'; 85 } else if (status == '102' || status == '104' || status == '105') { 86 html += '<td class="status"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span></td>'; 87 } else if (status == '103') { 88 html += '<td class="status"><span class="glyphicon glyphicon-remove-sign" aria-hidden="true"></span></td>'; 89 } 90 html += '<td>' + '<button id=' + id + ' onclick="opt_tomcat(this)" name="check_tomcat" class="btn btn-default" data-toggle="modal" data-target="#myModal">'; 91 html += '<span class="glyphicon glyphicon-check" aria-hidden="true"></span></button></td>'; 92 html += '<td>' + '<button id=' + id + ' onclick="opt_tomcat(this)" name="start_tomcat" class="btn btn-default" data-toggle="modal" data-target="#myModal">'; 93 html += '<span class="glyphicon glyphicon-play" aria-hidden="true"></span></button></td>'; 94 html += '<td>' + '<button id=' + id + ' onclick="opt_tomcat(this)" name="stop_tomcat" class="btn btn-default" data-toggle="modal" data-target="#myModal">'; 95 html += '<span class="glyphicon glyphicon-stop" aria-hidden="true"></span></button></td>'; 96 html += '</tr>'; 97 } 98 text.append(html); 99 100 } 101 //搜索欄 102 function searchtomcat() { 103 104 var search_val = $('#search_tom').val(); 105 $.ajax({ 106 type: "GET", 107 url: "/../searchtomcat/", 108 data: {'data': search_val}, 109 datatype: "json", 110 success: function (datas) { 111 loadtomcatdata(datas); 112 $('#preandnext').empty() 113 } 114 }) 115 }
index.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 {% load static %} 5 <title>自動化運維</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <!-- 引入 Bootstrap --> 8 <link href="{% static 'maintenance/bootstrap3.3.7/css/bootstrap.min.css' %}" rel="stylesheet"> 9 <meta charset="UTF-8"> 10 <!-- 導入Jquery文件--> 11 <script src="{% static 'maintenance/js/jquery-3.2.1.min.js' %}"></script> 12 <!--導入bootstrap中的js 插件--> 13 <script src="{% static 'maintenance/bootstrap3.3.7/js/bootstrap.min.js' %}"></script> 14 <!--導入自己的js文件--> 15 <script src="{% static 'maintenance/js/show_workpage.js' %}"></script> 16 <style> 17 .glyphicon-ok-sign{color:green} 18 .glyphicon-exclamation-sign{color:crimson;} 19 .glyphicon-remove-sign{color:darkgray} 20 </style> 21 </head> 22 <body> 23 <div class=" container-fluid"> 24 <div class="row"> 25 <div class="col-lg-12" style="text-align:center;background-color: #9acfea"> 26 <h3>AUTO OPERATION 27 <small>自動化運維平台</small> 28 </h3> 29 </div> 30 </div> 31 <div class="row "> 32 <div class="col-lg-2" style="margin-left :-15px;"> 33 <ul class="nav nav-pills nav-stacked"> 34 <li id="home" role="presentation" class="active"><a href="javascript:void(0)">主頁</a></li> 35 <li class="active"> 36 <a href="#servicemgr" class="nav-header collapsed " data-toggle="collapse"> 37 <i class="glyphicon glyphicon-cog"></i>服務管理 38 <span class="pull-right glyphicon glyphicon-chevron-toggle"></span> 39 </a> 40 <ul id="servicemgr" class="nav nav-list collapse in" style="list-style: none"> 41 <li id="oras" role="presentation"><a href="javascript:void(0)">Oracle服務管理</a></li> 42 <li id="mysqls" role="presentation"><a href="javascript:void(0)">MySQL服務管理</a></li> 43 <li id="toms" role="presentation"><a href="javascript:void(0)">Tomcat服務管理</a></li> 44 <li id="apache" role="presentation"><a href="javascript:void(0)">Apache服務管理</a></li> 45 <li id="nginx" role="presentation"><a href="javascript:void(0)">NGINX服務管理</a></li> 46 </ul> 47 </li> 48 <li class="active"> 49 <a href="#systemsetting" class="nav-header collapsed " data-toggle="collapse"> 50 <i class="glyphicon glyphicon-cog"></i>系統管理 51 <span class="pull-right glyphicon glyphicon-chevron-toggle"></span> 52 </a> 53 <ul id="systemsetting" class="nav nav-list collapse in"> 54 <li class="active"><a href="#"><i class="glyphicon glyphicon-user"></i> 用戶信息維護</a></li> 55 <li><a href="javascript:void(0)"><i class="glyphicon glyphicon-th-list"></i> 應用系統信息維護</a></li> 56 <li><a href="javascript:void(0)"><i class="glyphicon glyphicon-asterisk"></i> 服務器信息維護</a></li> 57 <li><a href="javascript:void(0)"><i class="glyphicon glyphicon-eye-open"></i> 日志查看</a></li> 58 </ul> 59 </li> 60 </ul> 61 </div> 62 <div class="col-lg-10"> 63 <div id="workpage"></div> 64 <!-- 模態框(Modal) --> 65 <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" 66 aria-hidden="true"> 67 <div class="modal-dialog"> 68 <div class="modal-content"> 69 <div class="modal-header"> 70 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 71 <h4 class="modal-title" id="myModalLabel">操作結果</h4> 72 </div> 73 <div class="modal-body" id="tomcat_mes"></div> 74 <div class="modal-footer"> 75 <button type="button" class="btn btn-default" data-dismiss="modal">關閉</button> 76 </div> 77 </div><!-- /.modal-content --> 78 </div><!-- /.modal --> 79 </div> 80 </div> 81 </div> 82 <div class="page-footer"></div> 83 </div> 84 85 </body> 86 </html>
workpage.html
1 <!-- tomcat工作頁--> 2 <div id="tom_workpage"> 3 <div style="border: 1px;"> 4 <div class="row"> 5 <ol class="breadcrumb"> 6 <li><a href="#">Home</a></li> 7 <li class="active">Tomcat</li> 8 </ol> 9 <div class="row"> 10 <div class="col-lg-6" style="float: right"> 11 <div class="input-group"> 12 <input id="search_tom" type="text" class="form-control" placeholder="IP/服務器名稱" onkeydown="if(event.keyCode==13) {searchtomcat()}"> 13 <span class="input-group-btn"> 14 <button class="btn btn-default" type="button" onclick="searchtomcat()">查找</button> 15 </span> 16 </div><!-- /input-group --> 17 </div><!-- /.col-lg-6 --> 18 </div><!-- /.row --> 19 <table class="table table-hover table-condensed"> 20 <caption><strong>Tomcat應用服務器清單</strong></caption> 21 <thead> 22 <tr> 23 <th>ID</th> 24 <th>IP</th> 25 <th>主機名</th> 26 <th>概要</th> 27 <th>狀態</th> 28 <th>檢查</th> 29 <th>開啟</th> 30 <th>停止</th> 31 </tr> 32 </thead> 33 <tbody class="text"> 34 35 </tbody> 36 </table> 37 </div> 38 <nav id="preandnext" style="text-align: center"> 39 <ul class="pagination" style="margin: 0"> 40 <li onclick="previousPage(this)"><a href="javascript:void(0)">«</a></li> 41 <li onclick="page(this)"><a href="javascript:void(0)">1</a></li> 42 <li onclick="page(this)"><a href="javascript:void(0)">2</a></li> 43 <li onclick="page(this)"><a href="javascript:void(0)">3</a></li> 44 <li onclick="page(this)"><a href="javascript:void(0)">4</a></li> 45 <li onclick="page(this)"><a href="javascript:void(0)">5</a></li> 46 <li onclick="nextPage(this)"><a href="javascript:void(0)">»</a></li> 47 </ul> 48 </nav> 49 </div> 50 </div>
這個小項目還會繼續做下去,期望能達到當初自己設計的那樣。。。。。。。