运维机器人hubot,解放运维的神器
背景
以前看见过别人家的告警系统,基于企业微信 + zabbix 做的二次开发,有一个功能一直让我念念不忘。
比如发出一条某个 Tomcat 内存溢出的告警,回复个 restart ,就会自动重启这个 Tomcat。就想到如果这个机器人可以交互,那就会方便很多了。
可能有人会说,Zabbix 的 action 也可以做到,但毕竟是非交互的,不满足我们的需求。
后来到处查资料,也没找到合适的,自己开发吧,咱也不会,于是就搁置了。
今年在逛 github 的时候,无意间发现了一个 hubot 的项目,仔细看了下,这正是我苦苦追寻的可交互的运维机器人啊。
经过一系列的配置,hubot 现在已经可以实现如下功能:
代替我在服务器上执行 shell 脚本 创建 jenkins 任务,执行构建任务操作 从 grafana 获取某个当前图像
这里的重点在于,当我__不在__电脑前面的时候,想执行点啥,通过手机就搞定了。
这次只写如何执行 shell 脚本,下一篇写如何与 jenkins 交互
安装
安装 node.js 、npm
node.js 建议版本在 10 以上
wget https://mirrors.huaweicloud.com/nodejs/latest-v10.x/node-v10.22.0-linux-x64.tar.gz
tar zxvf node-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
export NODE_HOME=/usr/local/node
export PATH=$NODE_HOME/bin:$PATH
EOF
source /etc/profile
# 换国内源
npm config set registry http://mirrors.cloud.tencent.com/npm/
安装 hubot
npm install -g yo generator-hubot
创建 hubot 实例
建议使用普通用户进行安装,使用 root 会出现很多权限上的错误,是不是有点反人类?
主要原因是它需要对于组有读写权限
mkdir /data/hubot
cd /data/hubot
yo hubot
然后会问你安装什么样的 adapter,手工输入 slack。
ly@fsckzy:~/hubot$ yo hubot
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== Yes
_____________________________
/ \
//\ | Extracting input for |
////\ _____ | self-replication process |
//////\ /_____\ \ /
======= |[^_/\_]| /----------------------------
| | _|___@@__|__
+===+/ /// \_\
| |_\ /// HUBOT/\\
|___/\// / \\
\ / +---+
\____/ | |
| //| +===+
\// |xx|
? Owner yangroupaomo
? Bot name hubot
? Description sa
? Bot adapter slack
create bin/hubot
create bin/hubot.cmd
create Procfile
create README.md
create external-scripts.json
create hubot-scripts.json
create .gitignore
create package.json
create scripts/example.coffee
create .editorconfig
_____________________________
_____ / \
\ \ | Self-replication process |
| | _____ | complete... |
|__\\| /_____\ \ Good luck with that. /
|//+ |[^_/\_]| /----------------------------
| | _|___@@__|__
+===+/ /// \_\
| |_\ /// HUBOT/\\
|___/\// / \\
\ / +---+
\____/ | |
| //| +===+
\// |xx|
......
......
缺省安装的 hubot,会带上 heroku 和 redis,如果用不到的话,可以卸载掉:
npm uninstall hubot-heroku-keepalive --save
在 hubot 目录下的 external-scripts.json 文件中把有关 heroku 和 redis 的两行删掉就行了,否则老是会报几个警告。 然后,再把 hubot-scripts.json 删掉,目前我们暂时还用不到它:
rm -f hubot-scripts.json
好了,现在总算可以了。用一下看看吧:
./bin/hubot
执行:
hubot help
hubot ping
按ctrl+c
可以退出。
连接 hubot 和 slack
在 slack 上注册个账号,然后按照 hubot 插件,会自动生成一个 token,记录下来,启动机器人的时候命令如下:
env HUBOT_SLACK_TOKEN=xoxb-1xxxxxx-xxxxx ./bin/hubot --adapter slack
这时候 hubot 就启动起来,等待接收命令了。但是由于 hubot 缺省加入的是 slack 的 #general 频道,如果你改掉了频道名字,或者删掉了这个频道的话,你需要重新邀请小机器人进入一个新的频道,否则没法对话。
现在你可以在 slack 的客户端和小机器人对话了,命令还是同上:
hubot help
让 hubot 保持在线
但是如果这时候我们关掉 ssh 的话,机器人就掉线了,怎么办呢?可以用 nohup 的方法让它留在后台,也可以用 tmux:
yum install tmux
tmux new -s hubot
在 tmux 里执行上面的命令,然后按ctrl+b
,然后再按d
退出。如果再想进去,可以执行:
tmux a -t hubot
让 hubot 执行 shell 脚本
这还没有完,我们需要小机器人来执行一些 shell 脚本,所以我们需要安装:
npm install hubot-script-shellcmd
cp -R node_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"
]
接下来:
cd bash/handlers
这里面的 helloworld 就是个例子
#!/bin/bash
echo "Hello.."
sleep 1s;
echo "Sleepy World!"
exit 0
好了,现在你重启一下小机器人,在你的 slack 端对机器人说:
hubot shellcmd hello
发散一下思维,创建一个 any 的 shell 脚本
#!/bin/bash
ansible $1 -m shell -a "$2"
我现在要查看 10.16.55.173 的空间使用率的咋办?在 slack 对机器人说:
hubot shellcmd any 10.16.55.173 df -h
可选操作
由于每次启动hubot
时,都需要执行以下一串长长的命令:
env HUBOT_SLACK_TOKEN=xoxb-你的token ./bin/hubot --adapter slack
如果你不想这么麻烦的话,可以在 .bashrc 添加环境变量
export HUBOT_SLACK_TOKEN=xoxb-1273359736209-1270164306356-TtTMbchRgskUYfU9jmUhWngt
这样启动机器的时候就这样启动就行了:
./bin/hubot --adapter slack
同样,如果你嫌 shellcmd 太长的话,也可以加下这一句:
export HUBOT_SHELLCMD_KEYWORD=run
这样你以后再需要 hubot 帮你执行命令的时候,只要说这一句就行了:
hubot run hello