如何用 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 [email protected]:alexk/chatops-kubernetes.git
cd chatops-kubernetes/
pip3 install -r requirements.txt
然後將Slack令牌設置爲與之一起使用:
export SLACK_API_TOKEN=
並使用以下命令啓動聊天機器人服務器:
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
- 360金融首席科學家張家興:別指望AI Lab做成中臺
-
用 Python 實現手機自動答題,這下百萬答題遊戲誰也玩不過我!
-
黑客用上機器學習你慌不慌?這 7 種竊取數據的新手段快來認識一下
- 關於 Docker ,你必須瞭解的核心都在這裏了!
-
5分鐘!就能學會以太坊 JSON API 基礎知識