運維機器人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