当前位置: 首页 > 编程日记 > 正文

如何用 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 channelis_service = 'subtype' in data and data['subtype'] is not Noneif 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 eventtokens = text.split()  # split it up by space charactersme = tokens[0]  # user id of the cht bot# object to track the conversation stateconv = Conversation(web_client, channel_id, user)if len(tokens) > 1:print(tokens)# first token is my userid, second will be the command e.g. logscommand = tokens[1]print('received command ' + command)if command in commands:# get the actual command executorcommand_func = commands[command]try:args = tokens[slice(2, len(tokens))]# execute the commandresult = command_func(conv, args)if result is not None:# and return the value from the# command back to the userconv.msg(result)except Exception as e:conv.msg(str(e))else:# show welcome messageweb_client.chat_postMessage(conv.msg(welcome.format(user=user, me=me)))else:# show welcome messageconv.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

推荐阅读

  • 360金融首席科学家张家兴:别指望AI Lab做成中台

  • 用 Python 实现手机自动答题,这下百万答题游戏谁也玩不过我!

  • 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下

  • 关于 Docker ,你必须了解的核心都在这里了!

  • 5分钟!就能学会以太坊 JSON API 基础知识

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

相关文章:

在jsp调试后端绑定对象

在jsp调试后端绑定对象&#xff0c;这个调用层次非常深

一行代码轻松实现拖动效果

写JS实现拖动需要一大堆不便维护的代码&#xff0c;实属麻烦&#xff0c;Google了大半天&#xff0c;发现了一个优秀的Jquery插件EasyDrag&#xff0c;只需要一行代码便可轻松在主流浏览器上 实现拖动效果. $(document).ready( function() { $("#divPanel"…

Spring源码分析【8】-分布式环境SpringSecurity保持用户会话

1.SpringSecurity的权限控制流程是这样的&#xff1a;用户登录&#xff0c;基础信息UserInfo存在SpringSecurity的ThreadLocal里。 下面是contextHolder对象&#xff1a; final class ThreadLocalSecurityContextHolderStrategy implementsSecurityContextHolderStrategy {// ~…

【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!...

本站文章均为 李华明Himi 原创,转载务必在明显处注明&#xff1a; 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/308.html 各位童鞋请你们注意&#xff1a;surfaceview中确实有 onDraw这个方法&#xff0c;但是surfaceview不会自己去调用&#x…

“华为云杯”2020深圳开放数据应用创新大赛线上推介会成功举办,让深圳大数据在全球“跑”起来...

4月30日下午&#xff0c;“华为云杯”2020深圳开放数据应用创新大赛第三场线上推介会完美落幕。至此&#xff0c;从4月23日开始的三场云端推介会全部结束&#xff0c;全球各数字平台总观看量1000多万人次。深圳市政务服务数据管理局副局长王耀文、深圳市南山区副区长练聪、南山…

学习OpenCV——配置CUDA环境

大家都把GPU&CUDA说的很NB狠NB&#xff0c;于是&#xff0c;下一步想通过GPU加速程序运行。这一个星期&#xff0c;都在配置OpenCV的CUDA环境&#xff0c;今天终于以失败告终&#xff0c;原因是实验室的机器显卡不支持CUDA。。。伤不起啊&#xff0c;一星期啊&#xff01;&…

NLP带来的“科幻感”超乎你的想象 - ACL2020论文解读

来源 | 京东智联云开发者责编 | Carol近些年&#xff0c;人工智能无疑是信息技术领域最热门的技术之一。人工智能战胜世界围棋冠军、人工智能战胜游戏高手、人工智能医生看病会诊……不断进步的科技正推动着人工智能从一个无法实现的幻想&#xff0c;不断突破人类的想象&#x…

Vsftp 安装配置(转)

转:http://www.cnblogs.com/qingfeng2010/archive/2010/12/26/1917121.html 1.查看是否安装vsftprpm –qa|grep vsftpd 如果出现 vsftpd-2.0.5-16.el5_5.1 说明已经安装 vsftp 安装vsftp yum -y installvsftpd 2.测试 是否安装成功 &#xff08;ip 改成自己啊&#xff0c…

