1. 程式人生 > >Jenkins與釘釘機器人實現手機端獲取當前服務日誌

Jenkins與釘釘機器人實現手機端獲取當前服務日誌

不同的 hub 使用 .com -o lib 51cto set 筆記本

馬上要過年了,各位運維們除了因為買不到回家的火車票而嚎嚎大哭之外也開始擴容服務器和提前調整監控值,目的就是為了過一個消停的春節。可是這畢竟十天左右不在公司,要是模塊真出了什麽意外肯定沒法第一找到日誌分析問題,畢竟這幾天都在串門拜年和醉生夢死中度過,走到哪都要再背一個筆記本實在太不方便了。

那麽這個時候,我就琢磨使用手機端來啟動服務器裏腳本,讓這個腳本可以去獲取當前的日誌,然後再把結果返回到手機端。這樣就不用到哪裏都帶那個一看就很掃興的公司筆記本電腦了。

使用手機端啟動服務器裏腳本?我又不會開發android和ios,那麽肯定就要使用第三方工具,我條件反射的想到了jenkins,因為jenkins是用手機可以登錄的,那麽在手機端得到結果用什麽呢?在微信公眾號和釘釘機器人裏,我選擇了釘釘機器人。

創造釘釘機器人

我的釘釘版本是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()

直接執行這個腳本,就會看到我剛新建的釘釘機器人在群聊裏說話了。
技術分享圖片

機器人搭配nginx

上面那個腳本已經可以初步實現我們的目的,但是有一個缺點,就是正文內容不能過長。但是我想多打印一點日誌,至少50行,怎麽辦?我想了想,可以把日誌放進nginx的一個網頁裏,然後用釘釘機器人反饋這個網頁地址啊,這樣內容想寫多少就可以寫多少了。

假設我現在獲取到的日誌的文件寫進一個叫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出來,同時釘釘機器人也在群裏發消息,這個#1就是構建的記錄,這個紀錄多了的話,新紀錄會覆蓋掉老的記錄。
技術分享圖片

點擊這個#1,選擇控制臺輸出,就能看到具體的操作結果了,跟在shell界面裏執行的效果差不多的。可見操作成功,目的已經達到了!
技術分享圖片

以後需要調用腳本,就在手機端瀏覽器裏登陸jenkins,然後構建一下這個project,同時就可以看到釘釘裏機器人有反饋了。

參考資料

https://xu3352.github.io/linux/2017/05/01/jenkins-restart-remote-server-tomcat

Jenkins與釘釘機器人實現手機端獲取當前服務日誌