標籤:控制台 失敗 就會 一個 mobile 地址 remote 左側菜單 網址
馬上要過年了,各位營運們除了因為買不到回家的火車票而嚎嚎大哭之外也開始擴容伺服器和提前調整監控值,目的就是為了過一個消停的春節。可是這畢竟十天左右不在公司,要是模組真出了什麼意外肯定沒法第一找到日誌分析問題,畢竟這幾天都在串門拜年和醉生夢死中度過,走到哪都要再背一個筆記本實在太不方便了。
那麼這個時候,我就琢磨使用手機端來啟動伺服器裡指令碼,讓這個指令碼可以去擷取當前的日誌,然後再把結果返回到手機端。這樣就不用到哪裡都帶那個一看就很掃興的公司膝上型電腦了。
使用手機端啟動伺服器裡指令碼?我又不會開發android和ios,那麼肯定就要使用第三方工具,我條件反射的想到了jenkins,因為jenkins是用手機可以登入的,那麼在手機端得到結果用什麼呢?在公眾號和DingTalk機器人裡,我選擇了DingTalk機器人。
創造DingTalk機器人
我的DingTalk版本是4.2.6.37,首先在左上方頭像的三角菜單有一個機器人管理
,
然後選擇自訂機器人,給它起個名又換一個表徵圖之後,添加到一個群聊裡,
添加的時候,這個機器人會產生一個webhook
,它的結構應該是:https://oapi.dingtalk.com/robot/send?access_token=XXX
,後面的XXX是標識符,不同的標識符代表不同的機器人,這個標識符如果丟了,可以在機器人頭像點擊一下然後選擇機器人設定
重新看到。
編寫機器人指令碼
機器人的官方說明網址就是https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.zZIvnt&treeId=257&articleId=105735&docType=1
,這裡面已經把使用方法寫的夠清楚了。我這裡的這個python指令碼是用json的格式,如下:
#!/bin/python #coding: utf-8 import json,urllib2 #這裡是機器人對應的Webhook地址 url = "https://oapi.dingtalk.com/robot/send?access_token=這裡輸入你機器人的標識符 #這裡是頭,原樣複製就好 header = { "Content-Type": "application/json", "charset": "utf-8" } #這裡是傳送的訊息 data = { "msgtype": "text", "text": { "content": "這裡是訊息本文!" }, "at": { "atMobiles": [ "A的手機號", "B的手機號" ], "isAtAll":False #這裡True代表要發給所有人,False的話,要代表訊息只發給A和B這兩個人 } } sendData = json.dumps(data) request = urllib2.Request(url,data = sendData,headers = header) urlopen = urllib2.urlopen(request) print urlopen.read()
直接執行這個指令碼,就會看到我剛建立的DingTalk機器人在群聊裡說話了。
機器人搭配nginx
上面那個指令碼已經可以初步實現我們的目的,但是有一個缺點,就是本文內容不能過長。但是我想多列印一點日誌,至少50行,怎麼辦?我想了想,可以把日誌放進nginx的一個網頁裡,然後用DingTalk機器人反饋這個網頁地址啊,這樣內容想寫多少就可以寫多少了。
假設我現在擷取到的日誌的檔案寫進一個叫chairmanmao.html
裡,在瀏覽器開啟看是這樣的:
那麼上面那個機器人的python指令碼就要改成這樣:
#!/bin/python #coding: utf-8 import json,urllib2,commands commands.getstatusoutput(‘echo -e "THIS IS TEST MESSAGE! \n" > /路徑/chairmantail.html‘) #這裡可以給網頁加一個標題 commands.getstatusoutput(‘cat /路徑/chairmanmao.txt >> /路徑/chairmanmao.html‘) #這裡就是把詩詞寫進html檔案裡 #這裡是機器人的webhook地址 url = "https://oapi.dingtalk.com/robot/send?access_token=這裡輸入你機器人的標識符" header = { "Content-Type": "application/json", "charset": "utf-8" } data = { "msgtype": "link", "link": { "text": "點擊網址就可擷取到本次日誌查詢的結果", "title": "日誌查詢結果已經產生!", "picUrl": "http://p1x3hd2at.bkt.clouddn.com/nanshen.jpg", #這裡可以加一個縮圖片 "messageUrl": "http://伺服器外網IP地址/chairmanmao.html" }, "at": { "isAtAll":True # at為非必須 } } sendData = json.dumps(data) request = urllib2.Request(url,data = sendData,headers = header) urlopen = urllib2.urlopen(request) print urlopen.read()
執行這個指令碼可以看到機器人發送的資訊如下:
然後開啟這個網址,就看到完整的網頁資訊:
到時候把毛主席詩詞換成實際的記錄檔就好了,不用一口氣列印所有的日誌出來,tail -n 50 記錄檔名
,50行足夠用了。
配置Jenkins
指令碼寫完了,機器人也寫完了,這個時候就要添加“啟動端”。安裝Jenkins的步驟我這裡就不寫了,直接可以去看https://rorschachchan.github.io/2018/02/05/Jenkins安裝與建立簡單任務/
。現在去登入Jenkins的網頁,去添加一個新的Job,比如我這個Job就叫“擷取模組日誌”,
如果是要在Jenkins上去讀取其他伺服器的日誌,就可以在構建project
的時候選擇參數化構建過程
,然後配置參數ip,到時候把這些ip傳遞給目標指令碼。如果覺得這樣hold不住,可以不用jenkins的這個功能,把ip寫到指令碼裡去,一了百了:
在構建
那一步,選擇Execute Shell
,然后里面寫上具體的shell命令,如果在上面使用了參數,那麼參數就可以在這裡使用,我的指令碼裡是沒有ip這個參數的,在圖裡寫$ip
就是做一個例子講解一下用法而已:
在構建後操作
這一步可以選擇E-mail Notification
,這樣如果失敗了會發送郵件通知。如果用不著就什麼都不用選。然後就是儲存好這個project,點擊左側功能表列的立即構建
,就會看到下面Build History
會多一個#1
出來,同時DingTalk機器人也在群裡發訊息,這個#1
就是構建的記錄,這個紀錄多了的話,新紀錄會覆蓋掉老的記錄。
點擊這個#1
,選擇控制台輸出
,就能看到具體的操作結果了,跟在shell介面裡執行的效果差不多的。可見操作成功,目的已經達到了!
以後需要呼叫指令碼,就在手機端瀏覽器裡登陸jenkins,然後構建一下這個project,同時就可以看到DingTalk裡機器人有反饋了。
參考資料
https://xu3352.github.io/linux/2017/05/01/jenkins-restart-remote-server-tomcat
Jenkins與DingTalk機器人實現手機端擷取當前服務日誌