見出し画像

世界を狙えるかも!InfraGPTの作成方法

今回は、AWS上にAmazon Linuxで立てたサーバに対して、ChatGPT経由でサーバの状況を知ることができるウェブアプリを作成してみます。

別に、Amazon Linuxじゃなくても、他のLinuxやRedhatや、AWSじゃなくてもAzure上やDocker上のLinuxでも同じように作成することができます。

今回の成果物イメージとなります。


日本語も使えます。



前提

AWS上に、Amazon Linuxで作成してあるものとします。
ログインIDは、ec2-user、ec2-userのパスワードはmoonmoon。
今回のサーバのIPアドレスは、54.248.149.101
サーバ接続時のキーペア(今回は、test-key.pem)を事前に準備してあるものとします。キーペアは、app.pyと同じフォルダ階層に配置します。
OpenAIのAPI Keyを事前取得しておきます。


今回は、AWS上におけるサーバ構築の部分は省略しております。需要がありそうでしたら、今後書いてみたいと思います。


事前準備


必要パッケージを準備するために、requirements.txtとして、下記を保存します。

paramiko
openai
streamlit


app.pyとして、下記を保存します。sk-xxxxxxxxxxxxの部分には、OpenAIのAPI Keyを記載します。また、各自host, username,password,key_filenameの値などが違うと思いますので、ご自身で用意したものの値に変更します。modelをgpt-3.5-turboにしていますので、お金が高くなりますがgpt-4も使えます。

import paramiko
import os
import openai
import streamlit as st

# OpenAIのAPIキーを設定します。
openai.api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# ホスト名またはIPアドレスを設定します。
host = "54.248.149.101"

# ユーザー名を設定します。
username = "ec2-user"

# パスワードを設定します。
password = "moonmoon"

# SSH接続のポート番号を設定します。
port = 22

# SSH接続の際に使用する鍵ファイルを設定します。
key_filename = "test-key.pem"

# サーバで使用するコマンドリストを設定します。
command_list1="ls,pwd,date,du,df,free,uname,who,uptime"
command_list2="cat, grep, find,top,ps"

# アプリケーションのタイトルを設定します。
st.title('🤗 InfraGPT')
prompt = st.text_input('Input here','How about disk situation?')


# OpenAIのAPIを利用して、コマンドを生成します。
response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[{"role":"user", "content": f"""
                            Select one command from the following that considers the  {prompt}". 
                            Display only the command. Do not display anythingelse.{command_list1}                            
                            """}], 
            )
execute_command=response['choices'][0]['message']['content']

# SSH接続を作成します。
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=username, key_filename=key_filename)

# リモートサーバでコマンドを実行します。
stdin, stdout, stderr = ssh.exec_command(f"{execute_command}")

# コマンドの出力を取得します。
output = stdout.read().decode("utf-8")

# コマンドの出力を表示します。
st.write(f"Execute Command : {execute_command}")
st.write(output)

# SSH接続を終了します。
ssh.close()


app.pyの全体的な流れは、必要パッケージをインポートし、サーバへの接続を準備し、サーバで使用するコマンドを限定し、サーバ接続時のコマンドを限定したコマンドリストから選択します。そして、サーバに接続し、コマンドを実行し、文字コードを変更して出力し、最後にSSH接続を終了します。

次に、キーペアをapp.pyと同一のフォルダ階層に配置します。


test-key.pemを配置


実行

自PCで下記を実行します。

python -m venv venv
venv\Scripts\Activate
pip install -r requirements.txt
python app.py


初期画面


使い方は、入力フォームに、サーバについて聞きたいことを書いてEnterキーをクリックします。他にも色々と聞いてみます。


cpuの状況を聞いてみました。


日本語で聞いても大丈夫です。


メモリの状態を聞いてみました。



誰がログインしているか聞いてみました。


unameにパラメータをつければもう少し詳しく聞けますね。


カレントディレクトリを教えてもらいました



所感

タイトルにも書いた通り、今このタイミングなら、世界を狙えるかなと思います。少なくとも、GitHubのTrendには入ることができるはずです(英語で書いてね)。今後の拡張方向性は、以下が考えられます。

  • syslog、messagesなどのファイルを見ることができるようにする。

  • syslog、messagesなどのエラーログを収集して、ChatGPTでエラーログを集約して解決方法を提示させるようにする。

  • 単体コマンドにオプションを付けることができるようにする。

  • 表示系だけではなく、システム変更もChatGPT経由で実装してみると面白くなります。

  • ApacheなどをChatGPT経由でインストールさせることも技術的には可能だと考えています。

  • 音声と入力を連携させることにより、音声操作でサーバ操作ができるようになります。

  • Linuxだけじゃなく、Windows Serverにも対応する。


この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?