世界を狙えるかも!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と同一のフォルダ階層に配置します。
実行
自PCで下記を実行します。
python -m venv venv
venv\Scripts\Activate
pip install -r requirements.txt
python app.py
使い方は、入力フォームに、サーバについて聞きたいことを書いてEnterキーをクリックします。他にも色々と聞いてみます。
所感
タイトルにも書いた通り、今このタイミングなら、世界を狙えるかなと思います。少なくとも、GitHubのTrendには入ることができるはずです(英語で書いてね)。今後の拡張方向性は、以下が考えられます。
syslog、messagesなどのファイルを見ることができるようにする。
syslog、messagesなどのエラーログを収集して、ChatGPTでエラーログを集約して解決方法を提示させるようにする。
単体コマンドにオプションを付けることができるようにする。
表示系だけではなく、システム変更もChatGPT経由で実装してみると面白くなります。
ApacheなどをChatGPT経由でインストールさせることも技術的には可能だと考えています。
音声と入力を連携させることにより、音声操作でサーバ操作ができるようになります。
Linuxだけじゃなく、Windows Serverにも対応する。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?