如何用 Slack 和 Kubernetes 构建一个聊天机器人?| 附代码

作者 | Alexander Kainz

译者 | 天道酬勤,责编 | Carol

出品 | AI科技大本营(ID:rgznai100)

ChatOps可以让你使用基于聊天的接口来管理DevOps任务。本文主要让我们了解如何使用Slack构建一个简单的机器人来控制Kubernetes集群。最后我们可以使用Slack聊天消息查看Kubernetes日志和信息。不需要Kubernetes的先验知识,也不需要Slack API。

那么,首先我们来探索一下什么是ChatOps。       

什么是ChatOps

 

ChatOps是一种使用聊天消息执行DevOps任务的方式,例如部署、监视和系统管理。例如,将日志消息发送到聊天机器人会检索最新的日志消息,或者可以从聊天消息触发部署。 

下面描述了一些重要的优点:

  • 与机器人聊天,这是一种非常人性化的方法来管理基础结构。  @chatbot日志比kubectl日志hello-minikube-64b64df8c9-fkb6w -ndefault更容易理解。

  • 它可以是共享聊天的一部分,以便人们可以协作和共享信息。这也提供了已执行命令和动作的记录。

  • 它可以帮助安全地克服网络和防火墙的限制,使在家中或旅途中工作成为可能。

  • 通过DevOps工具的统一接口,使用相同的接口管理Kubernetes和OpenShift它可以简化和保护基础设施的任务,因此开发人员可以自行完成。

 

设置

本文介绍了使用以下方法构建最小的聊天机器人:

  • Minikube作为Kubernetes环境。

  • Kubernetes被标记为“生产级容器编排”。  Kubernetes允许我们部署、管理和扩展Docker映像。

  • Minikube是用于在开发机器上运行Kubernetes的集成解决方案。

  • Slack作为聊天服务器。

  • Python来实现实际的ChatOps服务器。

Minikube

 

为了在开发机器上快速运行Kubernetes,Minikube在单个虚拟机映像中实现了Kubernetes集群。你可以在此处找到详细的安装说明:

https://kubernetes.io/docs/setup/learning-environment/minikube/#installation 

作者要将其安装在自己的macOs系统上,并使用VirtualBox作为虚拟化驱动程序。你可以在这里找到VirtualBox:https://www.virtualbox.org/wiki/Downloads

安装VirtualBox之后,可以使用以下命令将Minikube安装在macO上。它还将部署一个示例应用程序。这里假设你已安装了homebrew软件:https://brew.sh/。

brew install minikube # install via Homebrew
minikube start - driver=virtualbox # start and use Virtualbox
kubectl create deployment hello-minikube-image=k8s.gcr.io/echoserver:1.10 # install sample app

要验证安装使用,请执行以下操作:kubectl get all,结果应显示示例pod,比如pod / hello-minikube-64b64df8c9-fkb6w。       

       

Kubernetes的简要介绍

Kubernetes是一款允许在集群中管理docker映像的软件。这包括部署、扩展、管理和监视。基本部署单元是Pod。Pod可以包含多个docker映像或容器。我们将在本文中开发的聊天机器人仅支持具有单个图像的pod。可以通过kubectl命令和其他方式控制Kubernetes。 

我们的服务器将使用以下Kubernetes命令:

kubectl get pods --selector=app={app} --namespace={namespace} :在名称空间中检索应用程序的pod。

kubectl logs {pod} --namespace={namespace}:获取容器中容器的日志(如果容器中只有一个图像)。

kubectl describe pod {pod} --namespace={namespace} :描述有关Pod的详细信息。

Slack

如果你没有Slack帐户,则可以通过https://slack.com 获得自己的工作区。

在本文中,我们将创建一个所谓的经典App,以便能够使用实时消息(RTM)API。 

你可以在此处创建经典应用:https://api.slack.com/apps?new_classic_app=1。确保不要只是创建一个新的Slack App,因为它不支持实时消息。       

该App将需要以下范围,bot和chat:write:bot。如果找不到这些范围,则可能是在最后一步中创建了一个非经典应用。       

我们将为该应用添加说明和图标。对于作者的机器人,他正在使用Wikimedia的图像。       

最后一步是将app安装到工作区并记下机器人令牌,单击“将应用程序安装到团队”。我们将允许该APP访问我们的工作区,并记下“ Bot User OAuth Access Token”。

ChatOps服务器

可以在https://gitlab.com/alexk/chatops-kubernetes上找到服务器的代码。它需要python 3,例如可以在macO上使用brew install python3安装。

然后下载并安装需求:

git clone git@gitlab.com:alexk/chatops-kubernetes.git
cd chatops-kubernetes/
pip3 install -r requirements.txt

然后将Slack令牌设置为与之一起使用:

export SLACK_API_TOKEN=<Your Slack token starts with xoxb-…> 

并使用以下命令启动聊天机器人服务器:

python3 chatbot.py 

实现服务器

如设置部分所述,我们将使用Slack中的实时消息传递功能。要使用此功能,我们必须创建一个经典App。       

      使用WebSocket的经典Slack App实时消息传递模型

在当前的Slack应用程序模型中,Slack针对每个聊天消息或命令将HTTP Post消息发送到chatbot服务器。       

      使用HTTP POSTS的现代Slack应用模型

但是,在ChatOps的背景下,经典的应用程序允许我们使用WebSockets连接到Slack。我们的聊天机器人服务器将对Slack端点使用HTTP GET调用。  Slack服务器将保持连接打开并向我们的聊天机器人流更新。

这意味着我们不需要在DevOps基础架构上打开传入的端点。相反,我们将使用传出连接。 

由于ChatOps服务器通常会以提升的权限运行,因此很难向外界端口开放。通过使用经典的App和websockets连接,我们为网络犯罪分子关闭了另一个攻击角度。

服务器将支持4个命令:

set-app为用户设置应用程序。因此,我们不必在每次使用其他命令时都提供应用程序名称。一种简单的安全访问方法是仅允许管理员用户执行此命令。

get-app为用户获取应用程序。

logs和describe用来检索所选应用程序的窗格上的日志和信息。

要存储选定的应用程序,我们将在db.py模块中使用嵌入式sqllite3数据库。

主事件循环如下所示: 

@RTMClient.run_on(event="message")  # subscribe to 'message' events
def process_command(**payload):
    data = payload['data']
    web_client = payload['web_client']
    print(payload)
    # ignore service messages, like joining a channel
    is_service = 'subtype' in data and data['subtype'] is not None


    if not is_service and 'text' in data:
        channel_id = data['channel']
        thread_ts = data['ts']
        user = data['user']
        text = data['text']  # get data from the event
        tokens = text.split()  # split it up by space characters
        me = tokens[0]  # user id of the cht bot
        # object to track the conversation state
        conv = Conversation(web_client, channel_id, user)
        if len(tokens) > 1:
            print(tokens)
            # first token is my userid, second will be the command e.g. logs
            command = tokens[1]
            print('received command ' + command)
            if command in commands:
                # get the actual command executor
                command_func = commands[command]
                try:
                    args = tokens[slice(2, len(tokens))]
                    # execute the command
                    result = command_func(conv, args)
                    if result is not None:
                        # and return the value from the
                        # command back to the user
                        conv.msg(result)
                except Exception as e:
                    conv.msg(str(e))


            else:
                # show welcome message
                web_client.chat_postMessage(
                    conv.msg(welcome.format(user=user, me=me))
                )
        else:
            # show welcome message
            conv.msg(welcome.format(user=user, me=me)

它使用@ RTMClient.run_on(event =” message”)进行注释,每次在当前聊天中发送消息时,Python Slack客户端都会调用该方法。

为了确保我们没有收到自己的消息,也没有服务消息(“…已经加入了对话”),我们使用这一行代码:

is_service = ‘subtype’ in data and data[‘subtype’] is not None 

收到消息后,我们将其转换为令牌并获取每个命令的实际处理程序,然后单个命令将解析传入的参数。例如。  set-app命令会将应用程序存储在用户数据库中,以供用户使用。为了实现这一点,我们使用os.popen(cmd):

def logs(pod, namespace):
    cmd = f'kubectl logs  {pod} --namespace={namespace}'
    print(f'Executing {cmd}')
    stream = os.popen(cmd)
    return stream.read() 

结论

使用Slack客户端支持的实时消息API,我们能够构建一个执行kubernetes命令的简单聊天机器人。也可以使用Slack中的现代POST事件来构建ChatBots。

让它能够成为ChatOps机器人的下一步是通过建立授权模型来提高安全性。当编排多个DevOps工具时,可能需要实现一个DevOps API,该API处理实际的编排并提供一个公共接口。然后可以使用该接口来构建多通道DevOps工具集,例如,可以由仪表板和ChatOps使用。

原文链接:https://hackernoon.com/how-to-build-a-chatops-bot-with-slack-and-kubernetes-3r2b3yjr

推荐阅读

  • 你点的每个“在看”,我都认真当成了AI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值