事务隔离机制原理分析以及是否可以防止订单超卖

事务的隔离机制是指&#xff1a; Read Uncommitted&#xff08;读取未提交内容&#xff09; Read Committed&#xff08;读取提交内容&#xff09; Repeatable Read&#xff08;可重读&#xff09; Serializable&#xff08;可串行化&#xff09; 具体的解释最经典的MySQL书《…

PHP中file_exists与is_file,is_dir的区别介绍

PHP中file_exists与is_file,is_dir的区别介绍作者&#xff1a; 字体&#xff1a;[增加 减小] 类型&#xff1a;转载 时间&#xff1a;2012-09-12 我要评论很显然file_exists是受了asp的影响&#xff0c;因为asp不但有fileExists还有folderExists,driverExists&#xff0c;那么P…

推荐算法工程师的成长之道

作者 | gongyouliu来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;本文&#xff0c;作者会基于自己的实践经验讲述推荐算法工程师的成长之道&#xff0c;这里的“道”有发展路径和道(道理、方法论、经验、智慧)两层意思。所以本文除了讲解推荐算法工程师的成长…

JVM内存溢出的几种情形

1.堆溢出 原因&#xff1a;大量对象占据了堆空间&#xff0c;而这些对象都有强引用导致无法回收&#xff0c;当对象大小之和>Xmx参数指定的堆大小时导致溢出&#xff01; List<byte[]> list new ArrayList<>();for (int i 0; i < 10240; i) {list.add(new…

Android Market 链接的生成与分享

通过Java包名直接定位到你的App http://market.android.com/details?id<java包名> 或者 market://details?id<java包名> 范例&#xff1a;market://details?idcom.skyd.luckywheel 这将直接在菜市场中显示你的App详细介绍页。 通过Java包名搜索App http://marke…

Centos6/7下静默安装oracle10g

Centos6/7下静默安装Oracle10g 远程安装oracle10g,通过网上资料&#xff0c;不断摸索成功安装。先在本地虚拟机Centos7上做实验&#xff0c;快照恢复快照恢复&#xff0c;安装了几十次成功之后&#xff0c;再在服务器Centos6上安装&#xff0c;(6和7还是有区别的&#xff0c;比…

String和常量池

jdk1.6之前常量池属于永久代&#xff0c;jdk1.7以后移到堆中。 String s1 "abc";// 放在常量池中String s2 "abc";// 从常量池中查找String s3 new String("abc");//new放在堆中String s4 new String("abc");String s5 s1.inter…

CQRS体系结构模式实践案例:Tiny Library:领域仓储与事件存储

领域仓储&#xff08;Domain Repository&#xff09;与事件存储&#xff08;Event Store&#xff09;是CQRS体系结构应用系统中C部分&#xff08;Command部分&#xff09;的重要组件。虽然都是存储机制&#xff0c;但两者有着本质的区别&#xff1a;领域仓储是属于领域层的&…

​中国开启开源新纪元

距离“中国 Linux 第一人”宫敏博士用手提肩背的方式&#xff0c;将 20 盒装有 80G 容量的自由软件磁带背回中国转瞬已过 20 载&#xff0c;在宫敏博士的推动下&#xff0c;中国组建起国内第一个自由软件库&#xff0c;由此开源在第一代开发者心中的火种迅速传播。20 多年间&am…

kernel logo到开机动画之间闪现黑屏(android 5.X)

在BootAnimation開始画图之前&#xff0c;会先做一次clear screen的动作&#xff0c;避免出现前面的图干扰到BootAnimation的显示。 通过check main_log先确认播放开机动画是哪个function。在相应function删除clear screen的动作的相应代码。 /frameworks/base/cmds/bootanimat…

JScript Array对象的几个原型方法

