IT業務効率化

SlackBotを作って気づいたChatOpsのメリットとデメリット

ChatOpsとは

ChatOpsとは「チャット」+「オペレーション」を合わせた言葉です。つまり

普段の運用業務をチャットツール上で行っていこう!

ということです。

私はデータ抽出業務を自動化できないかと考えて、興味本位で最初触ってみました。その学びをまとめたいと思います。

まずはメリットとデメリットを書き出そうと思います。

ChatOpsのメリット

以下の6つはQiitaの記事より引用しています。

  • 共通インターフェース
  • インタラクティブ性がある
  • 応答性
  • 共有がしやすい
  • 記録に残しやすい
  • 業務プロセスの再定義

https://qiita.com/m_mizutani/items/f7fa7b1d1c077b139f98より

そして以下、私が開発中に気が付いたことです。特に入力に対して何か処理をするbotに寄っていますが。

  • ユーザのID・チャンネルのID単位で利用範囲を制限できる
  • インターフェースの実装に手を焼かずにすむ
  • ログの管理が不要
  • Slackだとボタンやプルダウンによる入力待ちができる
  • 可愛くすることも自由

ChatOpsのデメリット

  • 言葉のゆらぎを考慮して応答するためには、相応の開発が必要
  • そのため、コマンドの概念がない非エンジニアには容易く使わせられない
  • 応答型のbotは、機能が増えすぎると管理しにくい

という風に書いてみましたが、メリットの方が多いかと思います。

PythonとSlackでデータ抽出bot作ってみた

ソースコードはあげております。よろしければご覧ください、

https://github.com/hirayuki32/slack_data_extraction

ファイル転送用のAPI_TOKENを取得する

PythonとSlackでtipsボットを作る。その1【下準備編】なぜtipsボットを作ろうと思ったか 社内には小さなルールがたくさん点在しています。みんなそれを体系的にまとめるために涙くましい努力を...

botのAPIを用意する方法は上にまとめております。

メインの関数

def data_exetraction_master(message):
    project_name = message.body["text"]
    project = read_project(project_name)

    user_id = message.body["user"]
    if not has_privilege(user_id, project.privilege_level):
        message.reply("You have no privilege")
        return

    data_file_path = "temp_data/{}.{}".format(project_name, project.data_type)
    df = create_df_by_query(project.sql, project.database_type)
    df.to_csv(data_file_path, index=None)

    channel_id = message.body["channel"]
    slacker.files.upload(file_=data_file_path, channels=channel_id)
    message.reply("データを抽出しました。csv形式で納品します。")
  1. データ抽出の定義ファイルを読み込み
  2. 命令したユーザの権限を確認し
  3.  クエリを実行して
  4. ファイルを一時的にディレクトリに格納し
  5. slacker.files.uploadでSlackに投稿します

データ抽出の定義ファイルを作成する

privilege_level = 0
database_type = "oracle"  # Other databases are not implemented yet
data_type = "csv"  # excel is not yet supported
sql = """select * fron sample"""
document_link = "link"

接続するデータベースの種類、出力するファイル形式、実行するSQLを定義します。(より細かい接続先の定義もいずれ加えようかと思います。)

ユーザの権限を確認

import os
import pandas as pd

user_privileges = pd.read_csv("privilege/user_privileges.csv", index_col=[0])


def has_privilege(user_id, project_privilege_level):
    """
    ユーザにprojectの実行権限があるか確認する
    Args:
    user_id (str): ユーザID
    project_privilege_level (int): 
        そのprojectの実行権限レベル
    Returns:
        bool: ユーザにprojectの実行権限があるか
    """
    try:
        user_privilege_level = user_privileges.loc[user_id]["privilege_level"]
    except:
        return False
    if project_privilege_level == user_privileges.loc[user_id]["privilege_level"]:
        return True
    return False

ユーザの権限を確認します。ユーザ権限情報がファイルになければ、権限がないのと同様にFalseを返します。

クエリ

import pandas as pd


def _create_oracle_con():
    import cx_Oracle
    from .oracle_conf import host, port, sid, user, passwd
    tns = cx_Oracle.makedsn(host, port, sid)
    conn = cx_Oracle.connect(user, passwd, tns)
    return conn


def create_df_by_query(sql, database_type):
    """
    args:
        sql: string
        database_type: "oracle"
        Other databases are not implemented yet
    return:
        pandas DataFrame
    """
    # Other databases are not implemented yet
    if database_type == "oracle":
        conn = _create_oracle_con()
    else:
        raise ValueError("指定のdatabase_typeが不正です")
    df = pd.read_sql_query(sql, conn)
    conn.close
    return df

まだOracleにしか対応していませんが。

デモ

データ抽出の様子

権限を管理する

おわりに

私はSlackBotを導入することで効率化する業務は多く存在すると考えています。今まで人と人のコミュニケーションをする場であったチャットに、ロボットが1人入ってきて、仕事をしてくれて、終わったら教えてくれるようになるイメージです。

今回Pythonで一から実装してみました。Pythonと接続できることで、やれることは無限大です。また、Pythonで一から書かなくても、連携アプリケーションはたくさんあるので、どんどん導入していきたいと思います。

またこちらの記事がChatOpsについて丁寧にまとまっており、参考にさせていただきました。

ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki