1. 程式人生 > 實用技巧 >運維機器人hubot,解放運維的神器

運維機器人hubot,解放運維的神器

背景

以前看見過別人家的告警系統,基於企業微信 + zabbix 做的二次開發,有一個功能一直讓我念念不忘。

比如發出一條某個 Tomcat 記憶體溢位的告警,回覆個 restart ,就會自動重啟這個 Tomcat。就想到如果這個機器人可以互動,那就會方便很多了。

可能有人會說,Zabbix 的 action 也可以做到,但畢竟是非互動的,不滿足我們的需求。

後來到處查資料,也沒找到合適的,自己開發吧,咱也不會,於是就擱置了。

今年在逛 github 的時候,無意間發現了一個 hubot 的專案,仔細看了下,這正是我苦苦追尋的可互動的運維機器人啊。

經過一系列的配置,hubot 現在已經可以實現如下功能:

  • 代替我在伺服器上執行 shell 指令碼
  • 建立 jenkins 任務,執行構建任務操作
  • 從 grafana 獲取某個當前影象

這裡的重點在於,當我__不在__電腦前面的時候,想執行點啥,通過手機就搞定了。

這次只寫如何執行 shell 指令碼,下一篇寫如何與 jenkins 互動

安裝

安裝 node.js 、npm

node.js 建議版本在 10 以上

wgethttps://mirrors.huaweicloud.com/nodejs/latest-v10.x/node-v10.22.0-linux-x64.tar.gz
tarzxvfnode-v10.22.0-linux-x64.tar.gz-C/usr/local/
ln-s/usr/local/node*/usr/local/node

cat<<'EOF'>/etc/profile.d/node.sh
exportNODE_HOME=/usr/local/node
exportPATH=$NODE_HOME/bin:$PATH
EOF

source/etc/profile
#
換國內源
npmconfigsetregistryhttp://mirrors.cloud.tencent.com/npm/
安裝 hubot
npminstall-gyogenerator-hubot
建立 hubot 例項

建議使用普通使用者進行安裝,使用 root 會出現很多許可權上的錯誤,是不是有點反人類?

主要原因是它需要對於組有讀寫許可權

mkdir/data/hubot
cd/data/hubot
yohubot

然後會問你安裝什麼樣的 adapter,手工輸入 slack。

ly@fsckzy:~/hubot$yohubot
?==========================================================================
We'reconstantlylookingforwaystomakeyobetter!
Mayweanonymouslyreportusagestatisticstoimprovethetoolovertime?
Moreinfo:https://github.com/yeoman/insight&http://yeoman.io
==========================================================================Yes
_____________________________
/\
//\|Extractinginputfor|
////\_____|self-replicationprocess|
//////\/_____\\/
=======|[^_/\_]|/----------------------------
||_|___@@__|__
+===+////\_\
||_\///HUBOT/\\
|___/\///\\
\/+---+
\____/||
|//|+===+
\//|xx|

?Owneryangroupaomo
?Botnamehubot
?Descriptionsa
?Botadapterslack
createbin/hubot
createbin/hubot.cmd
createProcfile
createREADME.md
createexternal-scripts.json
createhubot-scripts.json
create.gitignore
createpackage.json
createscripts/example.coffee
create.editorconfig
_____________________________
_____/\
\\|Self-replicationprocess|
||_____|complete...|
|__\\|/_____\\Goodluckwiththat./
|//+|[^_/\_]|/----------------------------
||_|___@@__|__
+===+////\_\
||_\///HUBOT/\\
|___/\///\\
\/+---+
\____/||
|//|+===+
\//|xx|
......
......

預設安裝的 hubot,會帶上 heroku 和 redis,如果用不到的話,可以解除安裝掉:

npmuninstallhubot-heroku-keepalive--save

在 hubot 目錄下的 external-scripts.json 檔案中把有關 heroku 和 redis 的兩行刪掉就行了,否則老是會報幾個警告。 然後,再把 hubot-scripts.json 刪掉,目前我們暫時還用不到它:

rm-fhubot-scripts.json

好了,現在總算可以了。用一下看看吧:

./bin/hubot

執行:

hubothelp
hubotping

ctrl+c可以退出。

連線 hubot 和 slack

在 slack 上註冊個賬號,然後按照 hubot 外掛,會自動生成一個 token,記錄下來,啟動機器人的時候命令如下:

envHUBOT_SLACK_TOKEN=xoxb-1xxxxxx-xxxxx./bin/hubot--adapterslack

這時候 hubot 就啟動起來,等待接收命令了。但是由於 hubot 預設加入的是 slack 的 #general 頻道,如果你改掉了頻道名字,或者刪掉了這個頻道的話,你需要重新邀請小機器人進入一個新的頻道,否則沒法對話。

現在你可以在 slack 的客戶端和小機器人對話了,命令還是同上:

hubothelp

讓 hubot 保持線上

但是如果這時候我們關掉 ssh 的話,機器人就掉線了,怎麼辦呢?可以用 nohup 的方法讓它留在後臺,也可以用 tmux:

yuminstalltmux
tmuxnew-shubot

在 tmux 裡執行上面的命令,然後按ctrl+b,然後再按d退出。如果再想進去,可以執行:

tmuxa-thubot

讓 hubot 執行 shell 指令碼

這還沒有完,我們需要小機器人來執行一些 shell 指令碼,所以我們需要安裝:

npminstallhubot-script-shellcmd
cp-Rnode_modules/hubot-script-shellcmd/bash./

修改一下 external-scripts.json ,新增上以下模組:hubot-script-shellcmd 。如果到此為止,你操作的步驟和我基本一樣的話,你的 external-scripts.json 應該長的像這個樣子:

[
"hubot-diagnostics",
"hubot-help",
"hubot-google-images",
"hubot-google-translate",
"hubot-pugme",
"hubot-maps",
"hubot-rules",
"hubot-shipit",
"hubot-script-shellcmd"
]

接下來:

cdbash/handlers

這裡面的 helloworld 就是個例子

#!/bin/bash
echo"Hello.."
sleep1s;
echo"SleepyWorld!"

exit0

好了,現在你重啟一下小機器人,在你的 slack 端對機器人說:

hubotshellcmdhello

發散一下思維,建立一個 any 的 shell 指令碼

#!/bin/bash

ansible$1-mshell-a"$2"

我現在要檢視 10.16.55.173 的空間使用率的咋辦?在 slack 對機器人說:

hubotshellcmdany10.16.55.173df-h

可選操作

由於每次啟動hubot時,都需要執行以下一串長長的命令:

envHUBOT_SLACK_TOKEN=xoxb-你的token./bin/hubot--adapterslack

如果你不想這麼麻煩的話,可以在 .bashrc 新增環境變數

exportHUBOT_SLACK_TOKEN=xoxb-1273359736209-1270164306356-TtTMbchRgskUYfU9jmUhWngt

這樣啟動機器的時候就這樣啟動就行了:

./bin/hubot--adapterslack

同樣,如果你嫌 shellcmd 太長的話,也可以加下這一句:

exportHUBOT_SHELLCMD_KEYWORD=run

這樣你以後再需要 hubot 幫你執行命令的時候,只要說這一句就行了:

hubotrunhello