代码 Array.prototype.inArray function(value) { for(vari 0; i <this.length; i) { if(this[i] value) { returntrue; } } returnfalse;};Array.prototype.max function() { for(vari 1, max this[0]; i <this.length; i) { …

太生猛!AI应届生年薪涨到80万!网友:后悔生的太早

据中国青年报报道&#xff1a;新冠肺炎疫情期间&#xff0c;非接触类交互、安全卫生等需求提升&#xff0c;以数字货币、数据应用、人工智能为代表的数字经济显著发展&#xff0c;全球经济数字化转型踩下“油门”。中国人工智能人才很可能缺口超过500万人。其实&#xff0c;早在…

Tomcat定时任务

原文: The load-on-startup element indicates that this servlet should be loaded (instantiated and have its init() called) on the startup of the web application. The optional contents of these element …

Nutanix CE on Lenovo W520 初探

話說 Nutanix 出了 CE 版本&#xff0c;這當然要來試試看 Nutanix 威力拿了部機器lenovo W520 CPU: i7-2820QM 4 coreRam: 32GBHDD:500G安裝選單選擇鍵盤配置&#xff0c;按下 ProceedNutanix 開始載入程式硬件最低需求不滿足Laptop 32G 內存Lenovo W520Nutanix 官方 CE 最低硬…

《爱情公寓2》将播 恶搞宣传片大喊“有种别看”

昨晚&#xff0c;一支重口味的宣传片消然出现在各大网站&#xff0c;一夜之间在狂转发。上线不到一小时&#xff0c;单一网站浏览量就超十万&#xff0c;视频主标写着&#xff1a;神兽组合从天而降&#xff0c;口味超重&#xff0c;少儿不宜&#xff0c;人兽悲剧&#xff0c;蛋…

“应付”大学作业,我花3小时写了一个“文本转手写”神器

作者 | Saurabh Daware译者 | 弯月&#xff0c;责编 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;最近&#xff0c;有一个名叫Saurabh Daware的印度大学生只花了3个小时就编写了一款自动化工具&#xff0c;能够将文本转换成手写文字&#xff0c;并用这个工…

Laravel应用

CLI 参考&#xff1a;http://laravel-china.org/docs/5.1/artisancli处理业务&#xff0c;把业务封装成一个命令&#xff0c;用php artisan来调用自定义的命令放在App/Console/Commands下创建方式php artisan make:console 命令名 —command调用时名字php artisan make:console…

匿名内部类和传接口

匿名内部类也就是没有名字的内部类正因为没有名字&#xff0c;所以匿名内部类只能使用一次&#xff0c;它通常用来简化代码编写但使用匿名内部类还有个前提条件&#xff1a;必须继承一个父类或实现一个接口 参考&#xff1a;http://www.cnblogs.com/nerxious/archive/2013/01/…

为什么这门技术如此重要?错过这次黄金期,就晚了!

老李一直怀疑自己是不是年纪大了&#xff0c;脑子跟不上了。作为十几年经验的资深 Java 工程师&#xff0c;维护这公司产品的核心代码的他&#xff0c;现在迭代产品的时候&#xff0c;经常出 Bug 。有时修复一个 Bug 时间&#xff0c;比开发一个需求的时间要长很多&#xff0c;…

字符编码简介 ANSI Unicode Unicode big endian UTF-8

1. ASCII码 我们知道&#xff0c;在计算机内部&#xff0c;所有的信息最终都表示为一个二进制的字符串。每一个二进制位&#xff08;bit&#xff09;有0和 1两种状态&#xff0c;因此八个二进制位就可以组合出256种状态&#xff0c;这被称为一个字节&#xff08;byte&#xff0…

ReactiveCocoa代码实践之-更多思考

三.ReactiveCocoa代码实践之-更多思考 1. RACObserve()宏形参写法的区别 之前写代码考虑过 RACObserve(self.timeLabel , text) 和 RACObserve(self , timeLabel.text) 的区别。 因为这两种方法都是观察self.timeLabel.text的属性&#xff0c;并且都能实现功能。估计是作者原本…

Java常用命令及Java Dump

线程Dump,包含所有线程的运行状态。纯文本格式。 堆Dump,包含线程Dump,幵包含所有堆对象的状态。二进制格式。 Java Dump方法 1.使用Java虚拟机制作Dump 指示虚拟机在发生内存不足错误时,自动生成堆Dump -XX:HeapDumpOnOutOfMemoryError 2.使用图形化工具制作Dump 使用JDK…