如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

作者 | Alexander Kainz

譯者 | 天道酬勤,責編 | Carol

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

ChatOps可以讓你使用基於聊天的接口來管理DevOps任務。本文主要讓我們瞭解如何使用Slack構建一個簡單的機器人來控制Kubernetes集羣。最後我們可以使用Slack聊天消息查看Kubernetes日誌和信息。不需要Kubernetes的先驗知識,也不需要Slack API。

那麼,首先我們來探索一下什麼是ChatOps。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

什麼是ChatOps

ChatOps是一種使用聊天消息執行DevOps任務的方式,例如部署、監視和系統管理。例如,將日誌消息發送到聊天機器人會檢索最新的日誌消息,或者可以從聊天消息觸發部署。

下面描述了一些重要的優點:

  • 與機器人聊天,這是一種非常人性化的方法來管理基礎結構。 @chatbot日誌比kubectl日誌hello-minikube-64b64df8c9-fkb6w -ndefault更容易理解。

  • 它可以是共享聊天的一部分,以便人們可以協作和共享信息。這也提供了已執行命令和動作的記錄。

  • 它可以幫助安全地克服網絡和防火牆的限制,使在家中或旅途中工作成爲可能。

  • 通過DevOps工具的統一接口,使用相同的接口管理Kubernetes和OpenShift它可以簡化和保護基礎設施的任務,因此開發人員可以自行完成。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

設置

本文介紹了使用以下方法構建最小的聊天機器人:

  • Minikube作爲Kubernetes環境。

  • Kubernetes被標記爲“生產級容器編排”。 Kubernetes允許我們部署、管理和擴展Docker映像。

  • Minikube是用於在開發機器上運行Kubernetes的集成解決方案。

  • Slack作爲聊天服務器。

  • Python來實現實際的ChatOps服務器。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

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。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

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 和 Kubernetes 構建一個聊天機器人?| 附代碼

Slack

如果你沒有Slack帳戶,則可以通過https://slack.com 獲得自己的工作區。

在本文中,我們將創建一個所謂的經典App,以便能夠使用實時消息(RTM)API。

你可以在此處創建經典應用:https://api.slack.com/apps?new_classic_app=1。確保不要只是創建一個新的Slack App,因爲它不支持實時消息。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

該App將需要以下範圍,bot和chat:write:bot。如果找不到這些範圍,則可能是在最後一步中創建了一個非經典應用。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

我們將爲該應用添加說明和圖標。對於作者的機器人,他正在使用Wikimedia的圖像。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

最後一步是將app安裝到工作區並記下機器人令牌,單擊“將應用程序安裝到團隊”。我們將允許該APP訪問我們的工作區,並記下“ Bot User OAuth Access Token”。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

ChatOps服務器

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

然後下載並安裝需求:

    
      

git clone [email protected]:alexk/chatops-kubernetes.git

cd chatops-kubernetes/

pip3 install -r requirements.txt

然後將Slack令牌設置爲與之一起使用:

    
      

export SLACK_API_TOKEN=

並使用以下命令啓動聊天機器人服務器:

    
      

python3 chatbot.py

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

實現服務器

如設置部分所述,我們將使用Slack中的實時消息傳遞功能。要使用此功能,我們必須創建一個經典App。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

使用WebSocket的經典Slack App實時消息傳遞模型

在當前的Slack應用程序模型中,Slack針對每個聊天消息或命令將HTTP Post消息發送到chatbot服務器。

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

使用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 和 Kubernetes 構建一個聊天機器人?| 附代碼

結論

使用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

如何用 Slack 和 Kubernetes 構建一個聊天機器人?| 附代碼

  • 360金融首席科學家張家興:別指望AI Lab做成中臺
  • 用 Python 實現手機自動答題,這下百萬答題遊戲誰也玩不過我!

  • 黑客用上機器學習你慌不慌?這 7 種竊取數據的新手段快來認識一下

  • 關於 Docker ,你必須瞭解的核心都在這裏了!
  • 5分鐘!就能學會以太坊 JSON API 基礎知識

相關文章