Errbot 入门(1)
简介
ChatBot,也就是聊天机器人,是近期偷偷热起来的东西之一,个人觉得原因很简单——太多系统需要运维了。
使用 Grafana 可以将各种监控、日志的东西进行跟踪,在同一个 Dashboard 进行展示,但是缺点也比较明显:
- Dashboard 需要定制,不够灵活,难于满足突发的个性化需要。
- 信息是单向流动的,无法进行远程干预。
- 插件开发需要兼顾前后端,前端漂亮的界面对运维来说,并非必要。
聊天机器人简单说来是一个需要很多二次开发的控制台,这个控制台的不同之处在于,可以和多种聊天室之类的东西进行集成,另外部分产品提供了认证、授权等功能;另外还有不少开源插件,用来同其他系统进行集成。称为机器人,应该说是一个历史遗留,跟 AI 大概有半毛钱的关系吧。
目前最流行的同类产品大概是 Github 的 Hubot,不过个人爱好问题,还是选择了 Python 的 Errbot。官方网站 http://errbot.io/ ,大致功能:
- 内置多后端支持:
- Slack
- Telegram
- XMPP
- IRC
- HipChat
- 第三方后端支持:
- Skype
- Gitter
- Cisco Spark
- …
- 内置访问控制
- 聊天室支持
- 输出模板支持
- 本地存储支持
- 消息回调功能
- Webhook 支持
- 自带文本终端
- …
下面会写一点教程,尝试在 Slack 上,通过 Errbot 来和 Kubernetes 集群进行交互。大概分为三部分:
- 安装运行和一些基本操作
- Slack 的集成
- 插件编写入门
安装和运行
安装过程还是有点点烦的,所以我做了个 Docker 镜像,源码见后。
镜像已经在 DockerHub 上构建,Tag 为 dustise/errbot-image
,简单运行docker run -it --rm dustise/errbot-image
,就进入了文本调试界面,如图所示:
输入!help
(注意,要输入两次回车)会列出当前支持的命令列表。感叹号是 errbot 的命令前缀。输入!shutdown --confirm
,会提示关机字样,errbot 进程退出。
接下来我们将其中的存储卷进行映射:
mkdir -p /var/volume/errbot
docker run -it --rm --name=errbot \
-v /var/volume/errbot:/errbot \
dustise/errbot-image
运行之后,我们可以在宿主机系统上看到 errbot 的 Home 文件夹,其中plugins/err-example
中包含了一个样板插件,我们可以查看一下其中的内容:
** err-example.plug**
[Core]
Name = Example
Module = example
[Documentation]
Description = This is a simple plugin example to get you started.
[Python]
Version = 2+
** err-example.py**
from errbot import BotPlugin, botcmd
class Example(BotPlugin):
....
@botcmd # flags a command
def tryme(self, msg, args): # a command callable with !tryme
return 'It *works* !' # This string format is markdown.
字面上看来,这个 Example 中提供了一条叫tryme
的命令,我们回到 bot 控制台,输入!tryme
看一下结果,会发现系统返回了It works
字样。
接下来我们添加一个新的命令,在 err-example.py 中加入:
@botcmd(split_args_with=None)
def who_are_you(self, msg, args):
return "you are " + args[0]
这一个比上面的稍微复杂一些:
- botcmd 的
split_args_with
代表拆分参数 - 函数中的下划线,代表子命令,输入时可以使用
!who are you
的形式 - 拆分参数的结果,以数组形式保存在 args 中。
修改存盘之后,使用!restart
命令重启 errbot。输入!who are you ali
,会看到回显内容:you are ali
。
源代码
Dockerfile:
FROM alpine
COPY prepare.sh /usr/local/bin
ENV CLIENT_VER=">=3.0.0,<4.0.0"
RUN /usr/local/bin/prepare.sh
WORKDIR /errbot
VOLUME ["/errbot"]
CMD ["/usr/local/bin/entry.sh"]
prepare.sh:
#!/bin/sh
set -xe
env
apk update
apk upgrade
apk add python3
apk add python3-dev musl-dev gcc libffi-dev openssl-dev
pip3 install errbot
pip3 install "kubernetes$CLIENT_VER"
pip3 install sleekxmpp pyasn1 pyasn1-modules irc hypchat \
slackclient python-telegram-bot prometheus_client
apk del musl-dev gcc libffi-dev --purge
cat >> /usr/local/bin/entry.sh << EOF
#!/bin/sh
if [ ! -f /errbot/config.py ]; then
errbot --init
fi
errbot
EOF
chmod a+x /usr/local/bin/entry.sh