运维机器人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
posted @ 2020-09-01 17:03  海口-熟练工  阅读(1609)  评论(0编辑  收藏  举报